计算机应用   2017, Vol. 37 Issue (1): 145-152  DOI: 10.11772/j.issn.1001-9081.2017.01.0145
0

引用本文 

姬丽娜, 陈庆奎, 陈圆金, 赵德玉, 方玉玲, 赵永涛. 基于GPU的视频流人群实时计数[J]. 计算机应用, 2017, 37(1): 145-152.DOI: 10.11772/j.issn.1001-9081.2017.01.0145.
JI Lina, CHEN Qingkui, CHEN Yuanjing, ZHAO Deyu, FANG Yuling, ZHAO Yongtao. Real-time crowd counting method from video stream based on GPU[J]. JOURNAL OF COMPUTER APPLICATIONS, 2017, 37(1): 145-152. DOI: 10.11772/j.issn.1001-9081.2017.01.0145.

基金项目

国家自然科学基金资助项目(61572325,60970012);高等学校博士学科点专项科研博导基金资助项目(20113120110008);上海重点科技攻关项目(14511107902);上海市工程中心建设项目(GCZX14014);上海市一流学科建设项目(XTKX2012);沪江基金研究基地专项(C14001)。

通信作者

姬丽娜(1990-),女,河南信阳人,硕士研究生,主要研究方向:计算机图形图像处理、并行计算、模式识别. E-mail:coldpoint@sina.cn.

作者简介

陈庆奎(1966-),男,上海人,教授,博士生导师,博士,CCF会员,主要研究方向:网络计算、并行计算、物联网;
陈圆金(1991-),男,河南信阳人,硕士研究生,主要研究方向:单光子探测器;
赵德玉(1978-),男,山东临沂人,博士研究生,主要研究方向:高性能计算、GPU架构、CPU-GPU异构集群调度;
方玉玲(1990-),女,河南信阳人,博士研究生,主要研究方向:高性能计算、GPU架构、CPU-GPU异构集群调度;
赵永涛(1991-),男,河北邯郸人,硕士研究生,主要研究方向:模式识别、并行计算

文章历史

收稿日期:2016-07-30
修回日期:2016-08-08
基于GPU的视频流人群实时计数
姬丽娜1, 陈庆奎1,2, 陈圆金1, 赵德玉2, 方玉玲2, 赵永涛1    
1. 上海理工大学 光电信息与计算机工程学院, 上海 200093 ;
2. 上海理工大学 管理学院, 上海 200093
摘要: 为了解决人群遮挡严重、光照突变等恶劣环境下人群计数准确率低的问题,提出基于混合高斯模型(GMM)和尺度不变特征变换(SIFT)特征的人群数量统计分析新方法。首先,基于GMM提取运动人群,并采用灰度共生矩阵(GLCM)和形态学方法去除背景中移动的小物体和较密集的噪声等非人群前景,针对GMM算法提出了一种效率较高的并行模型;接着,检测运动人群的SIFT特征点作为人群统计的基础,基于二值图像的特征提取大大减少了执行时间;最后,提出基于人群特征数和人群数量进行统计分析的新方法,选择不同等级的人群数量的数据集分别进行训练,统计得出平均单个特征点数,并对不同密度的行人进行计数实验。算法采用基于GPU多流处理器进行加速,并针对所提算法在统一计算设备架构(CUDA)流上任务的有效调度的方法进行分析。实验结果显示,相比单流提速31.5%,相比CPU提速71.8%。
关键词: 视频监控    GPU并行计算    人群计数    尺度不变特征变换    混合高斯模型    统一计算设备架构    
Real-time crowd counting method from video stream based on GPU
JI Lina1, CHEN Qingkui1,2, CHEN Yuanjing1, ZHAO Deyu2, FANG Yuling2, ZHAO Yongtao1     
1. College of Optical-Electrical and Computer Engineering, University of Shanghai Science and Technology, Shanghai 200093, China ;
2. College of Business, University of Shanghai Science and Technology, Shanghai 200093, China
Abstract: Focusing on low counting accuracy caused by serious occlusions and abrupt illumination variations, a new real-time statistical method based on Gaussian Mixture Model (GMM) and Scale-Invariant Feature Transform (SIFT) features for video crowd counting was proposed. Firstly, the moving crowd were detected by using GMM-based motion segment method, and then the Gray Level Co Occurrence Matrix (GLCM) and morphological operations were applied to remove small moving objects of background and the dense noise in non-crowd foreground. Considering the high time-complexity of GMM algorithm, a novel parallel model with higher efficiency was proposed. Secondly, the SIFT feature points were acted as the basis of crowd statistics, and the execution time was reduced by using feature exaction based on binary image. Finally, a novel statistical analysis method based on crowd features and crowd number was proposed. The data sets with different level of crowd number were chosen to train and get the average feature number of a single person, and the pedestrians with different densities were counted in the experiment. The algorithm was accelerated by using multi-stream processors on Graphics Processing Unit (GPU) and the analysis about efficiently scheduling the tasks on Compute Unified Device Architecture (CUDA) streams in practical applications was conducted. The experimental results indicate that the speed is increased by 31.5% compared with single stream, by 71.8% compared with CPU.
Key words: video surveillance    Graphics Processing Unit (GPU) parallel computing    crowd counting    Scale-Invariant Feature Transform (SIFT)    Gaussian Mixture Model (GMM)    Compute Unified Device Architecture (CUDA)    
0 引言

视频监控领域中人群数目统计一直是视频监控领域的研究热点,在实际场景有着非常广泛的应用,比如通过分析人数用动态控制交通信号灯来优化管理行人流量、控制地铁站入口处的乘客流量、旅游景点客流量统计、公共安全监控等。人群统计的方法一般有直接统计和间接统计:直接统计法比如通过分类器等聚类算法首先对视频图像进行分割,把行人分割成单独的个体[1-3];间接统计法比如机器学习算法、统计分析法[4-6]。然而在实际应用中人群统计面临着诸多挑战:首先最常见的遮挡问题使算法无法精确地分割出每个人,光照突变常常导致背景分割和连通体检测很大的误检率,算法要想在视频中分割每个个体并进行计数是非常困难的,本文选择间接统计法,把视频中的人群和人群特征视为一个整体,从宏观的视角去分析这些人群的特征和人群个数的关系相对来说更加合理。此外视频监控的实时性在实际应用中也有很大的需求。综上所述要精确并实时地统计人群数目,本文选择间接统计法和基于GPU(Graphics Processing Unit)的算法并行加速。

为了提高人流分析的效率和准确度,本文提出了新的解决方法,具体包括以下几个方面:

1) 针对高斯混合模型(Gaussian Mixture Model,GMM)算法特点,提出一种并行模型,减少内存复制操作从而减少算法执行时间,并与另外一种模型进行比较分析。

2) 比较统一计算设备架构(Compute Unified Device Architecture,CUDA)多流处理器和单流处理器的异同,对多流处理器上任务的调度进行分析和实验对比。

3) 在运动向量生成阶段,本文选择基于混合高斯背景分割得到的二值图像进行尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)提取。这样做的原因是虽然基于摄像头的背景分割效果并不非常理想,但是因为本文后面的分析是采取统计分析的方法,不需要过于在乎背景分割的人群轮廓等信息,而是从宏观上考虑整个人群的总体特征。另一方面,SIFT算法对光照、旋转、尺度变换等都有很强的鲁棒性,但是算法复杂度高,执行时间长,而本文采取基于二值图像的特征提取大幅减少了算法执行时间,提高了执行效率。该方法为人群统计的探索开拓了一个新视角。

4) 在人群个数统计过程中,本文的算法受Albiol等[4]的启发,采取根据特征点个数Nc和单个人的特征点个数N1之间的简单映射关系,得到当前视频帧的人群个数,然而不同的是,Albiol等的算法对N1的估算上只提取一帧图像来估计平均值,这种方法虽然在PETS2009数据集上表现出色,但是本文在实验过程发现这种做法对其他场景并不适用,本文将采取对N1新的训练方法,即采取不同等级的数据对N1进行训练,提高了检测精度,本文用这种训练方法在多处场景的各种条件下进行实验,均表现良好。

此外需要说明的是本文应用场景为:固定摄像头下的行人统计,并且摄像头视角中的人群不是由远至近或由近至远,而是垂直视角,摄像头中的行人在人眼中的大小是基本相同或者有非常小的尺度变换;因此本文对场景作以下合理假设:假设行人在摄像头范围内各个位置的平均特征点数量基本相等。接下来本文将分别阐述人流分析的相关工作,进行算法分析,展示实验结果并进行对比分析,最后进行总结。

1 相关工作

目前人群统计方面的研究基本从两个不同的视角分析:一种是直接检测;另一种是间接检测。前者是基于目标检测的人群密度估计算法,这种模式识别的方法在行人遮挡严重的情况下进行分割非常艰难。间接检测法包括最早被采用的人群密度特征即基于像素统计的方法和基于纹理分析的人群密度估计方法。近年来,很多学者都致力于研究间接检测的方法,这种方法不需要分别检测和识别每个人,而是提取整个视频中的动态特征向量,并根据特征点数量和人群数目的映射关系来统计人数。

