论文: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项目文件夹下创建目录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
我复现这篇论文主要为了了解注意力机制的结构,同时也学习作者的代码,对训练结果不看重。大家有什么新的发现,欢迎交流。