在用pytorch实现SegNet算法时,数据集选择了cityscapes,在这里写下cityscapes数据集标签的处理。(注意这里只写训练时标签的处理)
我用pytorch实现SegNet算法的博客,有兴趣可去看看。
(https://blog.csdn.net/chenzhoujian_/article/details/106873451)
cityscapes数据集的下载和介绍参考这篇博客:https://blog.csdn.net/avideointerfaces/article/details/104139298
脚本地址:https://github.com/mcordts/cityscapesScripts
将整个脚本项目下载下来
我们会用到其中两个脚本文件,labels和createTrainIdLabelImgs
在pycharm中打开的目录如下:
打开labels.py
未改动前:
labels = [
# name id trainId category catId hasInstances ignoreInEval color
Label( 'unlabeled' , 0 , 255 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'ego vehicle' , 1 , 255 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'rectification border' , 2 , 255 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'out of roi' , 3 , 255 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'static' , 4 , 255 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'dynamic' , 5 , 255 , 'void' , 0 , False , True , (111, 74, 0) ),
Label( 'ground' , 6 , 255 , 'void' , 0 , False , True , ( 81, 0, 81) ),
Label( 'road' , 7 , 0 , 'flat' , 1 , False , False , (128, 64,128) ),
Label( 'sidewalk' , 8 , 1 , 'flat' , 1 , False , False , (244, 35,232) ),
Label( 'parking' , 9 , 255 , 'flat' , 1 , False , True , (250,170,160) ),
Label( 'rail track' , 10 , 255 , 'flat' , 1 , False , True , (230,150,140) ),
Label( 'building' , 11 , 2 , 'construction' , 2 , False , False , ( 70, 70, 70) ),
Label( 'wall' , 12 , 3 , 'construction' , 2 , False , False , (102,102,156) ),
Label( 'fence' , 13 , 4 , 'construction' , 2 , False , False , (190,153,153) ),
Label( 'guard rail' , 14 , 255 , 'construction' , 2 , False , True , (180,165,180) ),
Label( 'bridge' , 15 , 255 , 'construction' , 2 , False , True , (150,100,100) ),
Label( 'tunnel' , 16 , 255 , 'construction' , 2 , False , True , (150,120, 90) ),
Label( 'pole' , 17 , 5 , 'object' , 3 , False , False , (153,153,153) ),
Label( 'polegroup' , 18 , 255 , 'object' , 3 , False , True , (153,153,153) ),
Label( 'traffic light' , 19 , 6 , 'object' , 3 , False , False , (250,170, 30) ),
Label( 'traffic sign' , 20 , 7 , 'object' , 3 , False , False , (220,220, 0) ),
Label( 'vegetation' , 21 , 8 , 'nature' , 4 , False , False , (107,142, 35) ),
Label( 'terrain' , 22 , 9 , 'nature' , 4 , False , False , (152,251,152) ),
Label( 'sky' , 23 , 10 , 'sky' , 5 , False , False , ( 70,130,180) ),
Label( 'person' , 24 , 11 , 'human' , 6 , True , False , (220, 20, 60) ),
Label( 'rider' , 25 , 12 , 'human' , 6 , True , False , (255, 0, 0) ),
Label( 'car' , 26 , 13 , 'vehicle' , 7 , True , False , ( 0, 0,142) ),
Label( 'truck' , 27 , 14 , 'vehicle' , 7 , True , False , ( 0, 0, 70) ),
Label( 'bus' , 28 , 15 , 'vehicle' , 7 , True , False , ( 0, 60,100) ),
Label( 'caravan' , 29 , 255 , 'vehicle' , 7 , True , True , ( 0, 0, 90) ),
Label( 'trailer' , 30 , 255 , 'vehicle' , 7 , True , True , ( 0, 0,110) ),
Label( 'train' , 31 , 16 , 'vehicle' , 7 , True , False , ( 0, 80,100) ),
Label( 'motorcycle' , 32 , 17 , 'vehicle' , 7 , True , False , ( 0, 0,230) ),
Label( 'bicycle' , 33 , 18 , 'vehicle' , 7 , True , False , (119, 11, 32) ),
Label( 'license plate' , -1 , -1 , 'vehicle' , 7 , False , True , ( 0, 0,142) ),
]
主要改动下面这两项:
trainId就是标签的像素值,代表类别
ignoreInEval都设为False
例如,将road设为1,其它设为0,就是训练两类
labels = [
# name id trainId category catId hasInstances ignoreInEval color
Label( 'unlabeled' , 0 , 0 , 'void' , 0 , False , False , ( 0, 0, 0) ),
Label( 'ego vehicle' , 1 , 0 , 'void' , 0 , False , False , ( 0, 0, 0) ),
Label( 'rectification border' , 2 , 0 , 'void' , 0 , False , False , ( 0, 0, 0) ),
Label( 'out of roi' , 3 , 0 , 'void' , 0 , False , False , ( 0, 0, 0) ),
Label( 'static' , 4 , 0 , 'void' , 0 , False , False , ( 0, 0, 0) ),
Label( 'dynamic' , 5 , 0 , 'void' , 0 , False , False , (111, 74, 0) ),
Label( 'ground' , 6 , 0 , 'void' , 0 , False , False , ( 81, 0, 81) ),
Label( 'road' , 7 , 1 , 'flat' , 1 , False , False , (128, 64,128) ),
Label( 'sidewalk' , 8 , 0 , 'flat' , 1 , False , False , (244, 35,232) ),
Label( 'parking' , 9 , 0 , 'flat' , 1 , False , False , (250,170,160) ),
Label( 'rail track' , 10 , 0 , 'flat' , 1 , False , False , (230,150,140) ),
Label( 'building' , 11 , 0 , 'construction' , 2 , False , False , ( 70, 70, 70) ),
Label( 'wall' , 12 , 0 , 'construction' , 2 , False , False , (102,102,156) ),
Label( 'fence' , 13 , 0 , 'construction' , 2 , False , False , (190,153,153) ),
Label( 'guard rail' , 14 , 0 , 'construction' , 2 , False , False , (180,165,180) ),
Label( 'bridge' , 15 , 0 , 'construction' , 2 , False , False , (150,100,100) ),
Label( 'tunnel' , 16 , 0 , 'construction' , 2 , False , False , (150,120, 90) ),
Label( 'pole' , 17 , 0 , 'object' , 3 , False , False , (153,153,153) ),
Label( 'polegroup' , 18 , 0 , 'object' , 3 , False , False , (153,153,153) ),
Label( 'traffic light' , 19 , 0 , 'object' , 3 , False , False , (250,170, 30) ),
Label( 'traffic sign' , 20 , 0 , 'object' , 3 , False , False , (220,220, 0) ),
Label( 'vegetation' , 21 , 0 , 'nature' , 4 , False , False , (107,142, 35) ),
Label( 'terrain' , 22 , 0 , 'nature' , 4 , False , False , (152,251,152) ),
Label( 'sky' , 23 , 0 , 'sky' , 5 , False , False , ( 70,130,180) ),
Label( 'person' , 24 , 0 , 'human' , 6 , True , False , (220, 20, 60) ),
Label( 'rider' , 25 , 0 , 'human' , 6 , True , False , (255, 0, 0) ),
Label( 'car' , 26 , 0 , 'vehicle' , 7 , True , False , ( 0, 0,142) ),
Label( 'truck' , 27 , 0 , 'vehicle' , 7 , True , False , ( 0, 0, 70) ),
Label( 'bus' , 28 , 0 , 'vehicle' , 7 , True , False , ( 0, 60,100) ),
Label( 'caravan' , 29 , 0 , 'vehicle' , 7 , True , False , ( 0, 0, 90) ),
Label( 'trailer' , 30 , 0 , 'vehicle' , 7 , True , False , ( 0, 0,110) ),
Label( 'train' , 31 , 0 , 'vehicle' , 7 , True , False , ( 0, 80,100) ),
Label( 'motorcycle' , 32 , 0 , 'vehicle' , 7 , True , False , ( 0, 0,230) ),
Label( 'bicycle' , 33 , 0 , 'vehicle' , 7 , True , False , (119, 11, 32) ),
Label( 'license plate' , -1 , 0 , 'vehicle' , 7 , False , False , ( 0, 0,142) ),
]
注意:我看其它博客都是说不感兴趣的类,就将trainId设为255,ignoreInEval设为True;感兴趣的类再依次设为0、1、2…,ignoreInEval设为False
这个做法我不太理解,照做之后训练效果也很奇怪,可能是我没理解到关键吧。如果有大佬可以在下方留言告诉我,不胜感激!
注意将代码中的路径换成自己的
之后就直接运行这个createTrainIdLabelImgs.py脚本文件就可以了
运行成功后,直接打开cityscapes数据集的标签,每张图片的gtFine_labelTrainIds都会发生变化,这样就可以进行训练了。