在这个大家都在摸鱼、熬时间、等年终奖的“空闲时间”(哈哈),我整理了一篇文章,之前已经发过公众号,有兴趣的朋友可以关注一下。
做过基于目标检测算法应用的人可能会碰到这样一个问题:算法在检测连续视频帧时,视频中同一个目标的检测框经常出现抖动、有时候目标还出现若干帧检测不到的情况(漏检),哪怕整个视频画面保持不变,目标就停在原地不动,照样会出现这个问题。检测算法出现这个问题会对后面整个流程产生非常大的负面影响,因为大部分应用会基于前面的检测输出结果去做一些具体的业务逻辑,比如测速、轨迹分析。如果检测输出框不稳定、不连续,无疑会对整个应用的准确性造成非常大的影响。我将这种问题分为3类:
1、目标检测框的宽高不稳定。比如一辆车停在原地不动,正常期望的是,不管在哪帧进行检测,车辆检测输出框的宽高应该固定不变,因为车没挪动。或者说目标从远到近,检测框的宽高应该平滑变化,而不是看上去一闪一闪的感觉
2、同理,目标检测框的位置不稳定。同样还是一辆车停在原地,车辆检测输出框的位置(框中心点坐标)应该固定不变。或者从远到近,检测框的中心点应该平滑移动,而不是看上去一抖一抖
3、目标停在原地不动,视频画面保持不变,该目标应该连续被检测到,而不会出现若干帧漏检
下面这个动图很好的说明了上面提到的问题(来源youtube见末尾链接)
在搞清楚如何解决(或者说优化)这个问题之前,我们要先搞清楚为什么会出现这个现象?目前所有基于CNN的目标检测算法,输入全部都是像素值,无论做过什么预处理,原始图像的像素组成肯定会影响最终的检测结果。而我们人眼认为的“视频画面没有变化”只是一个错觉,由于图像采集设备各种噪音的影响(可能还有光线亮度变化、解码噪音等等),看似没有变化的视频画面前后两帧其实从微观像素组成上已经发生了很大变化,这些变化对检测算法来讲无疑是巨大的。如果用同一张图片组成一个序列,那么这个序列中的目标检测框肯定非常稳定(实际上可以做到完全一模一样),原因很简单,前后帧的画面一模一样、微观像素组成也完全一样,模型的输出当然也一模一样了(不考虑解码噪音)。
好了,现在清楚了问题出现的原因,就要找办法去解决。可惜的是,目前并没有办法彻底解决这个检测框不稳定/不连续的问题,只有优化该问题的办法。下面直接列出来:
1、既然微观上的像素变化对检测结果影响巨大,那么我们尽量充分收集各种场景(比如各种亮度)的素材去训练模型,最终提升模型的泛化能力。但是这个方法局限性太大了,有些图像噪音你无法预估;
2、对训练素材质量进行优化,尤其素材的标注质量。检查素材gt标注是否规范(比如是否刚好贴近目标轮廓、是否有漏标目标)。原因很简单,gt框子如果本身都很随便,有时候大有时候小,对最终检测框的稳定性影响肯定很大。如果gt漏标严重,那么最终肯定影响模型对目标的检测判断;
3、无法在检测环节解决的,那么我们就在检测之后去处理。这里要提到的就是目标跟踪算法,对目标跟踪不熟悉的童鞋请看前面的旧文章。目标跟踪主要是将视频前后帧中的同一目标进行关联,并且赋予唯一ID。在跟踪的逻辑中,我们可以做一些轨迹平滑处理、轨迹缓存处理,来弥补前面检测环节的不足。下面这张图右边为检测算法的原始输出,左边为跟踪结果:
上面3条,我已经在实际工程中证实过2和3有效。下面重点说第3条,也就是目标跟踪对检测输出结果的优化。下面先看一个检测算法的原始输出效果,它只有检测框:
我们可以看到检测框抖动严重,而且画面中的行人检测断断续续,算法无法逐帧都检测到。这种情况下,我们无法稳定捕捉到行人移动这个动作,所以对应用系统后续的业务逻辑带来巨大的负面影响。现在我在检测输出的基础上增加目标跟踪的逻辑之后:
可以看到,不仅行人目标检测框连续了(ID固定不变),周边车辆运动也更加平滑,对后续车辆测速逻辑有非常大的帮助。目标检测框稳定/连续到底对后续业务逻辑有什么影响?举个例子,如果应用系统在检测到行人目标的时候发出告警的阈值是25帧,也就是系统至少要连续检测到行人目标一秒钟才认为应该报警。那么仅仅按照目标检测的原始输出结果,该行人目标检测无法触发连续25帧的阈值。
具体的目标跟踪算法可以参考SORT和DeepSort两种,这俩是非常典型有代表性的跟踪方式。前者纯粹基于目标物理位置进行跟踪(目标检测框的大小和位置),后者除了考虑目标物理位置之外,还考虑了目标外观特征(Appearance Feature),通过外观特征进一步进行匹配关联,运行速度要比前者慢很多,但是准确性高。在这两种跟踪方式中,都用到了卡尔曼滤波,一个作用就是用来做前后帧目标轨迹预测关联,另一个就是对目标检测框的平滑处理,让目标检测框变化不要那么突兀。至于若干帧漏检的问题,这些跟踪算法中都有缓存机制,当目标偶尔漏检时,之前赋予的ID并不会马上清除,而是保留一段时间(帧),后面如果能匹配到新的检测结果,那么目标重新被激活(ID不变)。对跟踪原理不清楚的童鞋请参考之前的旧文章。
参考资料
1、https://arxiv.org/abs/1602.00763
2、http://cs230.stanford.edu/projects_winter_2019/reports/15812427.pdf
3、https://www.youtube.com/watch?v=vGiHciI-NC0