Tensorflow 2: применить одно горячее кодирование к маскам для сегментации semanti c - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь обработать мои наземные истинные изображения для создания одного тензора с горячим кодированием:

def one_hot(img, nclasses):
  result = np.zeros((img.shape[0], img.shape[1], nclasses))
  img_unique = img.reshape(512*512, img.shape[2])
  unique = np.unique(img_unique, axis=0)
  for i in range(img.shape[0]):
    for j in range(img.shape[1]):
      for k, unique_val in enumerate(unique):
        if (np.array_equal(img[i,j], unique_val)):
          result[i,j,k] = 1
          break

  return result

Это создает тензор WxHxN из изображения WxHx3. Мне такой подход не нравится из-за его производительности. Не могли бы вы посоветовать более эффективный способ?

Я пробовал использовать tf.one_hot, но он преобразует изображение в тензор WxHx3xN.

1 Ответ

0 голосов
/ 28 мая 2020

Для вашего конкретного c сценария, где известны 3 класса, это должно работать быстрее

def one_hot2(img):
    class1 = [255,0,0]
    class2 = [0,0,255]
    class3 = [255,255,255]  
    label = np.zeros_like(img)
    label[np.sum(img==np.array([[class2]]), 2)==3] = 1
    label[np.sum(img==np.array([[class3]]), 2)==3] = 2
    onehot = np.eye(3)[label]
    return onehot 
...