1 问题描述
高密度环境下的行人统计一直没有得到很好的解决,主要原因是对高密度人群中的行人检测和跟踪是一个很难的问题,如下图所示环境,存在的困难包括:
检测方面:
由于人群整体处于运动状态,占据了背景的60%以上的面积,导致许多目标检测的方法,如基于背景差的运动目标检测、分割方法难以奏效。另外,由于人群存在大量遮挡,导致基于行人轮廓的检测方法,如HOG也难以奏效。
跟踪方面:
高密度环境中的多目标跟踪,由于存在大量的遮挡、合并、分离,实现准确的跟踪是一个富有挑战性的研究问题。
本实验的目的是对高密度行进人群中的行人流量进行统计,并能够区分上行和下行。实验的基本思路是:
在一个行人头部大小的带状区域中进行头部检测(HaarLike Adaboost方法),然后利用一个滑动的跟踪门对检测的头部结果进行关联,同时利用运动历史图分析的方法估计行人轮廓的运动方向,最后对序列关联特征进行分析给出上下行的统计结果。
下面分三个部分:头部检测、方向分析、关联统计,对算法进行描述。
2 头部检测
如图所示复杂环境下,能够较好的在高密度人群中区分行人的特征只有头部。当摄像机架设一定高度时,行人头部遮挡较少,对检测和跟踪较有利。
头部检测优势在于:头部具有结构化的一些特征,相对于肤色、发色而言,受光线、噪声、阴影等影响较小。不足在于:头部的特征变化多样,不同的装束、肤色、方向都会有较大的差别。
我们采用了较为成熟的基于HaarLike特征的Adaboost分类器算法,对头部进行检测。
《AdaBoost头部分类器训练实验报告》一文中对算法基本原理,分类器样本的选择、处理和分类器的训练、测试进行了详细的描述,在这里不再赘述。只对实验中分类器的具体应用方法进行描述:
Step1: 分类器设置:载入分类器,实验中使用的分类器的原始尺寸为10*10。在检测过程中通过逐级放大分类器实现不同尺寸头部检测(检测头部尺寸范围为10*10-28*28)。
Step2:图像预处理:根据实际情况缩放图像(双线性差值)至合适大小,使图像中行人头部尺寸介于检测范围内(10*10-28*28)。并在图像中设置一高度为30(可以容纳1个头部高度),宽度为图像宽度的检测区域,将图像转换为灰度图像,此后所有操作均在此范围内进行,这样大大提高了检测算法的速度。如下图所示:
![高密度环境下行人统计实验报告 - 海水和火焰 - 视频监控 形态学 OpenCV](http://img9.ph.126.net/Z6_UKgePtHtiagUY7idYTw==/3072580845790729679.jpg)
Step3:头部检测:为了能够检测不同尺度的头部,将分类器以一定的比例(如1.1)逐级放大后遍历检测区域。例如要检测10*10至28*28尺寸范围内的头部,要将分类器(10*10)以1.1比例逐级放大12次,放大比例分别为:1.0 1.1 1.21 1.331 ……,然后用放大后的分类器以步长2在检测区域图像中遍历检测。输出头部的位置和矩形尺寸。
注:一般来说,真实的头部的检测结果会出现一个位置多个尺度矩形检测结果重叠的情况,如上图所示。在之前的实验中,将重叠矩形数量少于1的检测结果滤除,这样可以滤除一部分误检。但是,这样做的同时也会显著增大漏检。所以在本次实验中没有进行该步操作,使尽量完整的初期检测结果参与后期的判决。
3 方向分析
目标运动方向分析的一种最常用方法是光流法,光流法通过相邻两帧图像中光流近似目标的运动。光流法比较适于估计较短时间内的目标运动趋势(如相邻几帧),且光流法对图像噪声非常敏感,如下图,为实验中视频的两种光流的计算结果。
由于视频中环境复杂噪声大,且相邻两帧图像中目标的运动不规律,所以光流分析效果并不理想。
基于运动历史图的运动分析方法比较适于估计目标较长时间内的运动趋势。该方法累积目标在一段时间内的运动,通过计算时间域梯度估计目标的运动方向。
实验中算法如下:
Step1:计算检测区域的Sobel边缘图(Sobel算子简单,计算速度快),由于只考虑目标上下行的速度,所以只计算图像在垂直方向上的梯度,核如下:
![高密度环境下行人统计实验报告 - 海水和火焰 - 视频监控 形态学 OpenCV](http://img0.ph.126.net/K0ympJ6GwX3FJcrHg6ltKQ==/2818690416797717170.jpg)
4 关联与统计
由于行人头部目标在检测区域中的运动持续时间较短,位移较小,且较少发生遮挡,所以利用跟踪门进行目标的关联,实验中效果较好。
每个头部模型的特征描述为:{x, y, dx, dy, width, height, score, scoreperfrm , scoremax, frame, startfrm },解释如下:
特征参数 | 解释 | 更新条件 |
x | 中心x坐标 | 目标匹配时 |
y | 中心y坐标 | 目标匹配时 |
dx | x方向运动的累积量 | 目标匹配时 |
dy | y方向运动的累积量 | 目标匹配时 |
width | 矩形宽度 | 目标匹配时 |
height | 矩形高度 | 目标匹配时 |
score | 目标重复出现(匹配)的次数 | 目标匹配时,++ |
scoreperfrm | 每帧中目标重复出现(匹配)的次数 | 目标匹配时,++,每帧结束时清零 |
scoremax | 每帧中目标重复出现(匹配)次数的最大值 | 每帧结束时更新 |
frame | 目标上一次重复出现(匹配)的时刻(帧计数) | 每次匹配时 |
startfrm | 目标第一次出现的时刻(帧计数) | 目标出现时 |
其中,目标匹配的条件为:头部检测结果rect的中心落在模型中心的跟踪门内。跟踪门根据检测区域、头部大小以及运动速度进行设置,实验中设为10,即是以模型中心为中心的20*20的一个矩形跟踪门。
Step1:目标模型初始化
当前头部检测结果rect没有发现与之匹配的模型时,增加一个新的模型,x,y设置为当前rect中心,dx为cos(orient/180*PI),dy为sin(orient/180*PI),width, height与rect宽高相同,score为0,scoreperfrm为0,frame和startfrm为当前帧编号F。其中orient为方向分析中头部的运动方向(0-360)。
Step2:目标模型的更新
当头部检测结果rect与已有模型匹配时,采用滑动平均的方法对目标模型的x,y,width,height分别以速率alpha1,alpha2进行更新。若当前检测rect的中心为rx,与之匹配的目标模型中心为x,则模型参数x更新为:
x=x*(1-alpha1)+rx*alpha1
其他参数的更新类似。
学习速率alpha1,alpha2变化范围在为0.-1.0之间,值越大,模型参数更新越快,实验中分别设置为0.95,0.35,目的是使位置更新较快,而宽高更新较慢。
每当模型成功匹配一次,score=score+1,scoreperfrm=scoreperfrm+1, frame更新为当前帧编号F,dx=dx+cos(orient/180*PI), dy=dy+ sin(orient/180*PI)。
当每一帧的检测结果更新结束后,令scoremax=max(scoremax, scoreperfrm),即scoremax记录该目标在每帧中检测结果匹配次数的最大值。
Step3:行人的统计
当每一帧检测的目标模型的匹配更新结束后,遍历所有目标模型,进行行人统计和上下行判决。
基本思想:真实的目标模型一般存在时间(帧数)较长,存在期间匹配次数较多,且在单帧中匹配次数的最大值较大。所以可以根据目标模型存在的帧数、重复出现(匹配)的次数、匹配次数的均值、以及单帧中匹配次数最大值,判定是真实目标还是噪声。同时,多数噪声目标不存在运动,可以通过运动方向滤除一部分噪声。
当模型有较长时间没有被匹配时,我们认为该目标已离开检测区域。根据模型中的frame值和当前帧F的差值可以判决目标是否已经消失或离开检测区域。
行人判决准则为:
行人:F-frame> BAD_FRAME且score>GOOD_SCORE
且score / (frame - startfrm +1) > GOOD_SCORE_RATIO
且|dy|/( frame - startfrm+1) > GOOD_DIR_AVER
且scoremax >= GOOD_SCORE_MAX
行人方向:目标上下行判决:dy>0为下行, dy<0为上行。
实验中,BAD_FRAME为6,GOOD_SCORE为2,GOOD_SCORE_RATIO为0.7-0.9,GOOD_DIR_AVER为0.01,GOOD_SCORE_MAX为3。
注:GOOD_SCORE_RATIO 平均匹配率门限,通过调节该参数在一定程度上实现漏检和误检的均衡,当该参数增大时,误检率降低,漏检率升高,反则反之。该参数一定程度上可以根据实际视频中行人通过检测区域的速度设置,速度快,则小,反则反之。
5 实验
利用VC++6.0和Intel OpenCV1.1编写实验程序,分别对低密度和高密度行人视频进行行人统计。
实验1:VideoProcess(420 340).exe
实验视频:00011.AVI (400*304,时长6分45秒)
参数调整:
为了使头部尺寸在检测范围内(10-28),将图像放大至 420*340
GOOD_SCORE_RATIO 0.7
实验结果:
实际通过检测区域行人(头部)共计110人次(人工统计结果),算法检测结果为109人次。
其中 漏检8人次,漏检率7.3%
误检7人次,误检率6.4%
在检测正确的行人103人次中,行人运动方向计算错误1次。
分析:
漏检主要原因:1 打伞 2 骑车速度过快 3 头顶头发花白(老太太)4 戴白色帽子 5 受车辆通过时阴影遮挡
误检主要原因:衣服某些区域被误检为头部。
方向计算错误的原因:行人骑车速度过快。
检测速度:每帧约耗时26-27ms,CPU占用率50%。 (Pentium Dual-Core T4400 2.2GHz)
实验2:VideoProcess(352 288).exe
实验视频:acvis09-5950.avi (640*480,时长47秒)
参数调整:
为了使头部尺寸在检测范围内(10-28),将图像放大至 420*340
GOOD_SCORE_RATIO 0.9
实验结果:
实际通过检测区域行人(头部)共计61人次(人工统计结果),算法检测结果为73人次。
其中 漏检6人次,漏检率9.8%
6 结论
该行人统计方法柔性较好,针对不同的应用场景参数调整较少。实时性好,在普通PC上能够实现30FPS的检测速度。统计准确率较高,当行人密度低时能达到90%以上的准确率,当行人密度高时能达到70%以上的准确率。初步达到了实际应用需求。