65.9K
CodeProject 正在变化。 阅读更多。
Home

GPU 上的扩展 GMM 用于背景减除

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (23投票s)

2011年1月6日

公共领域

10分钟阅读

viewsIcon

82706

downloadIcon

3159

用于背景减除的扩展高斯混合模型的 GPU 实现

引言

背景减除(BGS)是许多计算机视觉应用中的基本任务,它允许我们从视频的背景中分割出前景对象。在摄像机固定的“最简单”情况下,背景通常被定义为保持相对恒定的像素,而前景则是所有移动的其他内容。由于BGS通常用作预处理步骤,因此要求尽可能快。图1给出了我们实现的一些结果。

本文基本基于我们在2010年IEEE-RIVF会议上的发表物[1]。本文旨在为希望将该实现应用到其项目中的人员提供一个快速的“入门指南”。完整的源代码和示例项目也可以在Google Code上找到。

Some results on VSSN06 dataset

图1. VSSN06视频7的分割结果。左列是视频中的两帧,右列是分割结果。前景像素用白色标记。

背景

在现实场景中,视频会受到各种因素的影响:光照变化、背景中的移动物体、摄像机移动……为了考虑这些问题,社区已经开发了许多BGS方法,通常分为两类:参数模型非参数模型

Zivkovic和van der Heijden的扩展高斯混合模型(GMM)[2, 3]是一种用于BGS的参数化方法,其中他们为每个像素的颜色值维护一个高斯混合模型。对于每一新帧,混合模型中每个分量的均值和协方差都会更新,以反映像素值的变化(如果存在)。如果新值与混合模型“足够远”(例如,RGB值到分量均值的马氏距离大于标准差的三倍),则该像素将被视为前景。除了这个基本版本,Zivkovic和van der Heijden还使用了一些额外的控制参数并修改了模型更新方程,不仅减少了每帧的处理时间,还获得了更好的分割效果。详细信息和一些疯狂的数学可以在[2, 3]中找到。

尽管如此,我们观察到Zivkovic的CPU实现对于要求苛刻的现实应用仍然不够快,特别是当系统需要处理高分辨率视频片段时。此外,尽管摩尔定律可以在“不久的将来”解决性能问题,但将CPU的计算负担转移到GPU上进行GMM计算仍然值得尝试。因此,我们在CUDA上实现了该算法的GPU版本。实验表明,我们的GPU实现提供了平均11倍的加速。在大多数测试中,即使是在高清视频格式下,帧率也始终高于50帧/秒(FPS)。

Using the Code

首先,请确保您已安装并正确配置了CUDA和OpenCV的工作系统。Google Code上的示例项目包含了OpenCV 2.2的头文件和库。但是,您可以使用任何版本,源代码不要求特定版本。

要使用该代码,请将CvFastBgGMM.hCvFastBgGMM_ver4.cu添加到您的项目中。您也可以使用CvFastBgGMM_ver3.cuCvFastBgGMM_ver5.cu。版本是“优化级别”部分中描述的优化级别。根据我们的经验,版本4在大多数情况下都能获得最佳结果。

CvFastBgGMM.h中,您必须确保此行与您上面选择的版本匹配

// 3 or 5, depends on your .cu file.
#define CUDAGMM_VERSION 4 

最后,使用CvFastBgGMM 与OpenCV中的许多类几乎相同:创建数据结构,设置适当的参数,并调用一个函数来为每一新帧更新模型。

// in your .cpp file

#include "CvFastBgGMM.h"

// ...

// Some parameters for the algorithms
CvFastBgGMMParams* params = cvCreateFastBgGMMParams(FRAME_WIDTH, FRAME_HEIGHT);

// modify some parameters
params->fAlphaT = 0.008f;

// Create the data structure, using the parameters and the first frame
CvFastBgGMM* gmm = cvCreateFastBgGMM(params, videoFrame);

// For each new frame...
cvUpdateFastBgGMM(gmm, new_frame);
// or use the following function to get the processing time:
// float time = cvUpdateFastBgGMMTimer(gmm, new_frame);

