论文名称:Rethinking BiSeNet For Real-time Semantic Segmentation

作者:Mingyuan Fan, Shenqi Lai, Junshi Huang, Xiaoming Wei, Zhenhua Chai, Junfeng Luo, Xiaolin Wei

code:https://github.com/MichaelFan01/STDC-Seg(尚未开源)

摘要

BiSeNet是目前流行的实时分割两流网络,但是添加额外的路径去进行编码非常耗时,并且由于任务专用设计的不足,主干可能无法有效地进行图像分割。

本文提出了STDC网络,通过消除结构冗余来实短期密集级联网络。

逐渐减小特征图维度,并将他们聚集用于图像表示,这构成了STDC网络的基本模块。在解码器中,我们通过将空间信息的学习以单流的方式集成到底层中,从而提出了一个细节集合模块。最后将底层特征和深层特征融合在一起,以预测最终的分割结果。

Short-Term Dense Concatenate Module(STDC,短期密集级联模块)

image-20210506175229299

ConvX

​ STDC模块的基本结构如图b所示,在STDC模块中的ConvX计算可以用以下公式表示:

xi=ConvXi(xi1,ki)x_{i}=\operatorname{Conv} X_{i}\left(x_{i-1}, k_{i}\right)

其中xix_ixi1x_{i-1}分别表示第ii层的输出和输入结果

ConvXiConvX_i表示Conv+BN+RLU的过程,kik_i表示卷积核,

STDC结构

在第一个块中,设置其卷积核的大小为1,其他块的卷积核大小都设置成3。

设置STDC结构输出通道为N,于是在第i个块中,使用卷积核的数量为N2i\frac N{2^i}(也就是说,经过第一个块的卷积之后输出的feature map的通道数为N2i\frac {N}{2^i})。唯一不同的是,最后一个块使用的卷积核数量是和他的前一个块相等的。

在通常的图像分类任务中,通常的做法是在更高的层中使用更多的通道,但是在语义分割任务中,我们专注于可拓展的接收域和多尺度信息。底层需要足够多的通道赖编码具有**较小接收场(receptive field)**的高层将更多地集中与高层信息的归纳,在底层中设置相同的通道可能会造成过多的信息冗余。

下采样只在Block2中进行。

为了获取丰富的特征信息,作者链接x1x_1~xnx_n的特征图,作为STDC模块的输出。在进行级联之前,通过使用3×33\times3的平均池化,将STDC模块中不同尺寸的feature map下采样到同样的尺寸。

STDC最终输出的结果为

xoutput=Fx1,x2,...,xnx_{output} = F{x_1,x_2,...,x_n}

其中xoutputx_{output}表示STDC模块的输出,

F是融合操作(拼接)

x1x_1~xnx_n是来自所有n个块的feature map

优点

  1. 通过逐渐减小几何级数的方式来精心调整块的卷积核数量,从而显着降低了计算复杂性。
  2. 将每个块的feature map拼接起来,保留可变接收场和多尺度信息。

对于输入为M通道,输出为N通道的STDC模块的**参数编号(parameter number)**为:

Sparam =M×1×1×N21+i=2n1N2i1×3×3×N2i1+N2n1×3×3×N2n1=NM2+9N223×i=0n3122i+9N222n2=NM2+3N22×(1+122n3)\begin{aligned} S_{\text {param }} &=M \times 1 \times 1 \times \frac{N}{2^{1}}+\sum_{i=2}^{n-1} \frac{N}{2^{i-1}} \times 3 \times 3 \times \frac{N}{2^{i-1}}+ \frac{N}{2^{n-1}} \times 3 \times 3 \times \frac{N}{2^{n-1}} \\ =& \frac{N M}{2}+\frac{9 N^{2}}{2^{3}} \times \sum_{i=0}^{n-3} \frac{1}{2^{2 i}}+\frac{9 N^{2}}{2^{2 n-2}} \\ =& \frac{N M}{2}+\frac{3 N^{2}}{2} \times\left(1+\frac{1}{2^{2 n-3}}\right) \end{aligned}

STDC模块的参数编号由先前定义的输入和输出决定,而块的数量对参数尺寸的影响很小。特别是,如果n(块的数量)达到最大限制,则STDC的参数编号几乎保持恒定,仅通过输入和输出定义。

网络架构

image-20210507092726902

网络主要结构就是6个阶段构成,在1~5的阶段中,进行的是步长为2的下采样,到第六阶段,显示使用一个ConvX,接着做一个全局平均池化,最后使用两个全链接层输出最终的预测结果。

在前两阶段中只,每个层都只使用了一个ConvX,在3,4,5阶段中使用的是STDC模块,在每个阶段的第一个STDC中使用了步长为2的下采样,其他都保持和原来的尺寸一致。

网络的详细参数为如图:

image-20210507093839856

编码器的设计

image-20210510132808332

ARM表示注意力细化模块,FFM表示特征融合模块,红色虚线框中的操作是STDC网络,蓝色虚线是细节信息汇总模块(Detail Aggregation Module)

分割结构

本文采用预训练的STDC网络作为编码器主干,并采用BiSeNet的内容路径(context path)去编码上下文信息。如网络图a,采用Stage3,4,5,分别生成i下采样比例为18,116,132\frac 18 ,\frac 1{16},\frac 1{32}的特征图,然后我们使用全局平均池化,来提供具有**最大接收域(large receptive field)**的全局上下文信息。

部署U形结构以对来自全局的特征进行上采样,并将每个特征与我们在编码阶段的最后两个阶段(第4和第5阶段)的对应特征进行融合。使用**注意力细化模块(Attention Refine module 简称ARM)**来细化每个极端的组合特征。

对于最后的语义分割预测,我们在BiSeNet中采用特征融合模块,将编码器第3阶段的18\frac 18下采样特征与编码器的对应特征融合。这两个阶段特征处于,不同的特征表示级别。编码主干网络提供了丰富的细节信息特征,而解码器的功能则来自全局池化层的输入而包含了上下文信息。

在**语义头(Seg Head)中使用了一个3x3的Conv-BN-ReLU操作和一个1x1卷积去扩展特征图的通道数和类别数N相同。采用交叉熵损失与Online Hard Example Mining(不知道是什么东西)**去优化语义分割的学习任务。

低级特征的细节引导(Detail Guidance of Low-level Feature)

image-20210510135507637

在上图中,b展示了BiSeNet的**空间路径(Spatial Path)**特征,与具有相同下采样率的骨干底层(阶段3)相比,空间路径可以编码更多的空间细节。为此,本文提出一个细节指导模块,以指导底层以单流的方式学习空间信息。

本文把细节预测建模成一个二分割任务,首先生成从分割的ground-truth通过拉普拉斯(Laplacian)卷积生成细节图ground-truth(编码器设计那张图的c)。在第3阶段插入细节头(Detail Head)以生成细节特征图,然后,以细节为基础,以细节特征图为指导,指导底层层次学习空间细节特征。如上图d所示,与图c相比多了更多的空间细节。最后将学习到的细节特征与来自解码器深层块的上下文特征融合在一起,以进行分割预测。

细节ground-truth生成(Detail Ground-truth Generation)

通过使用**细节信息汇总模块(Detail Aggregation Module)**从语义分割GT中生成二值化的细节GT。(编码器设计那张图的c蓝色虚线部分)可以通过使用Laplacian kernel和一个1×11 \times 1的卷积来执行此操作。

使用编码器设计那张图的e的拉普拉斯算子(Laplacian operators),使用不同的步长,获得h多尺度信息,最后生成产生细致的细节特征图。

接着将细节特征图上采样至原图的大小,并将其与可训练的1×11\times1卷积核融合以进行动态重新贴合。u自后采用阈值为0.1将预测的细节转换为具有边界和角点信息的最终二值化细节GT

细节损失(Detail Loss)

​ 采用二分交叉熵(binary cross-entropy)和dice loss共图优化细节的学习。dice loss衡量了预测图和GT之间的重叠。而且,对于前景/背景像素的数量不敏感,这意味着他可以缓解分类数不平衡的问题。因此对于高度为H,宽度为W的预测细节图的细节损失LdetailL_{detail}可以用公式表示:

Ldetail (pd,gd)=Ldice (pd,gd)+Lbce(pd,gd)L_{\text {detail }}\left(p_{d}, g_{d}\right)=L_{\text {dice }}\left(p_{d}, g_{d}\right)+L_{b c e}\left(p_{d}, g_{d}\right)

其中:pdRH×Wp_{d} \in \mathbb{R}^{H \times W}表示预测细节

gdRH×Wg_{d} \in \mathbb{R}^{H \times W}表示相应的细节GT

LbceL_{bce}表示二分交叉熵损失

LdiceL_{dice}表示dice损失,其可用公式表示:

Ldice(pd,gd)=12iH×Wpdigdi+ϵiH×W(pdi)2+iH×W(gdi)2+ϵL_{d i c e}\left(p_{d}, g_{d}\right)=1-\frac{2 \sum_{i}^{H \times W} p_{d}^{i} g_{d}^{i}+\epsilon}{\sum_{i}^{H \times W}\left(p_{d}^{i}\right)^{2}+\sum_{i}^{H \times W}\left(g_{d}^{i}\right)^{2}+\epsilon}

其中i表示第i个像素,ϵ\epsilon是避免除0的拉普拉斯平滑项,在本文中将其设置为1

细节头(Detail Head)

在(编码器设计那张图的b)中,使用细节头(Detail Head)生成细节图,该细节图指导浅层对空间信息进行编码。

细节头包括一个3×33 \times 3的Conv-BN-ReLU运算,接着一个1×11 \times 1的卷积以获取输出详细信息图。

在实验中,细节头被证明可以有效地增强特征表示,注意:在推理的时候是不走这一个分支的。

因此,该辅助信息可以提高分割任务的精度而在推理上又不会占用开销。

实验过程

使用数据集和评估指标

数据集:IamgeNet,Cityscapes,CamVid

评估指标:Miou和FPS

实施细节

图像分类

使用batch为64,momentum为0.9,权重衰减为1e41e^{-4}的SGD优化器来训练模型,采用三种训练方式,包括学习率预热(learning rate warmup),余弦学习率(cosine learning rate)策略和标签平滑(label smoothing)。总共训练300个epoch,前5个epoch采用学习率预热,学习率从0.001到0.1。在分类块前的dropout设置为0.2。不使用数据增强。

语义分割

使用momentum为0.9,权重衰减为5e45e^{-4}的SGD优化器。对于Cityscapes,CamVid数据集,批次大小设置为48和24。

采用"poly"学习率策略,在初始学习率中乘以$\left(1-\frac{\text { iter }}{\text { max_iter }}\right)^{\text {power }} $

power设置为0.9,初始学习率设置为0.01

分别为Cityscapes,CamVid数据集训练了60000,10000次迭代的模型,其中在前1000次,200次迭代中采用了预热策略。