【语义分割】DANet Dual Attention Network for Scene Segmentation

本文介绍了DANet(Dual Attention Network)在语义分割领域的应用,通过解决RuntimeError和ImportError等调试问题,详细阐述了cityscapes数据集的预处理步骤,包括数据下载、标签处理和生成数据索引txt文件。同时,文章深入解析了DANet的Position Attention Module和Channel Attention Module,以及整体网络框架,帮助读者理解并实现该模型。
摘要由CSDN通过智能技术生成

DANet(Dual Attention Network for Scene Segmentation)在语义分割领域多个数据集上取得了STOA的结果,值得大家关注。
【废话两段】
由于之前没跑过语义分割的网络,github上的介绍对于我来说过于简单,花了两天时间才跑通DANET的代码,这里记录一下踩过的坑。
大神可以直接看官方github的内容 https://github.com/junfu1115/DANet
话不多说,我的电脑配置4x2080Ti,操作系统Ubuntu 16.04, 按照模型作者推荐的使用conda搭建的一个python3.6虚拟环境,运行setup.py中的程序包。然后就开始遇到各种问题了

代码调试

RuntimeError: Ninja is required to load C++ extension

google上搜到一个可行的解决方案如下

wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin/
sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force 

参考:https://github.com/zhanghang1989/PyTorch-Encoding/issues/167

ImportError: No module named ‘ipdb’

这个问题的解决比较直接

pip install ipdb

参考
https://stackoverflow.com/questions/34804121/importerror-no-module-named-ipdb

cityscapes数据集的预处理

这里就比较费功夫了,作者在github只说了到cityscapes上下载数据集然后再转换成19类的数据,具体的操作就只字没提了。
这里作者可能默认大家都是搞语义分割的高手,基本操作就直接忽略了。
在这我就重点分享一下这里的操作细节:

数据集下载

cityscapes官网的Download页面下载:gtFine_trainvaltest.zip (241MB) [md5]和leftImg8bit_trainvaltest.zip (11GB) [md5]两个数据集
在这里插入图片描述
下载完成后解压,关于数据的详细面熟可以在cityscapes数据介绍和处理获得

标签处理

这一步很关键:cityscapes原数据共定义了34类,而DANET只使用了19类。因此需要对监督学习的输出图像进行处理。
cityscapes数据介绍和处理为用户提供了相关的数据处理程序,用户根据自己的需求减少已有的类别,生成新的标签数据集合。真的不是要太贴心!!!
我直接安装cityscapesscripts,然后运行createTrainIdLabelImgs.pyj就可实现新数据的转换

python -m pip install cityscapesscripts
python createTrainIdLabelImgs.py

详细介绍和操作流程可参考:
https://blog.csdn.net/chenzhoujian_/article/details/106874950

生成数据索引txt文件

完成数据转换以后,将数据放到./experiments/cityscapes目录下,距离成功还差最后的数据索引txt文件
根据encoding/datasets/cityscapes.py中可以确定需要生成如下三个重要的文件:
train_fine.txt
val_fine.txt
test.txt
这里直接放我的代码,生成以后就可以按照github上的初始配置训练了

import glob

def make_txtfile(num, mode=None):

    i = 0
    # for the DANET the txt filename
    if mode == "train" or "val":
        txt_name = mode+"_fine"
    else:
        txt_name = mode

    imgs = glob.glob("./datasets/cityscapes/leftImg8bit/"+ mode + "/*/*.png")
    with open("./datasets/cityscapes/"+ txt_name +".txt", "w") as f:
        for path in imgs:
            path = path[22:] # delete "./datasets/cityscapes/"
            data = path + "\t" + path.replace("leftImg8bit", "gtFine").replace("gtFine.png", "gtFine_labelTrainIds.png") + "\n"
            f.write(data)
            i +=1
            if i == num:
                break
    print('write the ', "./datasets/cityscapes/"+ mode+".txt")


if __name__ == '__main__':

    train_num = 2975
    val_num =500
    test_num =1525

    make_txtfile(train_num, mode='train')
    make_txtfile(val_num, mode='val')
    make_txtfile(test_num, mode='test')


参考:
https://blog.csdn.net/chenzhoujian_/article/details/106873451
https://www.cnblogs.com/leviatan/p/10683325.html
https://blog.csdn.net/wang27623056/article/details/106631196

代码解析

个人觉得模型的亮点就是具有两组self-attention机制的注意力模块,所以先介绍两个模块的计算流程,再介绍总体框架的部署情况。

Position Attention Module

在这里插入图片描述

数学原理

数学计算流程如下:

  1. 对于深度卷积网络的某一特征层 A ∈ R C × H × W A\in \mathbb{R}^{C \times H \times W} ARC×H×W分别进行卷积操作得到三组新的特征层 { B , C , D } ∈ R C × H × W \{\mathbf{B}, \mathbf{C}, \mathbf{D}\} \in \mathbb{R}^{C \times H \times W} { B,C,D}RC×H×W
  2. { B , C , D } \{\mathbf{B}, \mathbf{C}, \mathbf{D}\} { B,C,D}reshape成 { B , C } ∈ R C × N \{\mathbf{B}, \mathbf{C}\}\in\mathbb{R}^{C\times N} { B,C}RC×N,其中 N = H × W N=H\times W N=H×W
  3. B T ∈ R N × C \mathbf{B}^\mathrm{T}\in\mathbb{R}^{N \times C} B
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Dual attention layer是一种用于图像分割任务的注意力机制。它通过同时考虑空间注意力和通道注意力来增强特征表示。在Dual Attention Network (DANet)中,使用了两个并行的分支,分别是position attention module和channel attention module。position attention module使用自注意力机制来捕获特征图在任意两个位置之间的空间依赖关系,通过加权求和对所有位置的特征进行聚合更新。而channel attention module使用自注意力机制来捕获任意两个通道图之间的通道依赖关系,并使用所有通道图的加权和来更新每个通道图。DANet将这两个注意力模块的输出进行融合,进一步增强了特征表示。\[3\] Dual attention layer的引入可以提高图像分割的准确性和性能。 #### 引用[.reference_title] - *1* *2* [双重关系感知注意力机制 Dual Relation-Aware Attention[keras实现 dual attention优化版]](https://blog.csdn.net/weixin_42723174/article/details/125235744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【AttentionDual AttentionDANet) & Fully Attention(FLA)](https://blog.csdn.net/m0_61899108/article/details/126086217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值