事实上想要准确地把每个人都单独分割出来本身就是一项非常具有挑战的任务,算法通常都会受到光照、环境变化的影响,甚至在遮挡非常严重的情况下,这项工作根本难以进行。相对而言,间接检测的方法更加稳定,鲁棒性更强,因为这种方法基于相对更容易检测的特征点进行分析。这种方法简单易实现,在很多场景中无论是在精度还是效果上都表现出色。由Albiol等在2009年提出的统计分析法的人群计数和事件检测在PET2009数据集上表现出色,到目前为止,有很多学者对此陆续做出了大量的改进工作,以解决伪静态点被忽略[7]、角点检测算法鲁棒性不够强[8]、角点数和人数的映射关系[9]、视角变换和密度影响[10]等问题。Hou等则通过背景差分法提取动态人群,接着基于EM(Expectation Maximization)算法和新的聚类模型定位每个人,最后根据位置、特征等信息计算人群个数,该方法把前景像素点个数和人群个数视为线性关系[11-12]。上述的改善工作中由于使用过于复杂的模型,虽然对效果有一定的改善,但是花费过度的资源和时间去改善的效率可能并不是很高,尤其是视频图像处理中,速度和精度也同样重要。因此本文将对Albiol等的方法中参数N1的训练阶段作一定改进,得到更合理的参数,在提升精度的同时并不会增加执行时间的开销。在此基础上,本文将基于目标检测和基于特征分析的方法结合,通过改善基于高斯混合模型(GMM)的背景分割法和基于二值图像的SIFT特征基础上进行人群的统计分析。由于是基于运动人群,而不是基于模式识别等方式,因此本文方法同样非常适合分辨率非常低的视频图像。

2 算法分析

本章将详细阐述本文提出的方法。由于是基于摄像头的视频图像分析,因此本文将首先进行摄像头视角调整,调整原则为:由于人的视觉特点是近大远小,如果摄像头位置过低则可能造成行人在摄像头视角内在最远处和最近处的大小差距太大:如果摄像头位置过高可能读取的行人会很小,特征也会过少。

本文经过矫正的两个实验场景中摄像头合适位置如图 1所示。

图 1 摄像头矫正图示 Figure 1 Diagram of camera correction

下面分别对背景分割、特征提取和人数统计进行讨论。

2.1 流加速的背景分割

前景分割方法有很多[13],考虑到算法复杂度和抗干扰度等方面的因素,本文采取为图像每个像素建立自适应的高斯混合模型进行背景分割。首先进行按照式(1) 进行多个高斯分布加权建模,并采取自学习方式进行背景更新,更新模型方法如式(2) ~(4) 。由于后续的特征分析是基于提取的前景图像,因此前景的提取效果至关重要,但是需要注意的是,这里的提取效果并不是指传统意义上为了进行连通体个数统计而要求运动前景必须能够单独分离每个个体,不能容忍任何噪声和前景被分裂等现象,前文已经讨论过,要达到这种效果由于受到各种复杂条件的干扰本身就很难实现。本文算法是基于特征统计,对行人的前景轮廓不做作殊要求,但是如果场景中大面积都是运动的背景,是不可行的,因此需要对场景中的干扰进行优化。针对背景中大量细小的噪点,本文将对提取的运动人群进行形态学处理。另外场景中可能存在小幅度往复运动的物体如摇晃的树叶、飘摇的广告横幅等,本文采取基于灰度共生矩阵(Gray Level Co-occurrence Matrix,GLCM)提取出来的纹理特征来去除干扰,这些特征具有很强的抗光照突变特征和局部序列性,具体方法之前已有研究[14],在此不再赘述。

此外,为了提高视频处理的速度,本文采取基于GPU/CPU协同计算的方法,在CPU上处理逻辑性比较强的任务,由于本文中前景提取算法在图像像素之间没有任何关联性,每个像素进行单独计算,非常适合在GPU上并行计算。如果使用默认的单流进行计算,每帧图像都要进行HOST和GPU的之间数据传入传出,内存复制的时间太长,这会大大减弱使用GPU进行并行加速的时间优势,因此选择申请多个CUDA流来处理数据,分配两组相同的GPU缓冲区,这样每个流分别单独在输入数据块上执行工作,利用多流的重叠功能隐藏传输时间。改进单流程序的思想很简单,包括“分块”计算以及内存复制和核函数执行的重叠。比如,第0个流将核函数计算结果传出到HOST端的同时,第1个流将开始执行核函数。紧接着,第1个流将计算结果传出到HOST端,同时第0个流可以开始在下一块数据上执行核函数。如果内存传输操作和核函数执行时间大致相同。在任何执行内存复制和核函数的执行相互重叠的设备上,当使用多个流时,程序的整体性能都会提升。每个流中为每个像素分配一个线程,假设图像的宽和高分别为W、H,那么在GPU上申请大小为W×H×sizeof(unsigned char)的缓存空间,并申请W×H个线程,线程块大小为8×8。

