我们在arxiv的链接是:SANet
English | 中文
SANet总体的结构图
APPPM的提出并不是一蹴而就的。APPPM的原型是DAPPM,我们的最初想法是尝试减少DAPPM的分支,这确实有利于加快速度,同时我们观察了精度的变化(我们认为几乎没有降低),但是最终还是放弃了这个想法。
之后,我们参考了SPPF的思路,这是一种将“使用两个3x3卷积替换一个5x5卷积”的思路应用到池化层的思路,并进而尝试了将非对称卷积的思路应用到池化层上。在结果上,SPPF的思路似乎不利于精度的提升(当然我们没有进行彻底的研究,所以不可以完全确定),而非对称池化层的方式APPPM却是一种 可行的方法。
DAPPM | DAPPM减少分支 | SPPF TAB | SPPF TAB ADD |
---|---|---|---|
APPPM的可行性很容易理解。假如你有一个30x30分辨率的图像,如果使用普通池化将图像降低1/2,则分辨率将直接被降低到15x15。 如果你在池化层之后在使用卷积来提取特征,很明显你只可以在15x15分辨率提取一次特征。而使用非对称池化层,则分辨率将先被降低到30x15,之后是15x15。 如果你依然将卷积放在池化层后面提取特征,很明显你可以在更细致的分辨率上提取更多的特征。
当然,从上边的列表我们也进行了DMRNet中提到的使用非对称卷积替换普通卷积的操作以及DDRNet提到的特征复用的操作。但最后从速度和精度考虑,我们最后提出了APPPM( 在刚开始,该模型被称为TAPPM,且在SANet的模型代码中也是TAPPM)
Simple Attention Decoder的具体结构从网站下载数据集(Cityscapes 和Camvid)
如果Camvid出现Website not found! ,请尝试从Motion-based Segmentation and Recognition Dataset 或 Kaggle下载Camvid数据集
为了进一步验证模型,我们在具有近25000张的GTAV数据集上进行了训练 需要注意的是images的17705.png和15188.png是无效的图像,我们在list/gtav/*.lst文件中没有使用这两张图片
在实时语义分割,网络在ImageNet中预训练常见的方法,如果你希望使用ImageNet进行预训练可以参考我们的方法。 我们使用了这个项目ImageNet来进行预训练。
-
下载我们提供的预训练权重并放入
pretrained_models/imagenet/
中 -
在
config
文件夹下的yaml文件中配置训练相关参数,如ExpName(实验名称)
、ROOT(数据集目录)
、END_EPOCH(训练轮次)
等 -
使用我们预设的脚本train.sh启动训练或者使用以下命令
python tools/train.py --cfg configs/cityscapes/sanet_cityscapes_S.yaml
-
下载我们提供的在Cityscapes或Camvid训练的模型权重并放到
pretrained_models/cityscapes/
或pretrained_models/camvid/
-
在
config
文件夹中的yaml文件中配置评估相关参数,如ExpName
python tools/train.py --cfg=configs/cityscapes/sanet_cityscapes_S.yaml
- 如果希望将测试数据集的结果提交到Cityscapes上,请在
config
文件夹中的yaml文件中修改TEST_SET
参数
Model | SANet-S | SANet-M | SANet-L |
---|---|---|---|
Link | SANet-imagenet-S | SANet-imagenet-M | SANet-imagenet-L |
Model | Val(%mIou) | Test(%mIou) | FPS |
---|---|---|---|
SANet-S | 78.6 \ 79.9 | 77.2 \ 78.4 | 65.1 |
SANet-M | 78.8 \ 80.2 | 77.6 \ 78.8 | 52.7 |
SANet-L | 79.2 \ 80.6 | 78.1 \ 79.0 | 39.6 |
Model | Test(%mIou) | FPS |
---|---|---|
SANet-S | 78.8 | 147 |
SANet-M | 79.5 | 126 |
Model | Test(%mIou) |
---|---|
PIDNet-S(no pretrain) | 38.2 |
SANet-S(no pretrain) | 38.5 |
PIDNet-S(Cityscapes) | 45.0 |
SANet-S(Cityscapes) | 48.0 |
测试速度跟随了DDRNet和PIDNet的测试方法,速度测试在models/sanet_speed.py
在计算机视觉中,更多的图像表达方式是有益的。但是不同的项目中提供的工具是不同的,在这里提供了我们使用的所用工具,希望可以帮助到其他人。
分割图是语义分割最经常使用的一种图像表达方式。
详细的代码在tools/generate_segmentation_image.py
,并进行其他配置
边界图是显示单个物体边界的一种图像
详细的代码在tools/generate_segmentation_image.py
,请将boundary
设置为True
,并进行其他配置
在图像分割任务中,热力图可以用来表示每个像素属于哪个类别或对象的概率。每个类别都有一个相应的热力图,显示了该类别的像素分布情况。
详细的代码在tools/heat_map_drawing/heat_map_generator.py
,使用前需要先导入pytorch_grad_cam
,并进行其他配置
感受野是深度学习模型中神经元或卷积核在输入数据上的影响范围.
详细的代码在tools/receptive_field_generator/main.py
,并进行其他配置
感受野的计算工具在tools/receptive_field_tools/sanet_receptive_field_calculator.py
这是在MSFNet中提到的一种方式。不同于常见的边界损失只有两种分类(是或不是边界) ,多类别的边界损失按照数据集的类别分成了多种类别(是什么类别的边界)。 我们当时尝试为SANet加入这种方法,但是并没有找到MSFNet提供的相应代码。因此,我们重新实现了这种多类别的方法。但是,我们加入这种方法的SANet性能表现的并不理想。
详细的代码在tools/multi_class_boundary_detection/multi_class_boundary_detection.py
,并进行其他配置
@misc{wang2023spatialassistant,
title={Spatial-Assistant Encoder-Decoder Network for Real Time Semantic Segmentation},
author={Yalun Wang and Shidong Chen and Huicong Bian and Weixiao Li and Qin Lu},
year={2023},
eprint={2309.10519},
archivePrefix={arXiv},
primaryClass={cs.CV}
}