尽管目标检测算法整体上已经相对比较成熟,但是在特殊场景下的表现还有很多优化空间,比如图片中的目标有遮挡、图像运动模糊、目标为可改变形状的非刚性物体等。本文主要是针对遮挡问题,之前在做游戏目标检测时也遇到过这个问题,当时只是考虑增加训练样本的多样性,最近,笔者读了几篇解决目标检测中的遮挡问题的文章,也看了一些网友的解析,觉得若有所悟,不自觉地想把自己的理解记录下来,自认为“一万个人眼中有一万个哈姆雷特”,希望能够从某个侧面对大家有所帮助。

目标检测中存在两类遮挡,(1)待检测的目标之间相互遮挡;(2)待检测的目标被干扰物体遮挡。比如下图,
在这里插入图片描述
具体来说,如果检测任务的目标是汽车和人,那么汽车被人遮挡,而且人被干扰物体(牛)遮挡。因为算法只学习待检测的物体的特征,所以第二种遮挡只能通过增加样本来优化检测效果。

在现实的检测任务中,只有比较特殊的场景需要考虑遮挡问题,比如行人检测、公交车上密集人群检测、牲畜数量计算等,本文将介绍的两篇文章是针对行人检测问题的,也可以复用到其它的应用场景(ps: 大家如果想发paper,也可以借鉴这两篇文章解决问题的方式)。

1 Repulsion Loss: Detecting Pedestrians in a Crowd

1.1 现有方法的缺点

在上一篇博客中,笔者解释了目标检测中的后处理算法,这些后处理算法只能够能够去除冗余的proposals,对于误召回和漏检两种情况就无能为例了,该论文同样为face++出品,只不过从模型优化的角度解决误召回和漏检的问题。

比如下面的这张图,使用Faster RCNN等经典的检测器,其中 T 1 、 T 2 T_{1}、T_{2} T1T2为Groundtruth框,而 P 1 、 P 2 、 P 3 P_{1}、P_{2}、P_{3} P1P2P3为anchors(锚框),由于 P 2 P_{2} P2中包含了 T 2 T_{2} T2的部分区域,所以 P 2 P_{2} P2对应的proposal很容易受到 T 2 T_{2} T2的干扰,导致回归出来的proposal同时包含了目标 T 1 、 T 2 T_{1}、T_{2} T1T2的部分区域,不精准(?)。

可以更进一步来思考这个问题,假设图中的预测框 P 1 P_{1} P1不存在,也即 T 1 T_{1} T1对应的proposals只有 P 2 P_{2} P2,如果 T 2 T_{2} T2对应的max score的proposal近似为 P 3 P_{3} P3,那么当 P 2 P_{2} P2 P 3 P_{3} P3的IoU大于阈值时,在后处理nms阶段就会把 P 2 P_{2} P2过滤掉,从而导致更严重的情况, T 1 T_{1} T1漏召回了(?)。
在这里插入图片描述

1.2 解决办法

针对上面不精准漏召回的情况,比较直接的想法是,能不能让 P 2 P_{2} P2对应的预测框不受 T 2 T_{2} T2的干扰呢,想法很好,但是具体该怎么告诉模型不受干扰呢?

作者类比于磁铁的吸引力和排斥力作用,提出了Repulsion loss(斥力损失)。如下图,斥力损失的作用是对预测的proposal进行约束,使其不仅要靠近Target T T T引力作用),还要远离其它的Groundtruth物体 B B B以及 B B B对应的proposals(斥力作用)。如果 T T T的Surrounding Groundtruth包含了除 B B B以外的其它目标,则斥力损失会要求预测的proposal远离所有这些目标。
在这里插入图片描述

1.3 对问题做数学建模

作者提出了两个损失函数,RepGT和RepBox,前者用于对proposal向其它目标偏移的情况进行惩罚,从而实现斥力作用(编号为A),后者用于对proposal向其它目标对应的proposals靠近的情况进行惩罚,从而实现斥力作用(编号为B),因此检测结果对NMS算法更加鲁棒。斥力损失的数学表达式如下,
在这里插入图片描述
其中, L A t t r L_{Attr} LAttr表示引力作用, L R e p G T L_{RepGT} LRepGT表示斥力作用A, L R e p B o x L_{RepBox} LRepBox表示斥力作用B。 α 、 β \alpha、\beta αβ为超参数,用于平衡不同作用的权重。