$\eta ({{I}_{xy,t}},{{u}_{xy,t}},{{\sigma }_{xy,t}})=\frac{1}{\sqrt{2\pi }{{\sigma }_{xy,t}}}\cdot {{e}^{-\frac{{{({{I}_{xy,t}}-{{u}_{xy,t}})}^{2}}}{2{{\sigma }_{xy,t}}^{2}}}}$ (1)
${{\omega }_{xy,i,t}}=(1-\alpha ){{\omega }_{xy,i,t-1}}+\alpha $ (2)
${{\mu }_{xy,i,t}}=(1-\rho ){{\mu }_{xy,i,t-1}}+\rho {{I}_{xy,t}}$ (3)
${{\sigma }_{xy,i,t}}=(1-\rho )\sum\limits_{xy,i,t-1}{+\rho ({{I}_{xy,t}}-{{\mu }_{xy,i,t}}){{({{I}_{xy,t}}-{{\mu }_{xy,i,t}})}^{T}}}$ (4)

其中:η(Ixy,txy,txy,t)表高斯分布,ωxy,i,t是t时刻坐标为(x,y)像素点第i个高斯分布的权重,μxy,i,t表均值,σxy,i,t表方差,Ixy,t是像素值,ρ是第二学习率,α是第一学习率。

需要注意的是,虽然从逻辑上来看,不同的流之间是相互独立的,但事实上GPU的队列机制并非如此,因为硬件中并没有流的概念,而是包含一个或多个引擎来执行内存复制操作,另一个引擎来执行核函数,这些引擎彼此独立地对操作进行排队[15]。如图 2中所示,第0个流对A的内存复制需要在对B的内存复制之前完成,而对B的复制又要在核函数A启动之前完成。而在硬件中这些依赖性将丢失,因此在使用流时必须要注意到硬件的工作方式和CUDA流编程模型的方式是不同的,将操作放入流中队列的顺序将影响着CUDA驱动程序调度这些操作以及执行的方式。为了确保相互独立的流能够真正地并行执行,需要合理调度流,从而高效使用多个CUDA流。如果同时调度某个流的所有操作,那么很容易无意中阻塞另一个流的内存拷贝或者核函数执行,因此在将操作放入流的队列时应采用宽度优先方式,而非深度优先方式。如果内存复制操作时间与核函数执行时间大致相当,那么真正的执行时间将如图 3所示。箭头表示引擎间的依赖性,可以看到在新的调度顺序中,这些依赖性仍能得到满足。

图 2 程序在使用两个不同流时的执行时间段 Figure 2 Execution time period of program of using two CUDA streams

注:为了图示的简单明了,图 2图 3的流均使用2个CUDA流作为示例,多个流执行同理。

图 3 改进后流队列执行顺序 Figure 3 Improved stream queue execution order

前景分割具体执行过程如算法1所示,需要注意的是,由于需要为每个像素建立多个高斯模型,并且除了第一帧外,每一帧图像在模型更新结束后都需要前一帧图像的模型信息,因此选择直接在GPU上申请大小为W×H×sizeof(model)的内存空间,并且为此GPU设备端的模型申请为全局变量,这样不必每次在使用上一帧图模型信息时,进行耗费时间的设备端和主机端传输工作,这样的做法相比一开始就在CPU端为模型申请内存空间再传入设备端的做法大大提高了算法执行速度。从图 4~5可知,这种方法减少了每帧两次的内存复制操作,而在视频图像处理过程中,内存复制操作相对来说是相当耗时的,这也通常被视为是性能的瓶颈之一。

图 4 GMM更新在CPU/GPU端的并行模型 Figure 4 Parallel model of GMM updating by CPU/GPU
图 5 改进后的GMM并行模型 Figure 5 Improved GMM parallel model

 算法1 运动目标检测。

 输入: frame,width,height,Idx,Idy。

 输出: foreground image。

 函数 foreGroundDetector ()

 gmm_model *dd_gmmmodel; //申请全局变量,在GPU端建立混合高斯模型

 cudaMalloc((void**) & dd_gmmmodel,WIDTHSIZE*

 HEIGHTSIZE*sizeof(gmm_model));//为模型分配空间

 cudaMemset(dd_gmmmodel,0,WIDTHSIZE*HEIGHTSIZE*

 sizeof(gmm_model));//初始化模型

 WHILE(true)//开始混合视频帧循环

 IF Idx>0 & & Idx<width & & Idy>0 & & Idy<height THEN

 创建stream0和stream1;

 在stream0和stream1上基于加权平均法的灰度化处理

 在stream0和stream1上基于加权均值模糊法平滑处理

 在stream0和stream1上用C_NMIXTURES=3初始化模型;

 在stream0和stream1用速度ALPHAT=0.03更新模型

 在stream0和stream1分别用3×3和3×7的模板进行腐蚀和膨胀处理;

 cuda Stream Synchronize(stream0) ;//流同步

 cuda Stream Synchronize(stream1) ;//流同步

 输出得到二值前景图像

 END IF

 END WHILE

 RETURN;

 END 函数

