【问题标题】:Tensorflow 2: apply one hot encoding on masks for semantic segmentationTensorflow 2:对掩码应用一种热编码以进行语义分割
【发布时间】:2020-05-27 13:17:05
【问题描述】:

我正在尝试处理我的地面实况图像以创建一个热编码张量:

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

这是从 WxHx3 图像创建 WxHxN 张量。我真的不喜欢这种方法,因为它的性能。你能建议更有效的方法吗?

我尝试使用 tf.one_hot 但它将图像转换为 WxHx3xN 张量。

【问题讨论】:

  • 你能提供更多关于你的输入图像的细节吗? 3个频道是什么?通常地面实况图像只有 1 个通道,其中的值代表每个类别。
  • @DMolony 这 3 个通道是 RGB。有 3 个类由 3 种颜色表示:[255,0,0]、[0,0,255]、[255,255,255]。所以我想用一个热编码值替换这些颜色

标签: python tensorflow


【解决方案1】:

对于已知 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 

【讨论】:

    【解决方案2】:

    对于纯粹的 TF2.x 方法,您还可以执行以下操作

    import os
    os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
    
    import tensorflow as tf
    
    @tf.function # Remove this to see the tf.print array values
    def get_one_hot():
      label_ids = [0,5,10]
      mask_orig = tf.constant([[0,10], [0,10]], dtype=tf.float32) # [2,2]
      mask_onehot = tf.concat([tf.expand_dims(tf.math.equal(mask_orig, label_id),axis=-1) for label_id in label_ids], axis=-1) # [2,2,2]
      mask_label_present = tf.reduce_any(mask_onehot, axis=[0,1]) # [2]
      
      tf.print('\n - label_ids:{}'.format(label_ids))
      tf.print('\n - mask_orig:\n{}\n'.format(mask_orig))
      for id_, label_id in enumerate(label_ids):
          tf.print(' - mask_onehot:{}\n{}'.format(label_id, mask_onehot[:,:,id_]))
      tf.print('\n - mask_label_present:\n ', mask_label_present)
    
    get_one_hot()
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 2021-12-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多