静止背景下的多目标追踪附matlab程序_第1页
静止背景下的多目标追踪附matlab程序_第2页
静止背景下的多目标追踪附matlab程序_第3页
静止背景下的多目标追踪附matlab程序_第4页
静止背景下的多目标追踪附matlab程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、静止背景下的多目标追踪随着计算机技术以及智能汽车行业的发展,多目标的检测与追踪的实用性与研究价值逐渐提高。在计算机视觉的三层结构中,目标跟踪属于中间层,是其他 高层任务,例如动作识别以及行为分析等的基础。其主要应用可包括视频监控, 检测异常行为人机交互,对复杂场景中目标交互的识别与处理, 以及虚拟现实及 医学图像。目标跟踪又包括单目标跟踪和多目标跟踪。单目标跟踪可以通过目标的表观建模或者运动建模,以处理光照、形变、遮挡等问题,而多目标跟踪问题则更加 复杂,除了单目标跟踪回遇到的问题外, 还需要目标间的关联匹配。另外在多目 标跟踪任务中经常会碰到 目标的频繁遮挡、轨迹开始终止时刻未知、目标太小、

2、 表观相似、目标间交互、低帧率等等问题。静止背景下的多目标追踪可分为两步来实现,第一步是在视频文件的每帧中检测出移动的目标,第二步是将检测到的目标与跟踪轨迹实时匹配。在本次实验中,利用混合高斯模型进行背景减除, 使用形态学操作消除噪声,通过卡尔曼滤 波预测目标位置,最后利用匈牙利算法进行匹配,实现静止背景下的多目标追踪。1实验原理1.1混合高斯模型单高斯模型是利用高维高斯分布概率来进行模式分类:X11N(二)exp-;(x- y(x)C.2 十 |2其中用训练样本均值代替,二用样本方差代替,X为d维的样本向量。通过高 斯概率公式就可以得出类别 C属于正(负)样本的概率。而混合高斯模型就是数据从

3、多个高斯分布中产生,每个 GMM由k个单高斯 分布线性叠加而成。相当于对各个高斯分布进行加权, 权系数越大,那么这个数 据属于这个高斯分布的可能性越大。P(x) = = p(k)*p(x | k)利用混合高斯模型(GMM)可以进行背景减除,将前后景分离,得到移动的目 标。对每个像素点建立由k个单高斯模型线性叠加而成的模型, 在这些混合高斯 背景模型中,认为像素之间的颜色信息互不相关, 对各像素点的处理都是相互独 立的。单个像素点在t时刻服从混合高斯分布概率密度函数:kp(Xt) = W W仪山5)i =1其中k为分布模式总数,区厂吕,为t时刻第i个高斯分布,t为其均值,t 为其协方差矩阵。在获

4、得新一帧图像后更新混合高斯模型。 用图像中的每个像素点与混合高斯 模型匹配,如果成功则判定该点为背景点,否则为前景点。当背景更新完成后,高 斯模型与背景相关程度越大,标准差就越小,权值越大。按照权值与标准差的比 值从大到小进行排序,取前B个模型作为背景。/ bB = argminZ Wk T2 丿丿1.2卡尔曼滤波卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对 系统状态进行最优估计的算法。其核心思想是,根据当前的测量值、上一时间的 预测值以及误差,计算得到当前值,并可以持续预测下一时间的值。试验中利用卡尔曼滤波计算并预测每个轨迹在下一帧中的位置,建立帧间轨迹的关系。卡尔曼滤

5、波将跟踪分为5种状态:新目标出现、目标匹配、目标遮挡、 目标分离以及目标消失。其状态方程如下所示:X(k 1) = A(k 1,k)X(k) c(k)X(k)珂x(k), y(k), w(k), h(k), v(k)其中x,y,w,h分别表示目标外接矩形的横纵坐标以及长、宽,c(k), v(k)为不相关的高斯白噪声。定义其观测方程为Z(k)二H(k) X(k) v(k) o定义好了观测方程与状态方程之后就可以用卡尔曼滤波器实现运动目标的跟踪,步骤如下:1) 计算运动目标的特征信息(运动质心,以及外接矩形)。2) 用得到的特征信息初始化卡尔曼滤波器。3) 用卡尔曼滤波器对下一帧中对应的目标区域进

