最近,yolo之父Joseph Redmon退出CV界以表达抗议,拒绝AI算法用于军事和隐私窥探。计算机视觉这把双刃剑已经日益深入到我们的生活,虽说大神已经退圈,但我们的研究还是要继续。 为了实现一套CPU独立可运行的高效人体跟踪方案,尽量降低程序的时间复杂度和空间复杂度,可应用在资源有限的嵌入式设备中,我测试了多种主流的开源算法,今天与大家一起分享。 整个方案主要分为两大部分,目标检测+目标跟踪:
一、目标检测
说到目标检测,大家脑海里可能浮现很多检测的方法。在以前,大家可能是通过传统的图像处理,手工提取特征描述子,利用滑动窗+SVM的方案来实现检测。比如在2006年,就有人通过HOG+SVM的方法实现了行人检测。 随着计算机算力的逐步提高,2012年CNN在ImageNet大赛中一鸣惊人,以高出第二名近10%的成绩将深度学习推向热潮。卷积神经网络在分类器上取得显著成效,人们很快将其应用在了目标检测当中,于是乎就有了RCNN、Fast-RCNN、Faster-RCNN三兄弟。
图1 ALexNet网络结构
图2 RCNN算法流程
2016年,yolo算法提出了一种新的单阶段检测方案,后面逐步优化,出现了v2,v3的版本。单阶段的方法省去了生成候选区域的(RPN)的步骤,所以其速度相较于二阶段的算法来说有很大的优势,但是其对于小物体的检测效果较差。从图3我们可以看出,yolo v3的速度是优于其他网络结构的。
图3 Yolo算法性能对比
我使用的就是这个单阶段的yolo算法。在不使用GPU的情况下,为了提高检测帧率,人们逐渐把网络结构进行裁剪,在牺牲少量精度的代价下提升速度。最终我采用的是yolo-lite的模型,经过实验,在笔记本中,其运行帧率能达到10fps。以下是几种yolo模型的性能对比:
模型 | 运行环境 | Fps |
Yolov3 | GPU | 11 |
Yolov2 | GPU | 23 |
Yolov2-tiny | GPU | >30 |
Yolo-lite | GPU | >30 |
Yolo-lite | CPU | 10 |
(笔记本配置:CPU: i7-6700HQ GPU:GTX960M)
二、目标跟踪
在检测帧率达不到实时性或者检测性能不稳定的情况下,我们经常会使用目标跟踪的方法来弥补前者的缺陷。 在目标跟踪这个赛道上,OTB50和OTB100是各种tracker必跑的数据库,我测试了在这个数据集中表现较好、速度较快的几种目标跟踪算法。
压缩跟踪(CT)
这是一种简单高效的基于压缩感知的跟踪算法,作者使用非常稀疏的测量矩阵从多尺度图像的特征空间中提取特征、建立模型,然后使用相同的稀疏测量矩阵对前景和背景进行压缩,最后利用朴素贝叶斯分类器将跟踪任务表示为一个二分类任务。算法的流程图如下:
图4 CT算法流程
这个算法运行速度非常快,平均帧率能在100fps以上,对于一些形态变换不大的物体,其跟踪效果较好,但对于一些运动较为复杂的情况,这个算法还不具备鲁棒性。由于不具备尺度适应性,如果目标尺度变小后,容易学习到一些背景信息,导致跟踪失败。
CT跟踪效果
相关滤波(KCF)
相关滤波也是跟踪算法中一个重要的分支。KCF算法出来之后也算是轰动一时,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现,所以引起了一大批的学者对这个算法进行研究以及工业界也在陆续把这个算法应用在实际场景当中。 基于KCF优化的DSST(Discriminative Scale Space Tracker)算法在2014VOT比赛中夺得了第一名,算法简洁,性能优良,可移植性高。相比CT算法,在尺度适应性上有了很大的改善;相比KCF,在尺度部分作了很大的优化。
图5 DSST与其他算法效果对比
DSST采用了尺度滤波器和位置滤波器结合的办法,首先通过一个滤波进行跟踪,确定目标位置,再在该位置进33层的尺度变换,找到响应值最大的一个尺度,从而确定了最终的目标位置。 经过测试,DSST算法在上述笔记本的运行平均速度在70fps(随着目标的大小波动),跟踪性能非常良好,基本满足实时性的需要。
dsst跟踪效果
Pysot
这是一个由商汤科技开源的一款基于深度学习的目标跟踪库。他实现了目前SOTA的多个单目标跟踪算法,该项目是用Python编写,基于PyTorch深度学习框架。其中总共包含了多种目标跟踪算法,同时也提供了多种backbone,我测试了其中siamrpn_r50模型的效果,其跟踪的效果很稳定,并且具有很强的鲁棒性,但是这种基于深度学习的算法比较依赖于算力,在显卡内存2GB的笔记本上运行帧率只有7.4左右。
siamrpn_r50模型效果
性能对比
(1)跟踪效果:
CT:
DSST:
Pysot(siamrpn_r50):
(2)运行速度:
算法 | Fps |
CT | 平均120(仅使用CPU) |
DSST | 平均80(仅使用CPU) |
siamrpn_r50 | GPU:7.4 CPU:0.6 |
对比可见,基于深度学习的跟踪算法具有很强的鲁棒性,可以适应复杂的运动场景,但需要算力做支撑;Dsst鲁棒性稍弱,但是其运行速度很快,对于大部分运动场景都比较使用,并且满足实时性的需求;CT算法简单高效,速度最快,但是对于尺度变换、遮挡等鲁棒性较差。
三、人体跟踪
综上,我选择了速度较快并且跟踪效果还不错的DSST算法作为跟踪模块核心,通过ROS将检测和跟踪模块进行结合,将yolo-lite检测的结果送到dsst中,即可在不使用GPU的情况下实现一个高效、效果良好的人体跟踪效果。
图6 人体跟踪结构框图
通过云计算等技术,计算机视觉已经潜移默化地影响着我们的生活,在计算机算力不断增强的同时,计算机视觉必定也会朝着轻量化的方向发展,相信日后还会有更多优秀的算法面世。 参考链接: 目标跟踪数据库: http://cvlab.hanyang.ac.kr/tracker_benchmark/datasets.html CT论文地址: http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm DSST论文地址: http://www.cvl.isy.liu.se/en/research/objrec/visualtracking/scalvistrack/index.html yolo官网: https://pjreddie.com/darknet/yolo/ Pysot官网: https://github.com/STVIR/pysot