2.2 检测运动人群特征点

本文对场景作以下合理的假设:场景中运动的大面积对象是行人,这与其他人流统计分析要求相同。假设场景中大面积的运动对象不是人群,而是车流、摇晃的树等,本文方法不适用。

通过2.1节的讨论已经得到场景中人群的运动前景,想要通过这些前景直接进行人群统计比如通过连通体计数等方法,这在高密度的人群中并不容易甚至根本无法执行,因为严重的遮挡问题、室外不稳定的光照问题等,会使得一个人被分裂为多个前景块(可能被计数多次)、一群人由于挤在一起可能被提取为一个前景块(可能只被计数一次)。因此,本文采取间接计数的方式,从整幅图像的所有特征点出发进行分析。

关于特征点检测方法,Albiol等[4]采取Harris算法实现对分析图像的特征点检测,Harris等[16]指出了采用Harris算法对特征点检测的不足,相对于Harris算法[17],SIFT算法检测的特征点在具有对平移、旋转、噪声的不变性的同时,对尺度缩放、亮度变化和局部遮挡也不敏感,并且对视角变化、仿射变换也保持一定的稳定性,因此SIFT算法检测的特征点相对来稳定性更强,因此本文在运动人群的特征点检测上采用SIFT算法。它在尺度空间中寻找极值点,并提取其位置、尺度、旋转不变量,是一种局部特征描述子,具有独特性、多量性和可扩展性等特点。算法2为基于SIFT的二值图像特征点检测过程。其中GaussianPyramid()、DogPyramid()分别通过(5) ~(7) 建立高斯和差分金字塔,结果如图 6图 7所示,其中DoG(Difference of Gaussian)为高斯差分滤。

$G(x,y)=\frac{1}{2\pi {{\sigma }^{2}}}{{e}^{-\frac{{{(x-m/2)}^{2}}+{{(y-n/2)}^{2}}}{2{{\sigma }^{2}}}}}$ (5)
$L(x,y,\sigma )=G(x,y,\sigma )*I(x,y)$ (6)
$D(x,y\sigma )=G(x,y,k\sigma )-G(x,y,\sigma )$ (7)
图 6 通过高斯滤波处理得到的部分高斯金字塔结果(k=21/3) Figure 6 Partial results of Gaussian pyramid via Gaussian blur processing (k=21/3)
图 7 通过差分滤波处理得到的部分差分金字塔结果(k=21/3) Figure 7 Partial result of DoG pyramid resulting from DoG filter (k=21/3)

L(x,y,σ)是高斯滤波函数,其中G(x,y)是图像像素(x,y)处的高斯分布函数,(m,n)是平滑模板,σ是高斯分布标准差,初始值为1.6,D(x,y,σ)表差分滤波函数。DetectionLocalExtrama()通过子像素插值法求局部极值点,如图 8左中圆点所示,OrientationAssignment()为关键点分配主方向从而实现图像旋转不变性,如图 8右箭头所示。实验发现在该场景中检测到的SIFT特征点数量高达350个左右,这样的计算量是相当巨大的,而其中大部分特征点都是背景产生的,图 9所示是在2.1节中方法进行背景分割之后再进行特征点检测,并且是本文最关心的行人的特征点,在该图中虽然图中的人只是微小的运动,前景块也很小,但是特征点数量仍然能够达到15个,这就为后续方法在大大减少计算量的同时仍能保证后续计数的稳定性和准确性。

图 8 局部极值点检测和方向分配结果(351个特征点) Figure 8 Local extreme points detection and direction distribution results (351 feature points)
图 9 基于二值图像的SIFT特征点检测结果(15个特征点) Figure 9 Detection results of SIFT features based on binary image (15 feature points)

图 9所示为对某场景摄像头数据分别通过2.1节方法进行运动前景提取并采用SIFT算法进行特征点检测的效果,图 9中的圆点为所标记的SIFT特征点,白色区域为运动前景点。

 算法2 特征检测。

 输入: foreground image,sigma,width,height,Idx,Idy。

 输出: features。

 函数 ScaleInvarFeatureTransform ()

 IF Idx>0 & & Idx<width & & Idy>0 & & Idy<height THEN

 CreateInitSmoothGray(src,init_gray,sigma=1.6) ;//图像预处理:先将原图灰度化,再扩大一倍后,用高斯模糊平滑

 octaves=lb ((double)min(width*2,height*2) )-2;//计算组数,其中2是0~lb (min(width*2,height*2) )的经验值

 GaussianPyramid(init_gray,gauss_pyr,octaves,

 intervals=3,sigma);//高斯金字塔建立

 DogPyramid(gauss_pyr,dog_pyr,octaves,intervals);//差分金字塔建立

 DetectionLocalExtrema(dog_pyr,extrema,octaves,intervals);//局部极值检测

 OrientationAssignment(extrema,features,gauss_pyr);//方向分配

 DescriptorRepresentation(features,gauss_pyr,BINS=8,

 WindowWidth=4) ;//特征描述子

 END IF

 RETURN;

 END 函数