// Finally, call cvReleaseFastBgGMM() to release the memory
cvReleaseFastBgGMM(&gmm);
delete params; 

CvFastBgGMM包含在从网络摄像头获取图像的标准循环中也非常直接

IplImage *videoFrame;
CvCapture *capturer;
CvFastBgGMMParams *params;
CvFastBgGMM *pGMM;
int key(0);

capturer = cvCaptureFromCAM(-1);
videoFrame = cvQueryFrame(capturer);
if (!videoFrame)
  exit(-1);

// create the data structure, set some parameters
params = cvCreateFastBgGMMParams(videoFrame->width, videoFrame->height);
params->fAlphaT = 0.005f;

pGMM = cvCreateFastBgGMM(params, videoFrame);
delete params;

cvNamedWindow("Original", 1);
cvNamedWindow("Subtracted", 1);

while(key != 'q')
{
  videoFrame = cvQueryFrame(capturer);
  if (!videoFrame)
    break;

  // call the GPU
  cvUpdateFastBgGMM(gmm, videoFrame);
  
  // show the original frame
  cvShowImage("Original", videoFrame);

  // the result is contained in pGMM->h_outputImg
  cvShowImage("Subtracted", pGMM->h_outputImg);

  key = cvWaitKey(10);
} 

// delete the data structures
cvReleaseFastBgGMM(&pGMM);

cvDestroyWindow("Original");
cvDestroyWindow("Subtracted");

基准测试

CPU和GPU实现均在来自VSSN 2006竞赛的数据集上执行,以比较鲁棒性,并在PETS2009数据集上评估加速效果。本节中的所有实验都在运行Core 2 Quad Q9400 2.6 GHz CPU(4 GB RAM)和GeForce 9600GT GPU的系统上进行。尽管CPU实现不是多线程的,但我们仍在四个核心上执行它以获得最佳性能。

在本节中,我将展示我们论文中给出的一些基准测试结果。有关详细的基准测试结果,请参阅论文。

优化级别和占用率

为了估计各种优化技术的有效性(这些技术在“优化级别”部分中进行了讨论),我们在VSSN2006和PETS2009数据集上以不同的优化级别运行了实现。结果如图2所示。在此图中,内核1是使用常量内存的GPU基本实现。内核2通过对4通道输入图像进行内存合并进行了更优化的处理。内核3使用了SoA模式、高斯参数的内存合并,以及在主机和设备之间传输数据时使用了固定内存。内核4是异步实现。您会注意到源包的版本是5,这是“模板”版本,但是我们发现模板并没有帮助提高性能,所以没有将其包含在此测试中。

optimization_fps.jpg

图2. 优化技术的有效性。

在VSSN 2006数据集上,内核4的性能优于其他所有内核,但在PETS2009上,它比内核3略慢。这可以大致解释为这两个数据集的帧大小差异:PETS2009具有768x576的序列,而VSSN2006包含较小的384x240视频序列。内核4中的异步实现需要更多时间来传输主机和设备之间的大量数据,导致帧率下降。尽管如此,我们更喜欢内核4,因为它在将CPU处理时间与GPU处理时间交织方面做得更好。在本节中,我们对所有剩余实验都使用了内核4。

在CUDA中,多处理器占用率是活跃warp数与GPU多处理器支持的最大warp数之比。它取决于每个块的线程数、每个线程的寄存器数、内核使用的每个块的共享内存容量以及设备的计算能力。我们的实现使用了每块128个线程,每个线程20个寄存器,每个块36字节共享内存。该实现是在支持计算能力1.1的GeForce 9600GT上执行的。因此,内核的占用率为0.5。此配置是通过实验确定的。当试图通过使用更少的每个线程寄存器和更多/更少的每个块线程来增加占用率时,我们注意到整体性能下降。

加速比

PETS2009用于测试GPU实现相对于各种帧分辨率的加速效果。我们通过下采样和上采样帧来获得11个不同分辨率的序列。在每个分辨率级别,我们同时运行两种实现,测量帧率和加速比。结果如图3所示。CPU实现对低分辨率序列表现良好,但对于大于640x480的序列,帧率低于30 fps,对于高清序列(1280x720、1920x1080、2560x1440),帧率低于10 fps。对于GPU版本,即使是高清序列,帧率也始终大于50 fps。

speedup.jpg

图3. CPU版本和GPU版本在不同分辨率下的帧率比较。绿色线表示加速比。每个序列的平均加速比约为11倍。(点击图片可查看详细视图)

优化级别

本节将提供一些“幕后”见解。如果您只想将此实现应用到您的项目中,可以忽略本节。

基本实现

基本GPU版本很容易开发,因为视频帧中的每个像素都是独立处理的。参加过并行计算课程的人都会意识到,这是典型的“embarrassing parallel”(令人尴尬的并行)情况。在GPU上,我们可以通过为每个像素分配一个线程来实现这一点。然而,GPU上的线程数量是有限的,而每帧的像素数量因视频而异。我们的实现通过自动选择每个线程适当的像素数量来解决这个问题。当新帧到达时,算法运行并更新背景模型。输出图像中的像素被分类为前景或背景,取决于它们的强度值。

这个基本实现仅比原始CPU实现对VGA(640x480)视频提供了3倍的加速。

内核1:固定(不可分页)内存和常量内存

固定内存位于主机存储器上,并且不受虚拟内存存储系统的分页限制。CUDA运行时提供了一些分配和释放固定主机内存的函数。使用固定内存有几个好处:

  • 内存传输可以与内核执行同时进行。
  • 使用固定内存时,主机内存和设备内存之间的传输带宽更高。

在我们的实现中,固定内存用于在主机和设备之间传输输入和输出图像数据。这不仅提高了内存吞吐量,还允许异步启动内核。

算法参数在执行期间不发生变化,因此我们将其存储在常量内存中。在CUDA中,对常量内存的访问会被缓存,并且非常高效。

内核2:内存合并

在CUDA中,当满足特定要求时,邻近线程执行的全局内存访问可以自动合并成尽可能少的事务。虽然较新版本的CUDA硬件无需任何要求即可实现内存合并。当应用程序需要在旧硬件上运行时,这些技术仍然有用。

内存合并应用于该算法的细节非常复杂,我无意在此详细介绍。我只想强调,内存合并对于提高我们算法的性能非常有帮助。对我而言,它是CUDA上最有用的技术之一。内存合并需要对CUDA的数据结构和内存组织有深入的理解,但尝试一下是值得的。

其他具体的优化技术已在论文中描述。

"许可证"(并非真正意义上的许可证)

以下条件源自Zivkovic的原始CPU实现:

不得为任何商业目的复制或复制本作品的全部或部分。允许免费复制全部或部分,前提是所有此类全部或部分复制均包含以下内容:
  • 本通知
  • 对作者和个人贡献的致谢
任何其他目的的复制、翻印或重印均需要许可证。在此情况下,请联系作者。所有代码均在无任何保证的情况下提供。

如果您在学术出版物中使用本项目,请引用我们的论文

历史

  • 2011年1月7日:文章提交

参考文献

  1. Vu Pham, Phong Vo, Hung Vu Thanh, Bac Le Hoai, "GPU Implementation of Extended Gaussian Mixture Model for Background Subtraction", IEEE-RIVF 2010 International Conference on Computing and Telecommunication Technologies, Vietnam National University, Nov. 01-04, 2010. DOI: 10.1109/RIVF.2010.5634007.
  2. Z.Zivkovic, "Improved adaptive Gausian mixture model for background subtraction", International Conference Pattern Recognition, Vol.2, pages: 28-31, 2004.
  3. Z.Zivkovic, F. van der Heijden, "Efficient adaptive density estimation per image pixel for the task of background subtraction", Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006.
© . All rights reserved.