参考代码:CTDNet
1. 概述
导读:这是一篇关于显著性目标检测的文章,文章对影响显著性目标检测的网络各个部分进行探究,也就是将需要在一张图像中获取的信息划分为3个部分:语义上下文信息、像素空间信息、显著性目标边界信息,对应的特征图的层级也是由高到低。在这篇文章中比较清晰明了总结出了影响显著性目标检测性能的几个因素,因而以此为基础针对性设计网络结构,使得整体网络展现除了较高的运算效率(排除一些冗余部分),基于ResNet-18的网络能在1080 Ti GPU上跑到180FPS,大一些基于ResNet-50的网络也能跑到110FPS。一般来讲显著性目标检测和分割类算法是具有一些相通特性的,也可以反过来作用于分割算法,从而得到更好更快的分割网络。
在显著性目标检测(语义分割)算法中会经常使用U型网络结构用以兼顾上下文语义与局部信息,从而在较大程度上提升网络的性能,也就是下面图中的a图。
而文章的方法从效率和网络特征表达的角度进行分析,将解码器网络部分划分成为了3相互关联的信息提取部分,也就结合上图b中看到的:Semantic Path、Spatial Path、Boundary Path。文章这样进行改进主要出于如下3点缘由:
- 1)U型网络在取得较为不错的性能下,其带来的计算量开销也是很大的;
- 2)在编码器阶段会采用下采样的方式会导致像素的局部空间信息丢失,虽然在解码器部分会采用shortcut的方式进行补充,但是对应的像素空间位置信息丢失问题却不能得到很好解决;
- 3)语义信息在解码器网络中传递(从高层次的语义信息到低层次的局部像素信息)是会存在语义上下文信息丢失的情况的,这就会导致分割错误的情况;
按照上述的思想对网络进行改进之后,将该方法与其它方法在性能与速度上进行比较:
2. 方法设计
2.1 网络结构
文章提出的网路结构见下图所示:
在上图中可以看到文章的方法抽取backbone输出stride为
[
4
,
8
,
16
,
32
]
[4,8,16,32]
[4,8,16,32]的特征图用于构建解码器,在高层次的stage上构建semantic path,在次高层级上构建spatial path,在低层级上构建boundary path。在这些path的构架过程中,采用了对应的策略用于特征之间的融合操作。
2.2 各路path构建
2.2.1 Semantic Path
这部分主要用于抽取目标的语义信息,可以理解为大块区域的锁定。因而需要较大范围的感受野,这里使用的Global Average Pooling操作(当然也可以换作其它的感受野扩充操作,如strip-pooling、pyramid pooling等)。这里使用到了一个特征融合模块FFM,其结构为:
2.2.2 Spatial Path
在语义分支部分获取到了丰富语义信息之后,接下来需要在低层次的特征中提取具有更加高分辨率的像素判别信息,对此编码器输出的特征会经过SAM模块进行空间信息增强,其结构如下:
在spatial-wise上通过max&avg对空间特征进行优化之后,便需要结合semantic path得到的语义上下文信息,这里使用到的模块为CAM模块,其结构如下:
2.2.3 Boundary Path
在这一层级上空间分辨率得到提升,因而需要网络具有更加细节的表达能力,对于显著型慕白哦检测而言对应的便是边界区域(在上面的分支中已经解决了大块的正确和错误问题,假如的话),这里便直接引入目标的boundary mask作为显式监督信息,从而构建边界的优化,这里用到的边界优化模块为BRM,其结构为:
上述各路path中木块对最后性能的影响:
2.3 损失函数
网络的损失函数是边界损失函数加上各级显著性目标损失函数的形式,可以描述为:
L
=
L
b
c
e
(
P
b
,
G
b
)
+
∑
k
=
1
5
(
β
L
b
c
e
(
P
k
,
G
)
+
L
i
o
u
(
P
k
,
G
)
)
L=L_{bce}(P_b,G_b)+\sum_{k=1}^5(\beta L_{bce}(P^k,G)+L_{iou}(P^k,G))
L=Lbce(Pb,Gb)+k=1∑5(βLbce(Pk,G)+Liou(Pk,G))