2.3 人群个数统计

通过前面的讨论可以知道当前视频中区域特征点数量Nc会保持在一定范围内浮动,受Albiol等[4]的启发,本文通过统计学分析,对Nc以及当前场景中每个人平均所包含的特征点数量N1进行分析,然而Albiol等[4]的方法在本场景中存在以下问题:Albiol等[4]简单地计算仅仅一帧视频中N1的值,那么这样会使N1的值有很大的偶然性,同一个场景同一个视角中可能得出的N1的值相差非常大。然而事实上本文方法中对具体某场景的假设是行人在摄像头范围内各个位置的平均特征点数量基本相等,这和假设是相悖的,在实际应用中N1对这重要的一帧选择的依赖性相当大,如果选择不合适那么很可能直接导致检测结果误差非常大。

因此本文通过一定的先验校正和训练的方法获取人群数量。由于N1关系到最终的计数精确度,因此N1的选取至关重要。为了研究场景中每个人平均所包含的特征点数目N1,本文提出改善方法:通过输出该场景几十帧特殊的图像的特征点数量Nc和该场景中的人群数量Np来进行一定的训练,从而得出N1的最终值。首先选择场景中无遮挡密度小即只有一个人的视频帧输出其特征点数目Nc和Np,接着选择场景中有有遮挡即密度较大视频帧,最后选择场景中有遮挡严重的高密度人群的视频帧,那么由Nc/Np=N1计算出每帧情况下的N1,如图 10(a)~(c)所示。可知N1的平均值,即对于该场景来说每人所包含的特征点个数平均为N1个。需要注意的是Np由手动测量所得,目的就是为了校正N1,但是本文的训练数据集不多,只是人为地选择一些特殊的帧,以便于校正N1,人群计数的具体执行步骤如算法3所示,最终人群数量Np的统计方法即可按照式(8) 得到:

$Np=Nc/N1$ (8)
图 10 不同人群密度情况下特征点数量统计结果 Figure 10 Statistical number of feature points with different crowd density

 算法3 人群数量统计。

 输入: features,width,height,Idx,Idy。

 输出: 人群数量Np

 函数 peopleCounting()

 IF Idx>0 & & Idx<width & & Idy>0 & & Idy<height THEN

 特征点数量Nc=features.size();

 BEGIN 训练数据

 1) 通过统计分析十几帧只有一个行人的图像特征点数量,计算得到平均每个人所占的特征点数量N11

 2) 通过统计分析十几帧只有5~8个行人的图像特征点数量,计算得到平均每个人所占的特征点数量N12

 3) 通过统计分析十几帧有几十个行人的图像特征点数量,计算得到平均每个人所占的特征点数量N13

 4) 通过N11,N12,N13线性分析计算得到每个人所占的特征点数量N1

 END BEGIN

 Np=(Nc<10) ?0:(Nc>10 & & Nc<N1)?1:Nc/N1;

 END IF

 RETURN;

 END 函数

3 实验结果与分析

本文所做实验均是基于Nvidia独立显卡的测试环境,本文采用2核Intel Core 2E8400 CPU,内存4 GB,主频3.0 GHz,显卡采用Nvidia GTX 670独立显卡,系统类型为Windows 7 64位操作系统。编程平台为Visual Studio 2010,OpenCV 2.4.8 ,开发环境为C/C++/CUDA。下面将分别从执行时间、GPU资源使用和视频处理运行效果等几个方面进行实验展示和分析。

3.1 算法执行时间分析

针对2.1节中提到的GMM的CUDA执行架构模型的改进和本文中算法流多处理器的使用方法分析,下面将给出实验对比分析:分别给出本文算法在单流、多流情况下的对比如图 11所示,GMM算法在使用改进模型前后的对比如图 12所示,本文算法在CPU和改进后GPU端的执行时间如图 13所示。

图 11 本文算法多流和单流执行时间对比 Figure 11 Comparison of execution time on single-stream and multi-stream
图 12 基于改进模型和未改进GMM算法执行时间对比 Figure 12 Comparison of execution time of original and improved model GMM algorithm
图 13 本文算法在CPU和GPU上执行时间 Figure 13 Execution time of the proposed algorithm on GPU and CPU