6、行预测,当下一帧到来时,在 预测区域内进行目标匹配。4) 如果匹配成功,则更新卡尔曼滤波器。1.3匈牙利匹配算法匈牙利匹配算法是一种利用增广路径求取二分图最大匹配的算法。匈牙利树一般由宽度优先搜索(BFS构成。从一个未匹配点出发运行 BFS且必须走交 替路,直至不能再扩展为止。交替路指的是,从一个未匹配点出发,依次经过非 匹配边、匹配边循环往复,形成的路径称为交替路。示意图如图1所示:图1匈牙利树匹配匈牙利算法的要点如下:1)从左边第一个顶点开始,挑选未匹配点进行搜索,寻找增广路。2) 如果经过一个未匹配点,则寻找成功。更新路径信息,匹配变数+1,停 止搜索。3)如果一直没有找到增广路,则不再

7、从这个点开始搜索。4) 找到增广路之后需要沿着路径更新匹配,通过prev数组来记录路径上的 点。在实验中,用匈牙利算法将新一帧图片中检测到的运动物体匹配到对应的轨 迹。匹配的过程是通过最小化卡尔曼预测得到的质心与检测到的质心之间的欧氏 距离之和实现的。通过卡尔曼滤波计算并预测每个轨迹在下一帧中的位置, 然后计算预测的轨 迹位置和每个新检测到的目标之间的欧几里得距离, 将度量结果作为损失函数矩 阵。损失矩阵的大小为(M,N),其中M是轨迹数目,N是检测到的运动物体数 目。2实验内容2.1目标检测要实现目标检测,首先利用混合高斯模型区分前景背景。通过调用函数visio n.Foregrou ndD

8、etector设置检测子为混合高斯模型,其中参数分别为高斯核数目、训练背景帧数以及背景阈值。函数的返回值为一个二进制掩码,其中1的像素值对应前景,0的像素值对应背景。在实验中,选取前 150帧图像作为背 景帧,并设置阈值为0.6,高斯核数目为3。完成背景减除后,通过设置blob分析子来寻找连通域,函数设置的参数为最 小区域面积,返回值为目标面积、质心和边界框。实验中,设置最小区域面积为 400,代码如下所示:obj.detector = visi on.F oregrou ndDetector(NumGaussia ns,3,.NumTra inin gFrames, 150,Mi ni mu

9、mBackgrou ndRatio,0.6);obj.blobA nalyser = visio n.BlobA nalysis(Bou ndin gBoxOutputPort5true, AreaOutputPort, true,Ce ntroidOutputPort,true,Mini mumBlobArea, 400);完成混合高斯混合模型以及blob分析子后,逐帧读取视频,为后续目标检 测以及追踪的过程做准备:frame = obj.reader.step();在检测目标的过程中,利用形态学运算中的开运算以及闭运算可以消除噪 声,使目标检测更为准确。开运算是通过先腐蚀再膨胀,去除孤立的

10、像素点、总 的位置和结构不变。而闭运算是先膨胀再腐蚀,弥合小裂缝,而总的位置和形状 不变,通过填充图像的凹角来滤波图像。其效果如图 2所展示:图2.1原始像素点图2.3闭运算效果图7图2形态学运算效果图实验中,首先使用检测子,即混合高斯模型得到前景图,对前景图使用8*8矩形进行开运算,切断临近物体间的联系。再使用15*15矩形进行闭运算,消除 细小物体,最后填补物体中间的空洞。滤除噪声后,使用 blob分析得到所有连 通域的中心以及边界框的大小。代码如下所示:fun cti once ntroids, bboxes, mask = detectObjects(frame)operationst