作者是针对行人检测任务,为了简化,只考虑Two-class的情况,前景和背景,其中所有的前景为同一类别。

P = ( l P , t P , w P , h P ) P = (l_{P}, t_{P}, w_{P}, h_{P}) P=(lP,tP,wP,hP) G = ( l G , t G , w G , h G ) G = (l_{G}, t_{G}, w_{G}, h_{G}) G=(lG,tG,wG,hG)分别表示anchor和groundtruth的坐标, P + = { P } P_{+} = \{P\} P+={P}表示所有的Positive anchors, G 0 = { G } G^{0} = \{G\} G0={G}表示所有的groundtruth框,这里的 G 0 G^{0} G0表示下面公式中G对应的罗马符号形式(笔者不知道怎么敲出来这种形式?)。

1.3.1 引力作用

对于指定的anchor P ∈ P + P\in P_{+} PP+,可以计算它与所有groundtruth框的IoU,取IoU最大的作为Target框,公式表示如下,
在这里插入图片描述
定义 B P B^{P} BP为anchor P对应的预测框,那么需要满足预测框逼近Target框,度量两个框的逼近程度的方式包括欧氏距离、 S m o o t h L 1 Smooth_{L_{1}} SmoothL1距离、IoU等,作者使用了 S m o o t h L 1 Smooth_{L_{1}} SmoothL1距离,并且,对于训练集batch中的每一张图,需要考虑所有的anchors,因此公式表达如下,
在这里插入图片描述

1.3.2 斥力作用A

对于指定的anchor P ∈ P + P\in P_{+} PP+,可以计算它与所有groundtruth框的IoU,取IoU第二大的作为Target框,公式表示如下,
在这里插入图片描述
斥力作用A用于对 B P B^{P} BP逼近 G R e p P G_{Rep}^{P} GRepP的情况进行惩罚,作者使用了IoG(Intersection over Ground-truth)指标来衡量逼近程度,公式表达如下,
在这里插入图片描述
其中,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.3 斥力作用B

在上面的1.1部分,解释了当不同Target对应的预测框靠的太近时,容易出现漏召回的情况,斥力作用B用于将不同Target对应的预测框分离开。

对于所有的groundtruth框 G 0 = { G } G^{0} = \{G\} G0={G}表示,每个框 G G G都对应了一组anchors,那么所有的anchors可以分成 ∣ G 0 ∣ |G^{0}| G0组,公式表达如下,
在这里插入图片描述
显然,对于不同组中的anchors,比如 P i 、 P j P_{i}、P_{j} PiPj,斥力作用B要求它们对应的预测框 B P i 、 B P j B^{P_{i}}、B^{P_{j}} BPiBPj尽量远离,也即预测框之间的IoU越小越好,公式表达如下,
在这里插入图片描述
其中, 1 \bold{1} 1表示identity函数, ϵ \epsilon ϵ为一个很小的常数,防止分母为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)。具体的公式表达如下,
在这里插入图片描述
其中, L r e g L_{reg} Lreg对应目标(1), L c o m L_{com} Lcom对应目标(2),这里的"com"是"compactly"的缩写。

2.2 PORoI层

PORoI,全称为“Part Occlusion-aware RoI Pooling Unit”,在Faster RCNN算法中,RPN部分会生成目标的候选区域,如下图中的红色方框所示,ROI Pooling会将该红色区域缩放到固定尺寸,记作 m × m m\times m m×m,对于行人检测任务,作者考虑到人体人体具有特殊的结构,为了充分利用这一prior knowledge,从红色候选区域中切分出5个子区域,如图中蓝色的框所示。每一个蓝色框经过ROI Pooling操作后都会变成尺寸为 m × m m\times m m×m的特征图。

因为这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

https://arxiv.org/abs/1807.08407

https://zhuanlan.zhihu.com/p/43655912

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