行人检测与目标跟踪算法研究.docx
《行人检测与目标跟踪算法研究.docx》由会员分享,可在线阅读,更多相关《行人检测与目标跟踪算法研究.docx(15页珍藏版)》请在冰点文库上搜索。
行人检测与目标跟踪算法研究
基于opencv中光流法的运动
行人目标跟踪与检测
一、课题研究背景及方法
行人检测具有极其广泛的应用:
智能辅助驾驶,智能监控,行人分析以及智能机器人等领域。
从2005年以来行人检测进入了一个快速的发展阶段,但是也存在很多问题还有待解决,个人觉得主要还是在性能和速度方面还不能达到一个权衡。
早期以静态图像处理中的分割、边缘提取、运动检测等方法为主。
例如
(1)以Gavrila为代表的全局模板方法:
基于轮廓的分层匹配算法,构造了将近2500个轮廓模板对行人进行匹配,从而识别出行人。
为了解决模板数量众多而引起的速度下降问题,采用了由粗到细的分层搜索策略以加快搜索速度。
另外,匹配的时候通过计算模板与待检测窗口的距离变换来度量两者之间的相似性。
(2)以Broggi为代表的局部模板方法:
利用不同大小的二值图像模板来对人头和肩部进行建模,通过将输入图像的边缘图像与该二值模板进行比较从而识别行人,该方法被用到意大利Parma大学开发的ARGO智能车中。
(3)以Lipton为代表的光流检测方法:
计算运动区域内的残余光流;
(4)以Heisele为代表的运动检测方法:
提取行人腿部运动特征;
(5)以Wohler为代表的神经网络方法:
构建一个自适应时间延迟神经网络来判断是否是人体的运动图片序列;
以上方法,存在速度慢、检测率低、误报率高的特点。
二、行人检测的研究现状
(1)基于背景建模的方法:
分割出前景,提取其中的运动目标,然后进一步提取特征,分类判别;在存在下雨、下雪、刮风、树叶晃动、灯光忽明忽暗等场合,该方法的鲁棒性不高,抗干扰能力较差。
且背景建模方法的模型过于复杂,对参数较为敏感。
(2)基于统计学习的方法:
根据大量训练样本构建行人检测分类器。
提取的特征一般有目标的灰度、边缘、纹理、形状、梯度直方图等信息,分类器包括神经网络、SVM,adaboost等。
该方法存在以下难点:
(a)行人的姿态、服饰各不相同;
(b)提取的特征在特征空间中的分布不够紧凑;
(c)分类器的性能受训练样本的影响较大;
(d)离线训练时的负样本无法涵盖所有真实应用场景的情况;
尽管基于统计学习的行人检测方法存在着诸多的缺点,但依然有很多人将注意力集中于此。
行人检测国外研究情况:
法国研究人员Dalal在2005的CVPR发表的HOG+SVM的行人检测算法(HistogramsofOrientedGradientsforHumanDetection,NavneetDalel,BillTriggs,CVPR2005)。
Dollar在2010年BMVC的《Thefastestpedestriandetectorinthewest》一文中提出了一种新的思想,这种思想只需要训练一个标准model,检测N/K(K≈10)然后其余的N-N/K种大小的图片的特征不需要再进行这种复杂的计算,而是跟据这N/K次的结果,由另外一种简单的算法给估计出来,这种思想实现的基础是大小相近的图像的特征可以被足够精确的估计出来;同年,德国人:
StefenWalk文中使用改进的HOG,即HOF和CSS(colorselfsimilarity)特征,使用HIKSVM分类器。
2012年PAMI上发表的一篇关于行人检测的综述性文章,对常见的16种行人检测算法进行了简单描述,并在6个公开测试库上进行测试,给出了各种方法的优缺点及适用情况。
另外,指出了未来行人检测的发展方向和趋势。
加州理工学院2009年行人检测的文章:
IntegralChannelFeatures(积分通道特征)
2013年ICCV2013:
1)JointDeepLearningforPedestrianDetection2)Multi-StageContextualDeepLearningforPedestrianDetection简称UDN算法,从文中描述的检测效果来看,该方法是所有方法中最好的,并且,效果远超过其他方法。
经过对论文和该算法源码的研究,该算法是与作者另外一篇论文的方法,另外的论文算法做图片扫描,得到矩形框,然后用该方法对矩形框进行进一步确认,以及降低误警率和漏警率。
另外的论文是:
Multi-StageContextualDeepLearningforPedestrianDetection。
这篇文章是用深度学习的CNN做candidatewindow的确认。
而主要的行人检测的算法还是HOG+CSS+adaboost。
IJCV2014年的文章:
DetectionandTrackingofOccludedPeople,利用DPM模型,检测粘连情况很严重的行人,效果很好。
行人检测国内研究情况:
2007年,苏松志,李绍滋,陈淑媛等.行人检测技术综述[J];杜友田;陈峰;徐文立;李永彬;基于视觉的人的运动识别综述,电子学报。
2008年,贾慧星,章毓晋,车辆辅助驾驶系统中基于计算机视觉的行人检测研究综述[J]; 朱文佳,基于机器学习的行人检测关键技术研究[D].
三、基于opencv中光流算法的运动目标跟踪与检测
(1)0基于opencv的光流算法的运动目标跟踪与检测实现框图如下
(2)图像预处理
图像预处理的目的就要减少图像的噪声,以及为提取图像特征做准备,提高图像的识别率和准确率。
本研究课题主要用到的图像预处理技术主要是:
彩色图像灰度化,灰底图像高斯滤波,直方图均衡化等技术。
2、图像特征提取和检测
传统的运动目标跟踪和检测算法都是依据SVM、深度学习、adaboost等方法做分类,HOG、harr等特征作为目标跟踪和检测的前提。
但是依据这些方法,实现较复杂,依据目标提取特征也较为复杂,而且特征提取也较为繁琐,针对不同的目标检测任务需要训练不同的分类器,这样耗时而且工作量巨大,数据量也是巨大。
本研究课题不需要大量数据,只需要一段视频图像数据作为输入,然后采用光流算法,角点检测,视频图像中运动目标的关键点提取,以及确定目标区域大致范围。
本研究课题运动目标是行人,其他运动目标依据改算法应该也是可行的。
都是运动目标,都是对目标依据光流算法提取运动目标特征。
光流算法原理:
光流是图像亮度的运动信息描述。
光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提出了2个假设:
①运动物体的灰度在很短的间隔时间内保持不变;
②给定邻域内的速度向量场变化是缓慢的。
假设图像上一个像素点(x,y),在t时刻的亮度为E(x+Δx,y+Δy,t+Δt),同时用u(x,y0和v(x,y)来表示该点光流在水平和垂直方向上的移动分量:
u=dx/dtv=dy/dt在经过一段时间间隔Δt后该点对应点亮度为E(x+Δx,y+Δy,t+Δt),当Δt很小趋近于0时,我们可以认为该点亮度不变,所以可以有:
E(x,y,t)=E(x+Δx,y+Δy,t+Δt)当该点的亮度有变化时,将移动后点的亮度由Taylor公式展幵,可得:
忽略其二阶无穷小,由于Δt趋近于0时,有:
式中w=(u,v),所以上式就是基本的光流约束方程。
其中令
表示图像中像素点灰度沿x,y,t方向的梯度,可将上式改写成:
Lucas-Kanade是一种广泛使用的光流估计的差分方法,这个方法是由BruceD.Lucas和TakeoKanade发明的。
它假设光流在像素点的邻域是一个常数,然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程。
通过结合几个邻近像素点的信息,卢卡斯-金出方法(简称为L-K方法)通常能够消除光流方程里的多义性。
而且,与逐点计算的方法相比,L-K方法对图像噪声不敏感。
不过,由于这是一种局部方法,所以在图像的均匀区域内部,L-K方法无法提供光流信息。
Lucas-Kanade改进算法
Jean-YvesBouguet提出一种基于金字塔分层,针对仿射变换的改进Lucas-Kanade算法。
为什么要用金字塔?
因为lk算法的约束条件即:
小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。
如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。
考虑物体的运动速度较大时,算法会出现较大的误差。
那么就希望能减少图像中物体的运动速度。
一个直观的方法就是,缩小图像的尺寸。
假设当图像为400×400时,物体速度为[1616],那么图像缩小为200×200时,速度变为[8,8]。
缩小为100*100时,速度减少到[4,4]。
所以在源图像缩放了很多以后,原算法又变得适用了。
所以光流可以通过生成原图像的金字塔图像,逐层求解,不断精确来求得。
简单来说上层金字塔(低分辨率)中的一个像素可以代表下层的两个。
假设I和J是两幅2D的灰度图像,对于图像上每个像素点的灰度值定义为:
I(x)=I(x,y) 和 J(x)=j(x,y)
其中x=(x,y)是图像上像素点的图像坐标。
在实际场景中图像I和图像J可以代表前后两帧图像。
对于图像特征点金字塔跟踪来说的目的是:
对于前一帧的图像I上一点u(ux,uy),要在后一帧图像J上找到一点v(ux+dx,uy+dy)与之相匹配,即灰度值最接近。
那么向量d=[dx,dy]就是图像在点u处的运动速度,也就是所说像素点u的光流。
为了进一步说明向量d的含义。
我们假设前一帧图像经历了仿射变换到后一帧图像,定义变换矩阵为
其中四个参数dxx,dyy,dxy,dyx表征着图像中的仿射变形。
所以光流计算的目的转变成找到向量d和变换矩阵A使得图像上一块区域内灰度差最小。
定义误差
其中两个整数wx和wy设定了图像上矩形窗口的大小(2*wx+1)和(2*wy+1)。
典型的wx和wy取值为1,2,3,4,5,6,7个像素,相似度的函数被在(2ωx+1,2ωy+1)的区域内定义。
注意在金字塔各层窗口的大小是保持恒定的尺寸。
对于Lucas-Kanade改进算法来说,主要的步骤有三步:
建立金字塔,基于金字塔跟踪,迭代过程。
本研究课题主要依据金字塔跟踪算法,原理如下:
总体来讲,金字塔特征跟踪算法描述如下:
首先,光流和仿射变换矩阵在最高一层的图像上计算出;将上一层的计算结果作为初始值传递给下一层图像,这一层的图像在这个初始值的基础上,计算这一层的光流和仿射变化矩阵;再将这一层的光流和仿射矩阵作为初始值传递给下一层图像,直到传递给最后一层,即原始图像层,这一层计算出来的光流和仿射变换矩阵作为最后的光流和仿射变换矩阵的结果。
对于L=0,1,2,…L,定义
是图像中像素点u在第L层对应点的坐标。
根据上一步中图像金字塔的定义,可以计算出
我们用数学的思想重新描述在L层和L+1层迭代运算,假定在第L层有对被跟踪目标的位置有个大致估计,而从第L+1层传递到L层的运动矢量,即光流计算初值为
(后面会对gL做一个解释)并且对于最上层的变换矩阵猜测
为了在L层上计算光流和仿射变换矩阵,需要重新定义在L层上的匹配误差ξL:
其中图像
和
是原始图像在L层上采样出来的图像,基于这层中的光流和仿射矩阵初值gL和GL可以计算出两个对应图像
和
这里用L+1层得到的最初估计gL对L层作预平移,L层在gL的基础上求该层的光流dL,这样求得的残余光流向量dL=[dLx,dLy]T就足够小,因此能够通过标准的光流法来求出这个运动矢量。
然后得到的dL结合gL又可以对L-1层的gL-1做估计。
最终的光流和就是在所有层的分段光流d的叠加。
使用金字塔图像计算光流的一个明显的好处是,对于一个有着较大的像素偏移的矢量d,可以通过计算几个比较小的残余光流来得到。
这里就是金字塔跟踪算法的核心。
接下来就是计算该层上的光流dL和变换矩阵AL,我们将在下一步中谈论。
现在,假设在这一层上的光流和变换矩阵己经计算出来。
接着将结果传递给下一层,计算出下一层的假设初值:
将gL-1和GL-1作为初值,重新循环上面的步骤,直到最上一层,计算出光流d和仿射变换矩阵A。
由于金字塔的缩放减小了光流值,最高层的光流估计值可以设为0,设顶层时的初始为:
这种算法最明显的优势在于对于每一层的光流都会保持很小,但是最终计算来的光流可以进行累积,便于有效地跟踪特征点。
这一步是算法的核心步骤。
在金字塔的每一层,目标是计算出光流dL和仿射变换矩阵AL从而使误差ξL最小。
由于每一层的迭代过程是相同的,所以我们就描述从一层到下一层的迭代过程。
首先将上一层的光流u和A传给这一层,计算这一帧图像中像素点的光照
同时计算出图像在该点x方向和y方向上的偏导Ix=[I(x+1,y)-I(x-1,y)]/2,Iy=[I(x,y+1)-I(x,y-1)]/2。
在此基础上,计算出空间梯度矩阵:
更新光流v=2*v。
迭代过程:
计算后一帧图像中对应像素点的灰度
计算两帧图像间相同位置点的灰度值之差
,在计算图像之间的误差
最后计算针对仿射光流
更新跟踪结果
直到
某个阈值结束在这一层的迭代过程。
基于行人运动目标跟踪与检测的特征点选择
因此,可按照以下的步骤选择特征点:
1、计算图像I中每一个像素的矩阵G和最小特征值λm。
2、寻找整副图像中最小特征值λm 中的最大特征值λmax。
3、保留最小特征值λm 大于给定阈值的像素点。
阈值通常取5%λmax ~10%λmax 。
4、保留λm 局部最大值的像素:
像素特征值λm 大于其3*3邻域中其他像素的特征值 λm 。
5、剔除像素密集区域中的一些像素,确保图像中相邻像素的距离都大于给定的阈值(常取5~10pixels)。
上述操作完成后,图像I中剩下的像素即为选择的特征点,并作为跟踪特征点。
特征点选择算法的步骤5确保了特征点间的最小距离。
没有必要取一个大的综合窗口选择特征点(或计算矩阵G)。
大量实验证明,wx=wy=1的3*3大小的综合窗口能够取得满意的效果。
金字塔高度的选择
在大多数的情况下,超过4的金字塔图像层次没有太大的意义。
有时为了简化可以将仿射变换矩阵G简化为单位矩阵。
算法流程
跟踪问题的解决思路
自底向上(Bottom-up)的处理方法又称为数据驱动(Date-driven)的方法,不依赖于先验知识。
(本课题采用的方法)
自顶向下(Top-down)的处理方法又称为模型驱动(Model-driven)的方法,依赖于所构建的模型或先验知识。
自底向上(Bottom-up)的处理方法:
基于点的跟踪,质心或一组特征点、运动轮廓的角点集(本文采用的方法)
角点检测
一提到角点检测,最常用的方法莫过于Harris角点检测,opencv中也提供了Harris角点检测的接口,即cv:
:
cornerHarris(),但是Harris角点检测存在很多缺陷(如角点是像素级别的,速度较慢等),因此我们这里将介绍opencv中的另一个功能更为强大的函数——cv:
:
goodFeaturesToTrack(),它不仅支持Harris角点检测,也支持ShiTomasi算法的角点检测。
但是,该函数检测到的角点依然是像素级别的,若想获取更为精细的角点坐标,则需要调用cv:
:
cornerSubPix()函数进一步细化处理,即亚像素。
角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。
这些点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
在三维场景重建、运动估计、目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。
Harris角点检测基本思想
从图像局部的小窗口观察图像特征
角点定义窗口向任意方向的移动都导致图像灰度的明显变化
Harris检测:
数学表达
将图像窗口平移[u,v]产生灰度变化E(u,v)
Harris检测:
数学表达
四、实验结果分析
从检测结果来看,总体还算可以,基本是可以实现对运动行人的检测和跟踪。
图像小的白色的点是跟踪到的行人运动过程中的角点,角点的多少与行人的运动姿态有关关。
白色点中的小点是亚像素的跟踪精度更高的角点。
图像中蓝色矩形框是定义的检测画面的范围区域,黄色小的矩形框是跟踪检测到的运动目标。