前言
本
文介绍一种新颖的单分支实时分割网络,称为SCTNet。通过学习利用从transformer到CNN的语义信息对齐来提取丰富的语义信息,SCTNet在保持轻量级单分支CNN的快速推理速度的同时,享受transformer的高准确性。为了缓解CNN特征和Transformer特征之间的语义差距,设计了CFBlock(ConvFormer块),它仅使用卷积操作就能像Transformer块一样捕获长距离上下文。此外,提出了SIAM(语义信息对齐模块),以更有效的方式对齐特征。
论文题目
:
SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation
中文题目:
单分支CNN结合Transformer语义信息的实时分割网络
论文链接:
https://arxiv.org/pdf/2312.17071
官方github:
https://github.com/xzz777/SCTNet
所属机构:
华中科技大学人工智能与自动化学院国家多媒体信息智能处理技术重点实验室,美团
关键词:
实时语义分割,Transformer,单分支CNN,语义信息对齐,深度学习
图5:在Cityscapes验证集上的可视化结果。与DDRNet-23(Pan等人,2022年)和RTFormer-B(Wang等人,2022年)相比,SCTNet-B生成的掩码具有更精细的细节,如浅蓝色框中突出显示的那样,以及更准确的大面积预测,如黄色框中突出显示的那样。
研究背景:
-
实时语义分割方法:
近期的实时语义分割方法通常采用额外的语义分支来追求丰富的长距离上下文信息,但额外的分支会带来不希望的计算开销并减慢推理速度。
二、方法
图3:SCTNet的架构。CFBlock(Conv-Transformer,详见图4)通过SIAM(语义信息对齐模块)利用训练仅限的Transformer分支(在虚线框中以灰色显示),该模块由BFA(主干特征对齐)和SDHA(共享解码器头对齐)组成。
图4:Conv-Former块的设计(左)和卷积注意力的细节(右)。GDN表示分组双重归一化。⊗表示卷积操作,⊕代表加法,k表示核大小。
Conv-Former Block旨在模拟 Transformer 的结构,以更好地学习 Transformer 分支的语义信息,同时仅使用高效的卷积操作来实现注意力功能:
1.
结构设计:
Conv-Former Block 的结构类似于典型的 Transformer 编码器。
2. 卷积注意力:
为了实现低延迟和强大的语义提取能力,Conv-Former Block 的卷积注意力基于 GFA(GPU-Friendly Attention)改进而来。主要区别在于:
3.
实现细节:
为了提高效率,Conv-Former Block 使用条带卷积来近似标准卷积层。具体来说,使用 1×k 和 k×1 的卷积来近似 k×k 的卷积层。
4. 前馈网络(FFN):
与典型的 FFN 相比,Conv-Former Block 的 FFN 由两个标准的 3×3 卷积层组成,这比典型的 FFN 更高效,并提供了更大的感受野。
CFBlock 结合卷积和 Transformer 的特性,通过 Conv-Former 高效建模局部和全局依赖关系,能够在多种视觉任务中发挥作用,尤其是在需要平衡性能与效率的场景下(如实时检测或分割任务)。可以调整模块中卷积核的尺度、注意力头的数量以及中间通道数,以适配不同任务的需求。
注:
Convolutional Attention模块也可单独拿出来使用!
-
ADE 20K数据集上:
SCTNet-B实现了43.0%的mIoU和145.1 FPS,比RTFormer-B快约1.6倍,同时mIoU性能高出0.9%。SCTNet-S达到了37.7%的mIoU,保持了在ADE 20K上所有方法中最高的FPS。
温馨提示:
对于所有推文中出现的代码,
如果您在微信中复制的代码排版错乱,请复制该篇推文的链接,在任意浏览器中打开,再复制相应代码,即可成功在开发环境中运行!或者进入官方github仓库找到对应代码进行复制!
import torch
from torch import nn
import torch.nn.functional as F
from mmengine.model import constant_init, kaiming_init,trunc_normal_init,normal_init
from timm.models.layers import DropPath
# 论文题目:SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation
# 中文题目: 单分支CNN结合Transformer语义信息的实时分割网络
# 论文链接:https://arxiv.org/pdf/2312.17071
# 官方github:https://github.com/xzz777/SCTNet
# 所属机构:华中科技大学人工智能与自动化学院国家多媒体信息智能处理技术重点实验室,美团
# 关键词:实时语义分割,Transformer,单分支CNN,语义信息对齐,深度学习
#BN->Conv->GELU->drop->Conv2->drop
class MLP(nn.Module):
def __init__(self,
in_channels,
hidden_channels=None,
out_channels=None,
drop_rate=0.):
super(MLP,self).__init__()
hidden_channels = hidden_channels or in_channels
out_channels = out_channels or in_channels
self.norm = nn.BatchNorm2d(in_channels, eps=1e-06)
self.conv1 = nn.Conv2d(in_channels, hidden_channels, 3, 1, 1)
self.act = nn.GELU()
self.conv2 = nn.Conv2d(hidden_channels, out_channels, 3, 1, 1)
self.drop = nn.Dropout(drop_rate)
self.apply(self._init_weights)
def _init_weights(self, m):
if isinstance