11、o remove noise and fillrecta ngle , 8,8);recta ngle , 15,15);holes );in holes.% Detect foregrou nd. mask = obj.detector.step(frame);% Apply morphological mask = imope n( mask, strel( mask = imclose(mask, strel( mask = imfill(mask,% Perform blob an alysis to find conn ected comp onents., cen troids,

12、bboxes = obj.blobA nalyser.step(mask);end视频中对移动目标的检测结果如图 3.1,图3.2所示:图3.1移动目标检测结果1图3.2移动目标检测结果22.2目标跟踪要进行目标跟踪,首先需要进行轨迹初始化,通过函数in itializeTracks(来进行初始化,每一个轨迹代表视频中一个移动的目标。轨迹的结构包含如下信息:1) ID,轨迹编号;2) Bbox,目标的边界框;3) kalmanFilter,用于预测目标位置的卡尔曼滤波器;4) Age,目标被检测到的总帧数;5) totalVisibleCount,目标可被检测到的全部帧数;6) consecu

13、tivelnvisibleCount:连续未检测到目标的帧数。代码如下所示:fun cti ontracks = in itializeTracks()% create an empty array of trackstracks = struct(.id , ,.bbox , ,.kalma nFilter, ,.age , ,.totalVisibleCou nt, ,.con secutive In visibleCou nt, );end为消除噪声对目标追踪的影响,仅在 totalVisibleCount 超过阈值时才显示目 标的轨迹。 当连续几帧没有检测到与跟踪相关的信息时, 则假设

14、该对象已经离开 了可视图画面。 通过参数 consecutiveinvisiblecount 可判断这种情况, 当其超过阈 值时,删除跟踪轨迹。如果跟踪时间较短,并且在大多数帧中标记为不可见,那 么轨迹也可能作为噪声被删除。轨迹初始化完成后,通过卡尔曼滤波计算并预测每个轨迹在下一帧的位置, 函数输出为边框预测中心。 然后调整目标边界框的位置, 使其中心到达预测位置, 并将结果作为轨迹的跟踪矩形框,代码如下所示:function predictNewLocationsOfTracks()for i = 1:length(tracks)bbox = tracks(i).bbox;% Predict

15、 the current location of the track.predictedCentroid = predict(tracks(i).kalmanFilter);%根据以前的轨迹,预测当前位置% Shift the bounding box so that its center is at% the predicted location.predictedCentroid = int32(predictedCentroid) - bbox(3:4) / 2; tracks(i).bbox = predictedCentroid, bbox(3:4);endend 完成位置预测后,创

16、建损失函数矩阵,航代表轨迹,列代表检测到的目标。 损失矩阵的大小为(M,N),其中M是轨迹数目,N是检测到的运动物体数目。 对每个轨迹计算其卡尔曼滤波预测的轨迹位置和每个新检测到的目标之间的欧 几里得距离,将度量结果作为损失函数矩阵。function assignments, unassignedTracks, unassignedDetections = . detectionToTrackAssignment()nTracks = length(tracks);nDetections = size(centroids, 1);% Compute the cost of assigning

17、each detection to each track.cost = zeros(nTracks, nDetections);for i = 1:nTrackscost(i, :) = distance(tracks(i).kalmanFilter, centroids);end通过函数 assignDetectionsToTracks(cost, costOfNonAssignmerlt)用匈牙利匹 配算法将新一帧图片中检测到的运动物体匹配到对应的轨迹。 其中输入的参数为 损失矩阵以及阈值, 低于阈值时, 取消匹配。 返回值为匹配的结果以及未匹配成 功的轨迹以及目标。完成匹配后,对已分配的

18、轨迹,将其更新至当前帧目标所在位置,对未分配 的轨迹,增加其连续不可见帧数。设置两个阈值,in visibleForL ong代表当连续不 可见帧数大于它时,删除轨迹;ageThreshold代表当总出现帧数小于它时,当该 参数与总可见帧数的比值小于 0.6 时,删除轨迹。目标检测与轨迹跟踪的操作循环进行,直至视频结束,显示最终跟踪结果。2.3 总结实验程序可分解为 11 个部分,创建系统对象、初始化轨迹、读取视频帧、 检测目标、 预测已跟踪轨迹的新位置、 分配新检测目标给轨迹、 更新已分配的轨 迹、更新未分配的轨迹、删除丢失的轨迹、创建新轨迹以及显示跟踪结果。其中创建系统对象包含创建视频对象

19、, 设置检测子为高斯混合模型以及设置 blob 分析子。在预测已跟踪轨迹的新位置时, 使用卡尔曼滤波器进行预测, 并调 整位置,显示预测结果矩形框。 在更新已分配的轨迹部分中, 根据轨迹对应的检 测目标位置中心修正其卡尔曼滤波器, 并修正轨迹存在帧数、 目标检测到的总帧 数以及连续未检测到目标的帧数。 在删除丢失轨迹中, 删除连续不可见帧数大于 阈值或当轨迹存在帧数小于 10 时,根据总可见帧数与轨迹存在帧数的比值丢弃 轨迹。主函数代码如下:obj = setupSystemObjects();%创建系统对象tracks = initializeTracks();% 初始化轨迹nextId =

20、 1;% ID of the next track% Detect moving objects, and track them across video frames.while isDone(obj.reader)frame = readFrame();%读取一帧centroids, bboxes, mask = detectObjects(frame);predictNewLocationsOfTracks();assignments, unassignedTracks, unassignedDetections =.detectionToTrackAssignment();update

21、AssignedTracks();updateUnassignedTracks();deleteLostTracks();createNewTracks();displayTrackingResults();end可见完成创建系统对象以及初始化轨迹后,循环剩余 9 个步骤,直至处理完 整个视频。3 实验结果分析 在本次试验中,通过混合高斯模型背景减除,形态学操作消除噪声,利用卡 尔曼滤波预测每个轨迹在下一帧中的位置, 最后通过匈牙利匹配算法完成目标与 轨迹之间的匹配。实现了在静止背景下的多目标检测与跟踪。如图 4 所示可见,对于匀速移动的目标,检测效果较好,可以实现较好的目 标检测与跟踪。图4

22、匀速移动目标检测结果但静止背景下,基于动态的多目标追踪,很容易受到环境的影响。当检测目 标为行人时,风吹动树叶或是有车辆经过,甚至是光照导致的影子变化都会很大 程度地影响跟踪效果。图5展示了明显的失败样例:图5目标追踪失败样例在实验中使用的卡尔曼滤波预测目标下一帧所在位置的模型,只适用于匀速变 化,而汽车存在加速运动。从右边的二值图像可以看出,汽车的车灯造成像素点 大量变化,只使用帧间相减以及形态学操作来得到检测目标的本实验并不适用于 此。造成了较大的误差,导致检测以及跟踪目标失败。要规避由前景中不同物体 造成的实验误差,可使用其他方法在前景检测中对检测到的物体进行分类。通过多次试验发现,程序

23、参数的鲁棒性较差,在进行形态学计算时,不同的 视频调整开运算以及闭运算的结构元素,目标检测的效果差异很大。在后续的学习过程中可以继续对本次实验进行更新修正,得到更好的实验效果。附录function objectracking()obj = setupSystemObjects();%初始化tracks = initializeTracks();% 初始化轨迹nextId = 1;% ID of the next track% Detect moving objects, and track them across video frames. while isDone(obj.reader)fr

24、ame = readFrame();%读取一帧centroids, bboxes, mask = detectObjects(frame); predictNewLocationsOfTracks();assignments, unassignedTracks, unassignedDetections = detectionToTrackAssignment();updateAssignedTracks();updateUnassignedTracks();deleteLostTracks();createNewTracks(); displayTrackingResults();endfu

