目标检测中的遮挡问题及优化
文章目录
尽管目标检测算法整体上已经相对比较成熟,但是在特殊场景下的表现还有很多优化空间,比如图片中的目标有遮挡、图像运动模糊、目标为可改变形状的非刚性物体等。本文主要是针对遮挡问题,之前在做游戏目标检测时也遇到过这个问题,当时只是考虑增加训练样本的多样性,最近,笔者读了几篇解决目标检测中的遮挡问题的文章,也看了一些网友的解析,觉得若有所悟,不自觉地想把自己的理解记录下来,自认为“一万个人眼中有一万个哈姆雷特”,希望能够从某个侧面对大家有所帮助。
目标检测中存在两类遮挡,(1)待检测的目标之间相互遮挡;(2)待检测的目标被干扰物体遮挡。比如下图,
具体来说,如果检测任务的目标是汽车和人,那么汽车被人遮挡,而且人被干扰物体(牛)遮挡。因为算法只学习待检测的物体的特征,所以第二种遮挡只能通过增加样本来优化检测效果。
在现实的检测任务中,只有比较特殊的场景需要考虑遮挡问题,比如行人检测、公交车上密集人群检测、牲畜数量计算等,本文将介绍的两篇文章是针对行人检测问题的,也可以复用到其它的应用场景(ps: 大家如果想发paper,也可以借鉴这两篇文章解决问题的方式)。
1 Repulsion Loss: Detecting Pedestrians in a Crowd
1.1 现有方法的缺点
在上一篇博客中,笔者解释了目标检测中的后处理算法,这些后处理算法只能够能够去除冗余的proposals,对于误召回和漏检两种情况就无能为例了,该论文同样为face++出品,只不过从模型优化的角度解决误召回和漏检的问题。
比如下面的这张图,使用Faster RCNN等经典的检测器,其中为Groundtruth框,而为anchors(锚框),由于中包含了的部分区域,所以对应的proposal很容易受到的干扰,导致回归出来的proposal同时包含了目标的部分区域,不精准(????)。
可以更进一步来思考这个问题,假设图中的预测框不存在,也即对应的proposals只有,如果对应的max score的proposal近似为,那么当和的IoU大于阈值时,在后处理nms阶段就会把过滤掉,从而导致更严重的情况,被漏召回了(????)。
1.2 解决办法
针对上面不精准和漏召回的情况,比较直接的想法是,能不能让对应的预测框不受的干扰呢,想法很好,但是具体该怎么告诉模型不受干扰呢?
作者类比于磁铁的吸引力和排斥力作用,提出了Repulsion loss(斥力损失)。如下图,斥力损失的作用是对预测的proposal进行约束,使其不仅要靠近Target (引力作用),还要远离其它的Groundtruth物体以及对应的proposals(斥力作用)。如果的Surrounding Groundtruth包含了除以外的其它目标,则斥力损失会要求预测的proposal远离所有这些目标。
1.3 对问题做数学建模
作者提出了两个损失函数,RepGT和RepBox,前者用于对proposal向其它目标偏移的情况进行惩罚,从而实现斥力作用(编号为A),后者用于对proposal向其它目标对应的proposals靠近的情况进行惩罚,从而实现斥力作用(编号为B),因此检测结果对NMS算法更加鲁棒。斥力损失的数学表达式如下,
其中,表示引力作用,表示斥力作用A,表示斥力作用B。为超参数,用于平衡不同作用的权重。
作者是针对行人检测任务,为了简化,只考虑Two-class的情况,前景和背景,其中所有的前景为同一类别。
记和分别表示anchor和groundtruth的坐标,表示所有的Positive anchors,表示所有的groundtruth框,这里的表示下面公式中G对应的罗马符号形式(笔者不知道怎么敲出来这种形式????)。
1.3.1 引力作用
对于指定的anchor ,可以计算它与所有groundtruth框的IoU,取IoU最大的作为Target框,公式表示如下,
定义为anchor P对应的预测框,那么需要满足预测框逼近Target框,度量两个框的逼近程度的方式包括欧氏距离、距离、IoU等,作者使用了距离,并且,对于训练集batch中的每一张图,需要考虑所有的anchors,因此公式表达如下,
1.3.2 斥力作用A
对于指定的anchor ,可以计算它与所有groundtruth框的IoU,取IoU第二大的作为Target框,公式表示如下,
斥力作用A用于对逼近的情况进行惩罚,作者使用了IoG(Intersection over Ground-truth)指标来衡量逼近程度,公式表达如下,
其中,
1.3.3 斥力作用B
在上面的1.1部分,解释了当不同Target对应的预测框靠的太近时,容易出现漏召回的情况,斥力作用B用于将不同Target对应的预测框分离开。
对于所有的groundtruth框表示,每个框都对应了一组anchors,那么所有的anchors可以分成 组,公式表达如下,
显然,对于不同组中的anchors,比如,斥力作用B要求它们对应的预测框尽量远离,也即预测框之间的IoU越小越好,公式表达如下,
其中,表示identity函数,为一个很小的常数,防止分母为0。
从优化目标可以看出,不同Target对应的预测框最终会分的很开,避免了NMS后处理中因为合并预测框导致的漏召回情况。
1.4 数学模型的求解
这一部分没什么好解释的,主要是考验大家的工程能力了,包括代码编写和调参技巧等(????)。
2 Occlusion-aware R-CNN: Detecting pedestrians in a Crowd
该论文由中科院出品,也是用来解决行人检测中的遮挡问题的。主要从2个方面做的优化,优化目标+网络结构。
2.1 优化目标
跟face++的工作有一些区别,这里的优化有两个目标,(1)所有的预测框逼近对应的Target框;(2)属于同一Target框的多个预测框尽量集中。原文中的话是这么说的,“To enforce the proposals locate closely and compactly to the ground-truth object”,其中“closely”对应目标(1),“compactly”对应目标(2)。具体的公式表达如下,
其中,对应目标(1),对应目标(2),这里的"com"是"compactly"的缩写。
2.2 PORoI层
PORoI,全称为“Part Occlusion-aware RoI Pooling Unit”,在Faster RCNN算法中,RPN部分会生成目标的候选区域,如下图中的红色方框所示,ROI Pooling会将该红色区域缩放到固定尺寸,记作,对于行人检测任务,作者考虑到人体人体具有特殊的结构,为了充分利用这一prior knowledge,从红色候选区域中切分出5个子区域,如图中蓝色的框所示。每一个蓝色框经过ROI Pooling操作后都会变成尺寸为的特征图。
因为这5个子区域可能会有遮挡,图中的“Occlusion process unit”是用来生成对应子区域的“可见度”打分,若该子区域被遮挡,则打分较低,否则打分较高,作者作用用了element-wise sum操作将所有子区域的特征合并,用于最终的分类和定位任务。
笔者认为,该PORoI层存在两处待改进的地方,(1)将人体分成5个子区域是否合理,分成更多的子区域是否会效果更好,作者文中没有贴相关对比;(2)因为不同子区域对应不同的特征,“Eltw sum”操作进行特征融合,破坏了特征的结构性,需要探索更加合理的特征融合方式,使它能结合位置先验信息。
3 总结
(1)两篇文章都是针对行人检测中的遮挡问题,提出解决办法;
(2)face++的工作仅从优化目标的角度考虑,中科院的工作同时从优化目标和网络结构的角度考虑;
(3)两篇文章都是基于Faster RCNN算法框架做优化,且效果基本相当;
4 启发
(1)做出好的工作可以从优化损失函数和网络结构两方面考虑,对网络结构不需要完全颠覆已有结构,可以根据问题灵活定制某些层,也算是创新了。
(2)之前一直觉得,搞深度学习很少用到公式推导,工作内容一般都是围绕着洗数据和跑模型的,但是,看了这两篇文章,笔者发现这些好的工作成果,往往是作者先发现现有算法存在的问题,然后想到解决的办法,再做数学建模,最后则是工程实现了。这里比较重要的一环就是如何使用数学公式对问题进行建模,所以大家不用担心积累的数学功底派不上用场了,一起加油吧(????)。
5 参考资料
https://arxiv.org/abs/1711.07752