赞
踩
尽管目标检测算法整体上已经相对比较成熟,但是在特殊场景下的表现还有很多优化空间,比如图片中的目标有遮挡、图像运动模糊、目标为可改变形状的非刚性物体等。本文主要是针对遮挡问题,之前在做游戏目标检测时也遇到过这个问题,当时只是考虑增加训练样本的多样性,最近,笔者读了几篇解决目标检测中的遮挡问题的文章,也看了一些网友的解析,觉得若有所悟,不自觉地想把自己的理解记录下来,自认为“一万个人眼中有一万个哈姆雷特”,希望能够从某个侧面对大家有所帮助。
目标检测中存在两类遮挡,(1)待检测的目标之间相互遮挡;(2)待检测的目标被干扰物体遮挡。比如下图,
具体来说,如果检测任务的目标是汽车和人,那么汽车被人遮挡,而且人被干扰物体(牛)遮挡。因为算法只学习待检测的物体的特征,所以第二种遮挡只能通过增加样本来优化检测效果。
在现实的检测任务中,只有比较特殊的场景需要考虑遮挡问题,比如行人检测、公交车上密集人群检测、牲畜数量计算等,本文将介绍的两篇文章是针对行人检测问题的,也可以复用到其它的应用场景(ps: 大家如果想发paper,也可以借鉴这两篇文章解决问题的方式)。
在上一篇博客中,笔者解释了目标检测中的后处理算法,这些后处理算法只能够能够去除冗余的proposals,对于误召回和漏检两种情况就无能为例了,该论文同样为face++出品,只不过从模型优化的角度解决误召回和漏检的问题。
比如下面的这张图,使用Faster RCNN等经典的检测器,其中 T 1 、 T 2 T_{1}、T_{2} T1、T2为Groundtruth框,而 P 1 、 P 2 、 P 3 P_{1}、P_{2}、P_{3} P1、P2、P3为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} T1、T2的部分区域,不精准(?)。
可以更进一步来思考这个问题,假设图中的预测框
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被漏召回了(?)。
针对上面不精准和漏召回的情况,比较直接的想法是,能不能让 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远离所有这些目标。
作者提出了两个损失函数,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对应的罗马符号形式(笔者不知道怎么敲出来这种形式?)。
对于指定的anchor
P
∈
P
+
P\in P_{+}
P∈P+,可以计算它与所有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,因此公式表达如下,
对于指定的anchor
P
∈
P
+
P\in P_{+}
P∈P+,可以计算它与所有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.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}
Pi、Pj,斥力作用B要求它们对应的预测框
B
P
i
、
B
P
j
B^{P_{i}}、B^{P_{j}}
BPi、BPj尽量远离,也即预测框之间的IoU越小越好,公式表达如下,
其中,
1
\bold{1}
1表示identity函数,
ϵ
\epsilon
ϵ为一个很小的常数,防止分母为0。
从优化目标可以看出,不同Target对应的预测框最终会分的很开,避免了NMS后处理中因为合并预测框导致的漏召回情况。
这一部分没什么好解释的,主要是考验大家的工程能力了,包括代码编写和调参技巧等(?)。
该论文由中科院出品,也是用来解决行人检测中的遮挡问题的。主要从2个方面做的优化,优化目标+网络结构。
跟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"的缩写。
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”操作进行特征融合,破坏了特征的结构性,需要探索更加合理的特征融合方式,使它能结合位置先验信息。
(1)两篇文章都是针对行人检测中的遮挡问题,提出解决办法;
(2)face++的工作仅从优化目标的角度考虑,中科院的工作同时从优化目标和网络结构的角度考虑;
(3)两篇文章都是基于Faster RCNN算法框架做优化,且效果基本相当;
(1)做出好的工作可以从优化损失函数和网络结构两方面考虑,对网络结构不需要完全颠覆已有结构,可以根据问题灵活定制某些层,也算是创新了。
(2)之前一直觉得,搞深度学习很少用到公式推导,工作内容一般都是围绕着洗数据和跑模型的,但是,看了这两篇文章,笔者发现这些好的工作成果,往往是作者先发现现有算法存在的问题,然后想到解决的办法,再做数学建模,最后则是工程实现了。这里比较重要的一环就是如何使用数学公式对问题进行建模,所以大家不用担心积累的数学功底派不上用场了,一起加油吧(?)。
https://arxiv.org/abs/1711.07752
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。