实时语义分割网络 BiSeNet(附代码解读)

本文介绍了BiSeNet,一种结合空间路径和上下文路径的双边分割网络,用于实时语义分割。文章详细阐述了BiSeNet的结构,包括空间路径的细节、上下文路径的设计以及特征融合和注意力细化模块。实验结果表明,BiSeNet在Cityscapes、CamVid和COCO-Stuff等数据集上表现出色,并通过消融实验验证了其组件的有效性。

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

BiSeNet

Contributions

  1. 提出了一种包含空间路径(SP)和上下文路径(CP)的双边分割网络(BiSeNet), 将空间信息保存和接受域提供的功能解耦成两条路径。
  2. 提出了特征融合模块(FFM)和注意细化模块(ARM),以在可接受的成本下进一步提高精度。
  3. 在cityscape、CamVid和COCO-Stuff的基准上取得了令人印象深刻的成绩。具体来说,在105fps的城市景观测试数据集上,我们得到了68.4%的结果

BackGround

Fig1
作者对比了当前用于三种用于加速模型的实时语义分割算法:

  1. 图(a)左侧所示,通过裁剪图片降低尺寸和计算量,但是会丢失大量边界信息和可视化精度。
  2. 图(a)右侧所示,通过修建/减少卷积过程中的通道数目,提高推理速度。其中的红色方框部分,是作者提及的ENet建议放弃模型的最后阶段(downsample操作),模型的接受域不足以覆盖较大的对象导致的识别能力较差。
  3. 图形(b)所示为U型的编码,解码结构,通过融合骨干网的细节,u型结构提高了空间分辨率,填补了一些缺失的细节,但是作者认为在u型结构中,一些丢失的空间信息无法轻易回复,不是根本的解决方案。

BiSeNet 结构

在这里插入图片描述

Spatial Path

绿色部分表示空间路径,每一层包括一个stride = 2的卷积,接着是批处理归一化和ReLU激活函数,总共三层,故而提取的特征图尺寸是原始图像的1/8。

'''code'''
class SpatialPath(nn.Module):
    def __init__(self, *args, **kwargs):
        super(SpatialPath, self).__init__()
        self.conv1 = ConvBNReLU(3, 64, ks=7, stride=2, padding=3)
        self.conv2 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1)
        self.conv3 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1)
        self.conv_out = ConvBNReLU(64, 128, ks=1, stride=1, padding=0)
        self.init_weight()

    def forward(self, x):
        feat = self.conv1(x)		# (N, 3, H, W)
        feat = self.conv2(feat)		# (N, 64, H/2, W/2)
        feat = self.conv3(feat)		# (N, 64, H/4, W/4)
        feat = self.conv_out(feat)	# (N, 128, H/8, W/8)
        return feat

Context Path

第二个虚线框部分是上下文路径,用于提取上下文信息,利用轻量级模型和全局平均池进行下采样。作者在轻量级模型的尾部添加一个全局平均池,提供具有全局上下文信息的最大接收字段, 并且使用U型结构来融合最后两个阶段的特征,这是一种不完整的U型结构。作者使用了Xception作为上下文路径的主干。

'''code'''
class ContextPath(nn.Module):
    def __init__(self, *args, **kwargs):
        super(ContextPath, self).__init__()
        self.resnet = Resnet18()
        self.arm16 = AttentionRefinementModule(256, 128)		# 先看下面的ARM的代码
        self.arm32 = AttentionRefinementModule(512
### 使用BiSeNet构建自定义数据集 #### 准备工作 为了使用BiSeNet进行语义分割并创建自己的数据集,需先完成必要的准备工作。这包括系统的配置以及所需依赖包的安装。 - **系统需求** 需要确保操作系统满足BiSeNet的要求,通常建议使用Linux或Windows子系统 for Linux (WSL),因为大多数深度学习框架在此类环境中表现更佳[^1]。 - **依赖包** 安装Python及其版本应不低于3.6,并通过`pip install -r requirements.txt`命令来安装项目所需的其他库文件,如PyTorch、torchvision等。这些工具对于加载模型权重和支持网络架构至关重要。 #### 数据集制作 ##### LabelMe标注图像 LabelMe是一个灵活的手动标记二维图像的图形应用程序。可以下载labelme GitHub仓库中的最新发布版来进行图片的标注操作。每张图像是由多个JSON格式保存的对象组成,其中包含了边界框、多边形或者其他形状的信息用于描述目标物体的位置和类别[^2]。 ##### JSON文件转换 由于原始标签是以JSON形式存储,而BiSeNet期望输入的是PNG或其他常见图像格式作为mask掩码,因此需要编写脚本来解析JSON并将之转化为适合训练的数据结构。此过程涉及读取每个JSON文件内的信息,提取像素级分类标签,并将其映射到相应的颜色编码或者整数值上形成新的二进制或灰度位图文件。 ```bash # 假设已经按照官方文档完成了环境搭建,则可以通过如下方式批量处理json至png mask python labelme_json_to_dataset.py --input_dir ./labeled_images/jsons/ --output_dir ./dataset/masks/ ``` 上述命令假设存在名为`labelme_json_to_dataset.py`的转化脚本位于当前目录下;它接受两个参数分别是源路径(存放所有`.json`文件夹)与目的路径(用来放置生成后的mask)。具体实现细节可参照相关资料进一步调整以适应特定场景下的应用需求。 #### 修改代码适配新数据集 当准备好经过预处理之后的新数据集后,在实际调用BiSeNet之前还需要做一些额外的工作: - 更新配置文件中关于数据集位置的相关设置; - 如果有新增加的目标种类则相应更新class列表; - 对于不同分辨率大小的样本可能还需考虑resize策略保持一致性等问题。 最后一步就是启动训练流程了,根据硬件条件选择合适的模式——单GPU或多GPUs加速计算效率。这部分内容已经在参考资料中有详细介绍,这里不再赘述。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值