SCTNet

本文介绍了由华中科技大学和美团合作研发的实时语义分割算法SCTnet,它在AAAI上发表,通过单分支网络架构和蒸馏模型,结合SegFormer的远程上下文建模能力,提高了推理速度并实现实时部署。SCTnet的网络结构包括CNN分支和Teacher分支,以及CFBlock和Siam模块,以减少语义差距和优化特征对齐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sctnet是由华中科技大学和美团联合2024年发表在AAAI上的一篇文章。他达到实时语义分割的新sota。

实时语义分割本质仍是语义分割,但是他追求高的推理速度。目标是可以实时部署在cpu上。

现有的几种实时语义分割网络结构:

(a)a这种方法是双边网络,如BiSeNet,他讲网络分为两个支路,分别是Spatial Path和Context Path。图(a)左边的支路是Context Path既语义分支,他最后1/32的特征图有更大的感受野,从而有更丰富的语义信息,而右边的支路为Spatial Path既空间信息分支,他的网络较浅,特征图大小是原图片的1/8,保留更多的空间信息。最后的FM模块是Feature Fusion Module模块,特征融合模块用于融合CP和SP提供的输出特征。

(b)b这种网络先对图像进行1/2、1/4和1/8的下采样,再分别用两个分支进行处理,和(a)结构类似,左边为语义分支,右边为空间分支,FM模块就是将左边语义分支的特征图经过上采样,激活函数处理,再与右边分支的特征图相乘。进一步致力于增强提取丰富远程上下文的能力或降低空间分支的计算成本,最终得到输出。

(c)c就是本文提出的单分支网络架构,他整体使用蒸馏模型。用sgeformer作为teacher模型,因为segformer显著的远程上下文建模能力,在训练时才使用teacher模型,不需要额外的分支和昂贵的推理融合模块。有效地提取信息,避免了双边网络带来的巨大计算量。SIAM是语义对齐模块,其实就是一个CWD损失函数。

下面我们仔细介绍他的网络结构。

上面的分支为CNN分支,总共分为4个stage。下面的分支为teacher分支,具体来说是segformer模型,首先得在segformer上训练数据集。然后再使用SCTnet训练。图片输入Stem模块和stage1后,使得高宽缩减到原来的1/4.,通过stage2,高宽缩为1/8,通过stage3,高宽缩为1/16,stage3后接一个下采样,高宽缩为1/32。

CF BlockM模块

为了减少transformer和CNN之间的语义差距,作者精心设计了一个类似transformer的CNN块,称为CFBlock,也就是一个卷积自注意模块。

他和transformer的encoder模块类似,不同点在于他使用Convolution Attention代替了self Attention。

他将特征图又经过两个分支,上面与Key1相乘,在通过组归一化,再与value1相乘,下面也类似,最后将上下两支路相加,输出。

源码中key1,key2实现就是生成两个可训练参数的tensor。后边将这两个key转置就能得到相应的value。

SIAM模块

是语义信息对齐模块,用于训练过程中的特征学习,如结构图所示。它可以分为主干特征对齐和共享解码器头部对齐。

主干特征对齐模块将stage3和stage4的特征上采样以进行对齐。然后将CNN的特征投影到segformer的尺寸上,进行损失计算。

共享解码器头部对齐模块他将stage2和stage4concat拼接后输入到segformer的解码头中得到最后的输出logits和输出特征图来进行损失计算。

Alignment Loss

对齐损失采用cwd损失函数。式中C为通道数,H*W为空间位置。

### 使用 SCTNet 替换 YOLOv8 主干网络的方法 #### 1. 准备工作 为了成功将 SCTNet 集成到 YOLOv8 中作为新的主干网络,需先安装必要的依赖库并下载预训练的 SCTNet 模型权重文件。这一步骤确保后续开发环境具备执行所需功能的能力。 ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu ``` #### 2. 修改配置文件 编辑 `yolov8.yaml` 文件中的 Backbone 定义部分,将其指向自定义的 SCTNet 架构描述。具体操作是在 YAML 文件里指定新骨干网的相关参数设置,如层数、通道数等特性[^1]。 ```yaml backbone: # 原始CSPDarknet53或其他默认选项被替换为SCTNet配置项 type: 'sctnet' params: depth_multiple: 0.33 width_multiple: 0.5 ``` #### 3. 实现 SCTNet 类 创建一个新的 Python 脚本或模块来定义 SCTNet 的类结构及其前向传播逻辑。此脚本应位于项目的适当位置以便于导入使用,并且要遵循 PyTorch 的标准编码实践[^3]。 ```python import torch.nn as nn from timm.models.layers import trunc_normal_ class SCTNet(nn.Module): def __init__(self, num_classes=1000, **kwargs): super().__init__() self.stem = Stem() # 自定义Stem层 self.stage1 = StageBlock(dim_in=96, dim_out=192) self.stage2 = StageBlock(dim_in=192, dim_out=384) self.stage3 = StageBlock(dim_in=384, dim_out=768) self.head = Head(num_classes=num_classes) self.apply(self._init_weights) def _init_weights(self, m): if isinstance(m, (nn.Linear, nn.Conv2d)): trunc_normal_(m.weight, std=.02) if m.bias is not None: nn.init.constant_(m.bias, 0) def forward_features(self, x): x = self.stem(x) x = self.stage1(x) x = self.stage2(x) x = self.stage3(x) return x def forward(self, x): x = self.forward_features(x) x = self.head(x) return x ``` #### 4. 更新项目代码以支持 SCTNet 调整现有框架内的其他组件使之能够识别并加载 SCTNet 模型实例。通常涉及修改初始化函数以及数据流处理路径等方面的工作[^2]。 ```python from ultralytics.nn.modules.backbones.sctnet import SCTNet def build_backbone(cfg): """Build backbone from config.""" backbone_type = cfg.get('type', '') if backbone_type.lower() == 'sctnet': model = SCTNet(**cfg.params) else: raise ValueError(f'Unsupported backbone {backbone_type}') return model ``` #### 5. 测试与验证 完成上述更改后,利用官方提供的测试工具集对整个系统进行全面的功能性和性能评估。确保所有改动不会破坏原有系统的稳定性的同时也达到了预期的效果改进目标。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值