基于深度学习的目标跟踪(Yolov3+deepsort)

最近有个计数的项目刚好可以用到目标跟踪,先跑通测试一下,感觉还不错。项目代码在这里
主要参考的是一下两个项目改的:
deep_sort:https://github.com/nwojke/deep_sort
keras-yolov 3:https://github.com/qqwweee/keras-yolo3

先下载这个项目:https://github.com/Qidian213/deep_sort_yolov3
下载yolov3的项目:https://github.com/qqwweee/keras-yolo3 ,因为上面的项目convert.py有问题,所以直接用yolov3的代码运行。

python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

将yolo.h5拷贝到第一个项目里面的model_data目录下,在第一个项目下运行python demo.py即可。

因为keras版的yolov3很慢,后面有时间用pytorch版的yolov3测试一下。关于yolo的内容,之前的文章做了总结,经过测试确实比pytorch版本的慢很多。

至于deep_sort的东西,看完源码再更。

Sort和DeepSort算法:

这篇文章解释的很详细很易懂。
1.Sort算法的理解
在跟踪之前,对所有目标已经完成检测,实现了特征建模过程。
① 第一帧进来时,以检测到的目标初始化并创建新的跟踪器,标注id。
② 后面帧进来时,先到卡尔曼滤波器中得到由前面帧box产生的状态预测和协方差预测。求跟踪器所有目标状态预测与本帧检测的box的IOU,通过匈牙利指派算法得到IOU最大的唯一匹配(数据关联部分),再去掉匹配值小于iou_threshold的匹配对。
③ 用本帧中匹配到的目标检测box去更新卡尔曼跟踪器,计算卡尔曼增益、状态更新和协方差更新,并将状态更新值输出,作为本帧的跟踪box。对于本帧中没有匹配到的目标重新初始化跟踪器。

其中,卡尔曼跟踪器联合了历史跟踪记录,调节历史box与本帧box的残差,更好的匹配跟踪id。

2.DeepSort算法的理解
①马氏距离计算物体检测Bbox dj和物体跟踪BBox yi之间的距离,注:不使用欧式距离的原因是dj和yi 的空间域分布不同,欧式距离忽略空间域分布的计算结果不能准确反映两者的真实距离,公式如下:
马氏距离:
在这里插入图片描述
当两者距离≤特定阈值,则表示两者关联 :
在这里插入图片描述
②物体检测BBox dj 通过CNN网络计算对应的128维feature向量rj ,具体的做法是把物体检测BBox dj对应的图像patch作为下图的CNN输入,输出128维feature向量rj
在这里插入图片描述
对于跟踪器i,为它创建一个集合保留它过去Lk 次成功跟踪后物体检测Bbox对应的Lk 个Feature向量集合,公式是在计算第i个物体跟踪的所有Feature向量和第j个物体检测之间的最小余弦距离(具体含义参考下图)
在这里插入图片描述
当两者距离≤特定阈值,则表示两者关联 :
在这里插入图片描述
③关联度量的总公式
在这里插入图片描述
④关联算法:
在这里插入图片描述
T是物体跟踪集合
D是物体检测集合
1.C矩阵存放所有物体跟踪i与物体检测j之间距离的计算结果
2.B矩阵存放所有物体跟踪i与物体检测j之间是否关联的判断(0/1)
3.关联集合M初始化为{}
4.将找不到匹配的物体检测集合初始化为D
5.从刚刚匹配成功的跟踪器循环遍历到最多已经有Amax 次没有匹配的跟踪器
6.选择满足条件的跟踪器集合Tn
7.根据最小成本算法计算出Tn与物体检测j关联成功产生集合[xi,j]
8.更新M为匹配成功的(物体跟踪i,物体检测j) 集合
9.从U中去除已经匹配成功的物体检测j
10.循环
11.返回 M U 两个集合

代码流程图,找不到原作者的出处了,先拿过来用吧:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38109843/article/details/89457442