导读:这篇文章提出了新的一阶段检测算法Detection with Enriched Semantics(EDS),该算法在检测网络中通过semantic Segmentation branch以及global activation module增强了目标检测的语义特征,采用的是attention的思想增强特征中重要的成分。global activation module使用自监督的方法学习通道与目标类别之前的关系。基于VGG16的EDS算法在VOC2007数据集上获得了81.7的mAP,COCO上获得32.8的mAP,帧率为31.5FPS。
这篇文章的算法是基于SSD算法的改进,在SSD算法中大目标使用高阶的特征去预测,小目标使用浅层的特征去预测。文中指出这样会带来两个问题:
1)由于浅层的特征只是一些基本的视觉特征,就使得小目标检测性能并不好;2)由于浅层特征的不理想也会影响高层次特征的检测性能;对于第一个问题:使用图1中左下角的语义分割分支用于增强检测网络中的低层次特征。图2中的几幅图很好解释了语义分割分支增强特征的过程,原始的低层次特征(B)被语义分割的特征(C)激活(增强)之后得到强化之后的特征(D),这样特征(D)就兼容了语义分割和目标检测的特征,这个过程可以看做是attention的过程。 对于第二个问题:文章提出的网络结构还加入了Global Activation Module,该模块排除了定位的信息,使用自监督的方式学习特征通道与目标类别之间的关系,这样可以增强在较高层级中目标检测特征的语义信息。
文章的贡献:通过使用语义分割分支以及Global Activation Module增强了特征的语义信息,从而提升检测器的检测性能。为毛不在高层次的特征里面也使用Segmentation增强呢?文中给出的解释是低层次的特征里面已经做过了这样的操作,而且高层次的特征本来就是高度融合,分辨率也比较小,分割并不适合;
这里的语义分割是使用弱监督的形式,使用每个目标框的标注作为该分类的分割标注,这样就不需要额外的分割数据标注。整个的语义分割分支的结构见下图3所示,其中涉及到的先关过程及字母标志解析见下文。 这里使用 X ∈ R C ∗ H ∗ W X\in R^{C*H*W} X∈RC∗H∗W代表检测分支的低层次特征图, G ∈ { 0 , 1 , 2 , … , N } H ∗ W G\in \{0,1,2,\dots,N\}^{H*W} G∈{0,1,2,…,N}H∗W代表分割的GT,其中的参数 N N N代表检测分类的数目(VOC时为20,COCO为80),语义分割的输出 Y ∈ R ( N + 1 ) ∗ H ∗ W Y\in R^{(N+1)*H*W} Y∈R(N+1)∗H∗W,因而可以用数学形式表示为: Y = F ( g ( X ) ) Y=F(g(X)) Y=F(g(X)) 其中满足: Y ∈ [ 0 , 1 ] ( N + 1 ) ∗ H ∗ W , ∑ c = 0 N Y c , h , w = 1 Y\in [0,1]^{(N+1)*H*W},\sum_{c=0}^{N}Y_{c,h,w}=1 Y∈[0,1](N+1)∗H∗W,∑c=0NYc,h,w=1。 分割的中间结果 g ∈ R C ′ ∗ H ∗ W g\in R^{C^{'}*H*W} g∈RC′∗H∗W是分割的中间结果,用于产生最后的分割结果也用来生成激活特征 Z = H ( g ( x ) ) ∈ R C ∗ H ∗ W Z=H(g(x)) \in R^{C*H*W} Z=H(g(x))∈RC∗H∗W。之后激活特征通过与原始特征点乘得到激励之后的输出,该输出被用来替换掉原始的输入 X X X。 对于分割任务中GT的设置,分割的标注是来自于检测标注信息,其标注产生的原则见下图4:
高层次的特征由Global Activation Module完成,该模块由三个阶段组成:spatial pooling、channel-wise learning和broadcasted multiplying。对于输入的特征 X ∈ R C ∗ H ∗ W X\in R^{C*H*W} X∈RC∗H∗W,spatial pooling可以被描述为: Z i = 1 H W ∑ h , w X i h w Z_i=\frac{1}{HW}\sum_{h,w}X_{ihw} Zi=HW1h,w∑Xihw chanel-wise learning由激活函数产生: S = S i g m o i d ( W 2 ⋅ R e L U ( W 1 Z ) ) ∈ R C ∗ 1 ∗ 1 S=Sigmoid(W_2 \cdot ReLU(W_1 Z))\in R^{C*1*1} S=Sigmoid(W2⋅ReLU(W1Z))∈RC∗1∗1 对于broadcasted multiplying就是对应通道上的点乘了。
对于原有的检测网络其定位的损失描述为: L d e t ( I , B ) L_{det}(I,B) Ldet(I,B),而在文章中有为其增加了分割分支,因而还需要加入分割分支的损失: L ( I , B , G ) = L d e t ( I , B ) + α L s e g ( I , G ) L(I,B,G)=L_{det}(I,B)+\alpha L_{seg}(I,G) L(I,B,G)=Ldet(I,B)+αLseg(I,G) 文章给出的结论显示 α = 0.1 \alpha=0.1 α=0.1所取得的效果是最好的。
在VOC数据集上的检测性能: COCO数据集上的检测性能: