Numpy 地面真实图像到一个热编码阵列(语义分割)

Numpy 地面真实图像到一个热编码阵列(语义分割),numpy,computer-vision,pytorch,image-segmentation,semantic-segmentation,Numpy,Computer Vision,Pytorch,Image Segmentation,Semantic Segmentation,我正在创建自己的人流和街道细分数据集。在下面,您会看到一个带标签的地面真相(GT)图像 在过去,我在模型输出和GT图像之间做了一个简单的回归(在过去,我只使用街道)。现在我读到,在这种情况下,交叉熵损失更常见。由于我的GT和模型输出图像与输入图像具有相同的宽度w和高度h,我必须创建一个大小为h x w x c的数组,其中c是类数(在我的示例3中,背景、街道、人物)。我想,这就是所谓的热编码数组 我的解决办法如下: 范围内的高度(len(img_as_np_数组)): 对于范围内的宽度(len(

我正在创建自己的人流和街道细分数据集。在下面,您会看到一个带标签的地面真相(GT)图像

在过去,我在模型输出和GT图像之间做了一个简单的回归(在过去,我只使用街道)。现在我读到,在这种情况下,交叉熵损失更常见。由于我的GT和模型输出图像与输入图像具有相同的宽度w和高度h,我必须创建一个大小为h x w x c的数组,其中c是类数(在我的示例3中,背景、街道、人物)。我想,这就是所谓的热编码数组

我的解决办法如下:

范围内的高度(len(img_as_np_数组)):
对于范围内的宽度(len(img_as_np_数组[0]):
温度=np.零(类)
如果get_class(img_as_np_数组[高度,宽度])==1:
温度[1]=1
一个热标签[高度、宽度]=温度
如果get_class(img_as_np_数组[高度,宽度])==2:
温度[2]=1
一个热标签[高度、宽度]=温度
其中,方法get_class(channels)通过像素的颜色确定像素类

def get_类(通道):
阈值=40
#第1类与街道、道路相对应
np.arange中的中频通道[0](243阈值,243+阈值,1)和\
np.arange中的通道[1](169阈值,169+阈值,1)和\
np.arange(0,阈值,1)中的通道[2]:
返回1
#第二类对应于人
np.arange中的中频通道[0](0,阈值,1)和\
np.arange中的通道[1](163阈值,163+阈值,1)和\
np.arange中的通道[2](232阈值,232+阈值,1):
返回2
#类0分别对应于背景和其他内容
返回0
我有两个问题:

  • 我的方法非常慢(全高清图像大约3分钟),有没有办法加快速度

  • 我注意到颜色在通道值的意义上有所不同。例如,orange应该是[243169,0](RGB),但是我发现像这样的条目[206172,8]或者甚至像这样的条目[207176,24]可能会发生,因为我将标签存储为jpg?有没有更好的方法找到橙色和蓝色像素比我的想法与阈值以上

  • 编辑:

    我自己解决了第一个问题。对于全高清图像,这需要2或3秒:

    threshold=40
    class_1_shape_cond_1=(img_as_数组[:,:,0]>=243-阈值)*(img_as_数组[:,:,0]=171-阈值)*(img_as_数组[:,:,1]=0)*(img_as_数组[:,:,2]不要将标签保存为JPEG图像!
    jpeg是一种方法——也就是说,它被设计为使用更少的位来保存图像,即使它改变了一点像素值,只要它对人类观察者来说“看起来不错”。
    对于存储为图像的训练标签,情况并非如此!您不能承受标签中的不准确。您必须使用一种方法,例如

    更好的方法是,首先将标签存储为图像,省去了从RGB值推断离散标签的所有麻烦。

    关于第一个问题 如果您使用的是Tensorflow框架,tf提供了一个函数来快速生成一个热矩阵

    tf.one\u热(
    索引,#带标签的图像
    深度,#类的数量
    on_值=无,
    off_值=无,
    轴=无,
    数据类型=无,
    name=None
    )
    有关详细信息,请参阅(https://www.tensorflow.org/api_docs/python/tf/one_hot?version=stable)
    
    谢谢,我已经解决了,我正在使用Pytork。不过,很高兴知道。