DANet代码复现

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

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

  • Download the Cityscapes dataset and convert the dataset to 19 categories.
  • Please put dataset in folder ./datasets

(1)下载与解压cityscapes数据集。首先去官网下载数据集,
DANet代码复现_第1张图片
如果只是想测试模型,下载第一个数据集即可。
下载完成后,在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文件,如图所示:
DANet代码复现_第2张图片

  • 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

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

你可能感兴趣的:(深度学习,pytorch,深度学习,python)