1. 首先是对OpenCV(版本3.4.3)包含的几个目标跟踪算法做了下对比:

对上面的小视频,用鼠标以不同大小的矩形框圈定小车作为Tracking初始范围,并且给某些大的矩形框设定偏置使得小车不在其中心位置。并且视频后半部分小车会与小白发生轻微的交叉。几种算法在同一台电脑上的对比结果如下:

A. cv2.TrackerBoosting_create()

基于AdaBoost的学习方法,PFS=50+(速度与框选大小有关),不易跟丢,交叉干扰明显。

B. cv2.TrackerMIL_create()

多实例在线学习,FPS=15+,不易跟丢,会小幅产生、也会小幅消除偏置,交叉干扰不明显。

C. cv2.TrackerKCF_create()

Kernefied Correlation Filters,FPS=100+,小的初始框很快跟丢,大框不易跟丢,大框存在偏置时目标改变运动方向后能消除偏置。

D. cv2.TrackerTLD_create()

TLD代表跟踪、学习和检测,FPS=15,会跟丢但是也能找回,框的大小在跟踪过程中会变,几乎无视偏置的纠正能力,初始的大框比小框更容易跟错。

E. cv2.TrackerMedianFlow_create()

基于LK跟踪算法的改进,FPS=100+,初始小框最后会跟丢,初始大框很快跟丢,一有交叉马上跟丢。。。。

F. cv2.TrackerGOTURN_create() #没有测试,运行算法需要提前下载好CNN模型文件。

G. cv2.TrackerMOSSE_create()

最小平方误差输出和滤波器,FPS=1000,初始小框容易跟丢,初始大框不易跟丢,大框存在偏置时目标改变运动方向后能消除偏置。

结论:综合考虑跟踪效果与资源占用率,Boosting是比较好的选择。

2. 其次是用CNN确定跟踪初始范围,然后调用cv.Tracker进行跟踪(蓝色方框)的测试:

视频见原文:

原本觉得:既然每帧都要做Detection,那就没有必要再用Tracking算法了。

但是我们考虑上边视频所展示的场景:镜头中同时出现多个目标,而我们平台上的载荷需要分别持续对准每一个目标3秒钟。仅仅依靠Detection的话会出现两个问题:一是如何确保视频当前帧和下一帧中程序锁定的是同一个目标,二是在载荷锁定某个目标进行工作的时候如何应对短暂的Detection无法识别目标的状况。

此时,将Tracking与Detection相结合应该是比较好的方案。