图 11中显示使用多流比单流执行速度要快,并且随着图像分辨率的增加也即计算任务的增多,多流的优势也越来越明显。当前实验数据中,基于多个CUDA流比单个CUDA流执行速度平均快31.5%,最快可达35.8%。但是需要注意的是分辨率为320×240的图像使用多流执行时间却比单流执行速度慢,而随着分辨率的增加多流逐渐比单流速度快很多。

这是由于多流的使用需要创建流、启动流和多个流之间同步等待等操作,本身也需要耗费一定的时间,因此对于计算量较小的任务来说可能使用多流比使用单流反而慢,如果开启更多的流那么开启流和多个流同步时间可能更长,这说明并不是开启越多的流执行速度就会越快,而是要根据任务的计算量来判断,当然计算量较大的算法可以开启较多的流,计算量较小的可以只开启两个流或者使用单流。

图 12中可以看出,GMM算法的GPU加速过程中使用本文提出的架构执行速度明显提高,平均提速51.3%,最快可提高62%。从图 13可以看出本文算法在GPU上执行时间比CPU上执行速度提高52.2%~78.6%,平均提速71.8%。

3.2 GPU资源使用分析

本文实验所用的独立显卡NVIDIA GeForce GTX 670,多流处理器数量为20个,位宽256 bit,带宽224.4 GB/s,显存类型GDDR5(Hynix),GPU默认时钟频率1.27 GHz,显存默认时钟频率1.71 GHz。

表 1中是在正常显示和开始运行本文程序时显卡各项参数的变化。

表 1 显卡各项资源使用对比 Table 1 Comparison of graphics card resource usage with and without running the proposed algorithm

通过表 1中的运行时参数变化,可以看到:GPU核心的频率在运行时由135 MHz变为912 MHz;GPU load表示GPU的占用量,正常显示时是1%甚至更低,运行时是19%,还是有提高的空间;Memory Used显存使用量由310 MB变为516 MB,大概要增加200 MB左右的动态显存,这是因为显存在内存上动态分配,运行时需要较多的显存空间,所以系统需要动态为显卡分配显存。

3.3 基于二值图像的特征提取和人群计数效果

本文分别在两个场景进行了实验测试。

图 14为上海理工大学计算中心612实验室的检测结果,其中:(a)展示了行人在距离摄像头最近和最远情况下,平均每个人特征个数基本保持不变;(b)为视频中行人被分裂为多块,完全无法进行单独个体的分割情况下并不影响本文算法的统计;(c)展示了人群遮挡较为严重并且光照变化比较强烈,得出的前景并不理想的情况下,本文算法的检测结果。

图 14 上海理工大学计算中心612实验室的检测结果 Figure 14 Detection results at Laboratory 612 of University of Shanghai Science and Technology (USST) computing center

图 15中是2016年4月8—10日,在第十三届上海教育博览会上作者展示本文算法中的人群计数结果图,视频中游览展会的行人时而驻足观看(几乎静止,二值图像特征很少的情况),时而缓慢步行,时而蜂拥而入,时而奔跑以及展会中的各种光线变化等条件,但是本文算法都表现出很好的稳定性和准确度,图 15中分别展示了这些条件下的展示结果。

图 15 2016第十三届上海教育博览会人群计数结果 Figure 15 Crowed counting at the 13th Shanghai Education Expo 2016

注:由于图 15是上海教育博览会展会现场的视频截图,图中左下角的数字和行人区域的箭头是与本文无关的数字,请读者忽略,窗口中左上角的数字字所在窗口只是为了向读者展示视频中的人数。

图 14图 15中可以看出即使每个行人的前景检测被分为多块甚至十几块,但是算法依然能很准确地统计出行人的数量,并且图 14~15展示不同程度的遮挡情况,意味着不同程度的人群密度,然而不论是场景中人群密度很低甚至只有一个人还是场景中人群密度很高遮挡很严重,本文方法依然能保持很好的稳定性和准确性。

实验说明本文算法在多种实际场景都有很强的适用性和稳定性。

4 结语

本文针对GMM算法并行化方案中每帧图像的K个模型在GPU内存上的频繁读写问题 、本文算法的GPU多流加速问题以及人群计数中的特征点和N1映射问题提出了相应的改善方案,实验结果表明本文方案有一定改良。

很多研究学者认为将前景检测直接运用于人群统计很困难,因为前景检测尤其是基于摄像头的前景检测由于受到视觉变换、摄像头校正等问题干扰使得人群分割很困难,因此本文从另外一个角度考虑,把所有前景区域看成一个整体,去检测其特征点,并根据特征点个数和人群个数的关系进行人群统计。实验证明这种方法效果较好,具有一定实用价值,并且本文经过GPU加速后由实验分析中的图 11可知完全可以做到摄像头实时检测。然而需要注意的是,这种方法也有一定的局限性,比如如果场景中存在一直静止的人,那么这些人将不会被统计到,这也是未来需要持续关注和亟待解决的问题。