25、nction obj = setupSystemObjects() obj.reader = vision.VideoFileReader( obj.maskPlayer = vision.VideoPlayer( obj.videoPlayer = vision.VideoPlayer( 创建视频播放对象obj.detector = vision.ForegroundDetector( NumTrainingFrames , 150,test.mp4 );Position, 740, 400, 700, 400)Position , 20, 400, 700, 400)NumGaussian

26、s , 3, .MinimumBackgroundRatio , 0.6);%GMM前景检测,高斯核数目 3,前150帧为背景帧,阈值为 0.6,返回值为背景obj.blobAnalyser = vision.BlobAnalysis(BoundingBoxOutputPorttrue, .AreaOutputPort, true,CentroidOutputPort, true, .MinimumBlobArea, 400);%返回值为目标面积、质心和边界框endfunction tracks = initializeTracks() % create an empty array of t

27、racks tracks = struct(.id , , . bbox , , . kalmanFilter , , . age , , .totalVisibleCount , , );consecutiveInvisibleCountendfunction frame = readFrame()frame = obj.reader.step();endfunction centroids, bboxes, mask = detectObjects(frame)% Detect foreground.mask = obj.detector.step(frame);% Apply morph

28、ological operations to remove noise and fill in holes. mask = imopen(mask, strel(rectangle , 8,8);mask = imclose(mask, strel(rectangle , 15,15);mask = imfill(mask,holes );% Perform blob analysis to find connected components., centroids, bboxes = obj.blobAnalyser.step(mask);endfunction predictNewLoca

29、tionsOfTracks()for i = 1:length(tracks)bbox = tracks(i).bbox;% Predict the current location of the track. predictedCentroid = predict(tracks(i).kalmanFilter);%根据以前的轨迹,预测当前位置% Shift the bounding box so that its center is at% the predicted location.predictedCentroid = int32(predictedCentroid) - bbox(3

30、:4) / 2; tracks(i).bbox = predictedCentroid, bbox(3:4);endendfunction assignments, unassignedTracks, unassignedDetections = detectionToTrackAssignment()nTracks = length(tracks);nDetections = size(centroids, 1);% Compute the cost of assigning each detection to each track.cost = zeros(nTracks, nDetect

31、ions);for i = 1:nTrackscost(i, :) = distance(tracks(i).kalmanFilter, centroids);end% Solve the assignment problem.costOfNonAssignment = 20;assignments, unassignedTracks, unassignedDetections = assignDetectionsToTracks(cost, costOfNonAssignment);endfunction updateAssignedTracks()numAssignedTracks = s

32、ize(assignments, 1);for i = 1:numAssignedTracks trackIdx = assignments(i, 1); detectionIdx = assignments(i, 2); centroid = centroids(detectionIdx, :); bbox = bboxes(detectionIdx, :); correct(tracks(trackIdx).kalmanFilter, centroid); tracks(trackIdx).bbox = bbox;tracks(trackIdx).age = tracks(trackIdx

33、).age + 1; tracks(trackIdx).totalVisibleCount = tracks(trackIdx).totalVisibleCount + 1; tracks(trackIdx).consecutiveInvisibleCount = 0;endendfunction updateUnassignedTracks()for i = 1:length(unassignedTracks) ind = unassignedTracks(i); tracks(ind).age = tracks(ind).age + 1; tracks(ind).consecutiveIn

34、visibleCount =tracks(ind).consecutiveInvisibleCount + 1;endend% Delete Lost Tracks function deleteLostTracks() if isempty(tracks) return ;end invisibleForTooLong = 20; ageThreshold = 10; ages = tracks(:).age; totalVisibleCounts = tracks(:).totalVisibleCount; visibility = totalVisibleCounts ./ ages;lostInds = (ages ageThreshold & visibility = invisibleForTooLong; tracks = tracks(lostInds);endfunction createNewTracks()centroids = centroids(unassignedDetections

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论