DANet代码复现

本文档详细介绍了如何使用DANet模型进行场景分割,包括Cityscapes数据集的准备、模型转换、txt文件生成、预训练模型下载及测试过程。在测试过程中遇到一些错误,训练时需修改代码以避免RuntimeError,并提供了训练DANet的注意事项。同时,还分享了训练DANet时的数据集选择和代码修改建议。

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

论文:Dual Attention Network for Scene Segmentation
项目: https://github.com/junfu1115/DANet/

1.Evaluation
项目的readme中谈到了利用训练好的模型进行inference,对cityscapes数据集如果不熟悉,可能会不知所措。此处针对其说明做一些补充。

(1)下载与解压cityscapes数据集。首先去官网下载数据集,
在这里插入图片描述
如果只是想测试模型,下载第一个数据集即可。
下载完成后,在DANet项目文件夹下创建目录DANet-master/datasets/cityscapes并解压,解压得到gtFine文件夹,此时数据集的目录是:DANet-master/datasets/cityscapes/gtFine
(2)之后需要将数据集转化为19类,参考:Convert the Cityscapes dataset to 19 categories #12
(3)制作txt文件。将数据集转化为相应类型后,还需要制造txt文件供算法导入数据。参考:About cityscapes Datasets #120。即在自己项目中新建一个python文件,我把生成txt的代码再贴一下:

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("./gtFine/"+ mode + "/*/*.png")#依据自己文件夹路径修改
    with open("./cityscapes/"+ txt_name +".txt", "w") as f:#依据自己文件夹路径修改
        for path in imgs:
            #path = path[48:] # delete "./datasets/cityscapes/"
            print(path+'/n')
            data = path + "\t" + path.replace("leftImg8bit", "gtFine").replace("gtFine.png", "gtFine_labelTrainIds.png") + "\n"
            f.write(data)
            #f.write(path+"\n")
            i +=1
            if i == num:
                break
    print('write the ', "./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')

生成完txt问价后注意查看图片地址名是否正确,可以适当修改代码。
生成三个txt文件,如图所示:
在这里插入图片描述

  • Download trained model DANet101 and put it in folder ./experiments/segmentation/models/

(4)此处需要下载DANet101,点击链接下载即可。注意模型下载后需要新建一个models文件夹将其放进去。
(5)运行test.py:

CUDA_VISIBLE_DEVICES=0,1,2,3 python test.py --dataset citys --model danet --backbone resnet101 --resume models/DANet101.pth.tar --eval --base-size 2048 --crop-size 768 --workers 1 --multi-grid --multi-dilation 4 8 16 --os 8 --aux --no-deepstem

我这儿可以跑起来,但运行过程有一些错误,最终结果很低,后续还需要进一步调试。

2.Train
readme中没有说明如何训练,但项目文件中给出了./experiments/segmentation/train.py。可以用这个文件进行训练。此处给出一些需要注意的点。
(1)如果希望训练DANet,设置参数–model danet。
(2)数据集切换成cityscapes:–dataset citys。我这儿发现用cityscapes训练会报错,用数据集ade20k可以训练。该数据集可以用自带的./scripts/prepare_adk20k.py下载,下载后会自动解压到指定的位置,不需要再手动改变数据集的路径。
(3)代码213行:

loss = self.criterion(outputs, target)

改成

loss = self.criterion(outputs[0], target)

(4)训练中如果出现RuntimeError: Some elements marked as dirty during the forward method,参考:https://github.com/zhanghang1989/PyTorch-Encoding/issues/328#issuecomment-749549857

我复现这篇论文主要为了了解注意力机制的结构,同时也学习作者的代码,对训练结果不看重。大家有什么新的发现,欢迎交流。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值