cityscapes数据集配一个cityscapesscripts工具。该工具内有定义自己类别数的实现文件。
例如不想要这么多类的语义分割,先修改labels.py文件,把想注释掉的类别的trainId修改为255,ignoreInEval修改为True。然后运行createTrainIdLabelImgs.py。这个文件读取json文件的多边形,将多边形区域设置为trainId的值。输出文件为类似
其中白色就是255 暗色就是各个类别的trainid值。
很遗憾,没安明白。又搜到了下面的方法,也可以实现生成上面标注图的功能。
第一步首先要找到数据集label颜色对应类别的列表:(这个一般在官网或者是github上会有,cityscapes我就是从github上找的)
Label = namedtuple('Label', [
'name',
'id',
'trainId',
'category',
'categoryId',
'hasInstances',
'ignoreInEval',
'color'])
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 , 1 , 'flat' , 1 , False , False , (128, 64,128) ),
Label( 'sidewalk' , 8 , 2 , '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 , 3 , 'construction' , 2 , False , False , ( 70, 70, 70) ),
Label( 'wall' , 12 , 4 , 'construction' , 2 , False , False , (102,102,156) ),
Label( 'fence' , 13 , 5 , '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 , 6 , 'object' , 3 , False , False , (153,153,153) ),
Label( 'polegroup' , 18 , 255 , 'object' , 3 , False , True , (153,153,153) ),
Label( 'traffic light' , 19 , 7 , 'object' , 3 , False , False , (250,170, 30) ),
Label( 'traffic sign' , 20 , 8 , 'object' , 3 , False , False , (220,220, 0) ),
Label( 'vegetation' , 21 , 9 , 'nature' , 4 , False , False , (107,142, 35) ),
Label( 'terrain' , 22 , 10 , 'nature' , 4 , False , False , (152,251,152) ),
Label( 'sky' , 23 , 11 , 'sky' , 5 , False , False , ( 70,130,180) ),
Label( 'person' , 24 , 12 , 'human' , 6 , True , False , (220, 20, 60) ),
Label( 'rider' , 25 , 13 , 'human' , 6 , True , False , (255, 0, 0) ),
Label( 'car' , 26 , 14 , 'vehicle' , 7 , True , False , ( 0, 0,142) ),
Label( 'truck' , 27 , 15 , 'vehicle' , 7 , True , False , ( 0, 0, 70) ),
Label( 'bus' , 28 , 16 , '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 , 17 , 'vehicle' , 7 , True , False , ( 0, 80,100) ),
Label( 'motorcycle' , 32 , 18 , 'vehicle' , 7 , True , False , ( 0, 0,230) ),
Label( 'bicycle' , 33 , 19 , 'vehicle' , 7 , True , False , (119, 11, 32) ),
Label( 'license plate' , -1 , -1 , 'vehicle' , 7 , False , True , ( 0, 0,142) ),
]
第二步,把labels的标注读到一个color2index字典当中:
color2index = {}
color2index[(0, 0, 0)] = 0 # add an void class
for obj in labels:
if obj.ignoreInEval:
continue
idx = obj.trainId
label = obj.name
color = obj.color
color2index[color] = idx
print(color2index)
第三步,读入label图片,然后把图片中每个像素的RGB值跟color2index字典对比,相同的则记录下color2index里该RGB值的索引index
完整代码:
import numpy as np
import scipy.misc
from collections import namedtuple
np.set_printoptions(threshold=np.inf)
Label = namedtuple('Label', [
'name',
'id',
'trainId',
'category',
'categoryId',
'hasInstances',
'ignoreInEval',
'color'])
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 , 1 , 'flat' , 1 , False , False , (128, 64,128) ),
Label( 'sidewalk' , 8 , 2 , '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 , 3 , 'construction' , 2 , False , False , ( 70, 70, 70) ),
Label( 'wall' , 12 , 4 , 'construction' , 2 , False , False , (102,102,156) ),
Label( 'fence' , 13 , 5 , '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 , 6 , 'object' , 3 , False , False , (153,153,153) ),
Label( 'polegroup' , 18 , 255 , 'object' , 3 , False , True , (153,153,153) ),
Label( 'traffic light' , 19 , 7 , 'object' , 3 , False , False , (250,170, 30) ),
Label( 'traffic sign' , 20 , 8 , 'object' , 3 , False , False , (220,220, 0) ),
Label( 'vegetation' , 21 , 9 , 'nature' , 4 , False , False , (107,142, 35) ),
Label( 'terrain' , 22 , 10 , 'nature' , 4 , False , False , (152,251,152) ),
Label( 'sky' , 23 , 11 , 'sky' , 5 , False , False , ( 70,130,180) ),
Label( 'person' , 24 , 12 , 'human' , 6 , True , False , (220, 20, 60) ),
Label( 'rider' , 25 , 13 , 'human' , 6 , True , False , (255, 0, 0) ),
Label( 'car' , 26 , 14 , 'vehicle' , 7 , True , False , ( 0, 0,142) ),
Label( 'truck' , 27 , 15 , 'vehicle' , 7 , True , False , ( 0, 0, 70) ),
Label( 'bus' , 28 , 16 , '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 , 17 , 'vehicle' , 7 , True , False , ( 0, 80,100) ),
Label( 'motorcycle' , 32 , 18 , 'vehicle' , 7 , True , False , ( 0, 0,230) ),
Label( 'bicycle' , 33 , 19 , 'vehicle' , 7 , True , False , (119, 11, 32) ),
Label( 'license plate' , -1 , -1 , 'vehicle' , 7 , False , True , ( 0, 0,142) ),
]
if __name__ =='__main__':
color2index = {}
color2index[(0, 0, 0)] = 0 # add an void class
for obj in labels:
if obj.ignoreInEval:
continue
idx = obj.trainId
label = obj.name
color = obj.color
color2index[color] = idx
print(color2index)
img = r'F:\dataset\cityspaces\gtFine\train\aachen\aachen_000002_000019_gtFine_color.png'
img = scipy.misc.imread(img, mode='RGB')
height, weight, _ = img.shape
l = []
idx_mat = np.zeros((height, weight))
for h in range(height):
for w in range(weight):
color = tuple(img[h, w])
#print(color)
# print(color)
try:
index = color2index[color]
idx_mat[h, w] = index
if index not in l:
l.append(index)
except:
# no index, assign to void
idx_mat[h, w] = 0
idx_mat = idx_mat.astype(np.uint8)
print(l) #打印出现过的索引(类别)
例子:
输入图片:
输出:
这表示label图片里有多少类别
但是如果输出idx_max则是把图片的像素值全换成index值了,也就是0~19的数字(共20个类)
如: