El conjunto de datos de paisajes urbanos está equipado con una herramienta de secuencias de comandos de paisajes urbanos. Hay un archivo de implementación que define el número de categorías en la herramienta.
Por ejemplo, si no desea tantos tipos de segmentación semántica, primero modifique el archivo labels.py, modifique el trainId de la categoría que desea comentar a 255 y modifique ignoreInEval a True. Luego ejecute createTrainIdLabelImgs.py. Este archivo lee los polígonos del archivo json y establece el área del polígono en el valor de trainId. El archivo de salida es similar
Entre ellos, el blanco es 255 y el oscuro es el valor de trainid de cada categoría.
Desafortunadamente, no lo entendí. También encontré el siguiente método, que también puede realizar la función de generar el mapa marcado anteriormente.
El primer paso es encontrar una lista de categorías correspondientes al color de la etiqueta del conjunto de datos: (esto generalmente está disponible en el sitio web oficial o en github, y encontré los paisajes urbanos en 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) ),
]
El segundo paso es leer las etiquetas de las etiquetas en un diccionario 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)
El tercer paso es leer la imagen de la etiqueta y luego comparar el valor RGB de cada píxel en la imagen con el diccionario color2index. Si es el mismo, registrar el índice del valor RGB en color2index
Código completo:
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) #打印出现过的索引(类别)
ejemplo:
Ingrese la imagen:
Producción:
Esto indica cuántas categorías hay en la imagen de la etiqueta.
Pero si se emite idx_max, el valor de píxel de la imagen se reemplaza por el valor del índice, que es un número del 0 al 19 (un total de 20 categorías)
Tal como: