分享IJCV2021上发表的一篇文章BiSeNetv2,这是BiSeNet的升级版本。开源代码地址:https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2
语义分割是指为每个像素分配一个标签,它广泛用于场景理解、自动驾驶、人机交互、视频监控等领域中。近年来,随着卷积神经网络的发展,研究者们提出了一系列基于全卷积网络的语义分割算法,它们都达到了很好的性能。
全卷积网络的高性能往往来自于比较好的backbone,在语义分割任务中,有2种常用的backbone:
(1)使用了空洞卷积模块的backbone,在backbone中移除了部分下采样操作,使用空洞卷积增加感受野,同时保持feature map的尺寸以保留丰富的空间信息,如下图所示:
(2)使用了Encoder-Decoder的backbone,在decoder模块中,使用skip connections的方式恢复空间信息,如下图所示:
这2类backbone在设计时,没有充分考虑推理时间和计算资源的优化:
(1)空洞卷积的引入、下采样操作的移除,都会引入比较大的计算复杂度和显存消耗;
(2)encoder和decoder中的skip connections会增加显存消耗。
面对实时语义分割的需求,基于上面2种类型的backbone,一般采用以下方法降低模型对硬件资源的消耗:
尽管这些方法能够有效地提高模型推理速度,但是牺牲了低层次特征,降低了网络的表达能力,导致模型性能下降。因此,设计一个兼顾性能和推理速度的语义分割算法是很重要的。
在语义分割任务中,空间细节信息和高级语义信息都是很重要的,如果不考虑推理速度,可以用一个深的、feature map尺寸大的网络去提取特征;而为了平衡精度和推理速度,作者提出了two-pathway的网络架构Bilateral Segmentation Network(BiSeNet V2)。在该结构中,一个分支提取空间细节信息,另一个分支提取高级语义信息。
BiSeNetv2的大体结构如下图所示:
网络主要包含3部分
Detail分支负责提取低级空间细节信息,该分支有如下特点:
Detail分支的网络结构如下图所示,该分支共3个stage,每个卷积操作后面都有BN和激活函数。每个stage中第1个卷积层的步长都是2,其余卷积层的步长是1。因此Detail分支的输出feature map尺寸是原图的1/8。该分支的网络结构设计遵循VGG的设计准则,同时避免使用残差链接。
Semantic分支用于提取高级语义信息,该分支有如下特点:
Semantic分支的网络结构如图4所示,包含如下3部分:
(1)Stem Block
结构如下图所示:
Stem Block在2个分支中使用了2种不同的下采样操作,2个分支的输出通过concat操作进行融合。
(2)Gather-and-Expansion Layer(GE)
Gather-and-Expansion Layer在设计时借鉴了MobileNetv2中的inverted bottleneck结构,inverted bottleneck结构如图6(a)所示,虚线表示当该模块的步长为2时,残差连接不存在;当该模块的步长为1时,残差连接存在。
步长为1时,Gather-and-Expansion Layer的结构如图6(b)所示:
当步长为2时,Gather-and-Expansion Layer的结构如图6©所示:
(3)Context Embedding Block(CE)
结构如下图所示:
该模块使用全局平均池化和残差连接提取全局上下文特征。
特征融合模块用于融合Detail分支和Semantic分支提取到的特征。由于Semantic分支中包含较多的下采样操作,该分支的输出feature map尺寸较小,因此要对Semantic分支输出的feature map进行上采样操作,使其与Detail分支输出的feature map尺寸一致。通过元素相加或者concat的方式融合2个分支的特征是不合适的,因为这忽略了2个分支输出特征的差异性。
作者提出了Bilateral Guided Layer用于融合2个分支的特征,结构如下图所示:
上图中的 ⊗ \otimes ⊗表示元素乘法操作。该结构能够使得2个分支互相通信、互为引导。
综上,BiSeNetv2的总体结构如下图所示,紫色框内是2个分支,红色框内是融合结构,Down表示下采样操作,Up表示上采样操作, φ \varphi φ表示Sigmoid函数, ⊗ \otimes ⊗表示元素乘法。
为了进一步提高模型精度,训练时,在Semantic分支的不同位置增加了若干个辅助Segmentation Head,如图9橙色框内所示,这些结构仅用于训练,在推理时会删掉它们。
辅助Segmentation Head的结构如下图所示:
在上图中,使用 C i C_i Ci控制卷积的通道数, S S S表示上采样倍数, N N N表示最终输出的feature map的通道数。
超参数 在训练时,使用kaiming normal方式进行权重初始化,使用SGD优化器,batch size=16,momentum=0.9,初始学习率为 5 e − 2 5 e^{-2} 5e−2,学习率变化策略为初始学习率乘以 ( 1 − i t e r iter s max ) power \left(1-\frac{i t e r}{\text { iter } s_{\max }}\right)^{\text {power }} (1− iter smaxiter)power ,其中 power = 0.9 {\text {power }}=0.9 power =0.9。对于Cityscapes和CamVid数据集,weight_decay=0.0005,对于COCO-Stuff数据集,weight_decay=0.0001。对于Cityscapes和CamVid、COCO-Stuff这3个数据集,训练的迭代次数分别为150K、10K、20K。
数据增强 使用了随机水平翻转、随机缩放、随机裁剪进行数据增强。随机缩放的尺度为 { 0.75 , 1 , 1.25 , 1.5 , 1.75 , 2.0 } \{0.75,1,1.25,1.5,1.75,2.0\} {0.75,1,1.25,1.5,1.75,2.0}。
BiSeNetv2在Cityscapes数据集上的性能如下,输入到BiSeNetv2模型中的图像尺寸为 1024 × 512 1024 \times 512 1024×512。上表中的 γ \gamma γ表示输入模型的图像尺寸对于 2048 × 1024 2048 \times 1024 2048×1024的下采样率。
BiSeNetv2在CamVid数据集上的性能如下,输入模型的图像尺寸为 960 × 720 960 \times 720 960×720。下表中的 * \text { * } * 表示该模型先在Cityscapes数据集上进行预训练。
BiSeNetv2在COCO-Stuff数据集上的性能如下,输入图像分辨率为为 640 × 640 640 \times 640 640×640。
如果你对计算机视觉领域的目标检测、跟踪、分割、轻量化神经网络、Transformer、3D视觉感知、人体姿态估计兴趣,欢迎关注公众号一起学习交流~
欢迎关注我的个人主页,这里沉淀了计算机视觉多个领域的知识:https://www.yuque.com/cv_51