参考文献
[1] ZENG C B, MA H D. Robust head-shoulder detection by PCA-based multilevel HOG-LBP detector for people counting[C]//ICPR 2010:Proceedings of the 201020th International Conference on Pattern Recognition. Piscataway, NJ:IEEE, 2010:2069-2072.
[2] DALAL N, TRIGGS B. Histograms of oriented gradients for human detection[C]//CVPR' 05:Proceedings of the 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. Washington, DC:IEEE Computer Society, 2005:886-893.
[3] LI M, ZHANG Z X, HUANG K Q, et al. Estimating the number of people in crowded scenes by MID based foreground segmentation and head-shoulder detection[C]//ICPR 2008:Proceedings of the 19th International Conference on Pattern Recognition. Piscataway, NJ:IEEE, 2008:1-4.
[4] ALBIOL A, SILLA M J, ALBIOL A, et al. Video analysis using corner motion statistics[C]//PETS 2009:Proceedings of the 2009 IEEE International Workshop on Performance Evaluation of Tracking and Surveillance. Washington, DC:IEEE Computer Society, 2009:31-38.
[5] CHAN A B, VASCONCELOS N. Counting people with low-level features and Bayesian regression[J]. IEEE Transactions on Image Processing, 2012, 21 (4) : 2160-2177. doi: 10.1109/TIP.2011.2172800
[6] KONG D, GRAY D, TAO H. A viewpoint invariant approach for crowd counting[C]//ICPR 2006:Proceedings of the 18th International Conference on Pattern Recognition. Piscataway, NJ:IEEE, 2006:1187-1190.
[7] CHI Y J, SUGIL C, SEUNG W H. A method for counting moving and stationary people by interest point classification[C]//ICIP 2013:Proceedings of the 2013 IEEE International Conference on Image Processing. Piscataway, NJ:IEEE, 2013:4545-4548.
[8] CONTE D, FOGGIA P, PERCANNELLA G, et al. Counting moving people in videos by salient points detection[C]//EUSIPCO 2012:Proceedings of the 20th International Conference on Pattern Recognition. Washington, DC:IEEE Computer Society, 2010:1743-1746.
[9] FRADI H, DUGELAY J L. People counting system in crowded scenes based on feature regression[C]//ICPR 2010:Proceedings of the 20th European Signal Processing Conference. Bucharest, Romania:[s.n.], 2012:136-140.
[10] CONTE D, FOGGIA P, PERCANNELLA G, et al. A method for counting people in crowded scenes[C]//AVSS 2010:Proceedings of the 2010 IEEE International Conference on Advanced Video and Signal Based Surveillance. Piscataway, NJ:IEEE, 2010:225-232.
[11] HOU Y L, PANG G K H. People counting and human detection in a challenging situation[J]. IEEE Transactions on Systems, Man, and Cybernetics, Part A:Systems and Humans, 2011, 41 (1) : 24-33. doi: 10.1109/TSMCA.2010.2064299
[12] HOU Y L, PANG G K H. Automated people counting at a mass site[C]//Proceedings of the 2008 IEEE International Conference on Automation and Logistics. Piscataway, NJ:IEEE, 2008:464-469.
[13] LI H, ACHIM A, BULL D R. GMM-based efficient foreground detection with adaptive region update[C]//ICIP 2009:Proceedings of the 16th IEEE International Conference on Image Processing. Piscataway, NJ:IEEE, 2009:3145-3148.
[14] 姬丽娜, 陈庆奎, 赵永涛, 等. 一种基于GLCM的运动目标检测新方法[J]. 太原理工大学学报, 2015, 46 (6) : 719-726. ( JI L N, CHEN Q K, ZHAO Y T, et al. A novel method of moving object detection based on GLCM[J]. Journal of Taiyuan University of Technology, 2015, 46 (6) : 719-726. )
[15] SANDERS J, KANDROT E. CUDA by Example:An Introduction to General-Purpose GPU Programming[M]. NIE X J, translated. Beijing: China Machine Press, 2011 : 1139 -151.
[16] HARRIS C, STEPHENS M. A combined corner and edge detector[C]//Proceedings of the 4th Alvey Vision Conference. Manchester:Alvey Vision Club, 1988:147-151.
[17] 梁荣华, 刘向东, 马祥音, 等. 基于SURF的高密度人群计数方法[J]. 计算机辅助设计与图形学学报, 2012, 24 (12) : 1568-1575. ( LIANG R H, LIU X D, MA X Y, et al. High-density crowd counting method based on SURF feature[J]. Journal of Computer-Aided Design & Computer Graphics, 2012, 24 (12) : 1568-1575. )