语义分割class标注问题

将只有0,2两个值的Tensor保存为png图片后,再重新读像素值,原本为2的像素值全都变成了小于1的数,请问是怎么回事。目的是标记语义分割的class,这个问题一直没解决。请求帮助。

img

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    从给出的代码和问题描述来看,出现了像素值转换错误的问题。在重新读取图片后,原本为2的像素值变成了小于1的数。经过分析,可以看出问题出在将像素值转换为0和2的代码段上。

    reloaded_image = np.where(reloaded_image < 1, 0, 2)
    

    这段代码的逻辑是将重新读取的灰度图像中小于1的像素值设置为0,大于等于1的像素值设置为2。然而,由于之前保存为PNG图片时使用了image_tensor.numpy()来将张量转换为numpy数组,而在这个过程中,原本是int型的像素值被转换为了float型,所以在重新读取图片后,像素值都变成了小于1的浮点数。

    解决这个问题的方法是在保存为PNG图片时,将像素值转换为整数型,以保持一致性。修改代码如下:

    import torch
    from PIL import Image
    
    # 假设tensor为image_tensor
    image_tensor = torch.tensor([[2, 0, 0],
                                [0, 0, 2]])
    
    # 将tensor保存为PNG图片
    image_tensor = image_tensor.byte()
    image = Image.fromarray(image_tensor.numpy().astype(np.uint8), mode='L')
    image.save('image.png')
    
    # 重新读取图片
    # 这里使用OpenCV库读取图片
    import cv2
    import numpy as np
    
    reloaded_image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
    # 将像素值转换为0和2
    reloaded_image = np.where(reloaded_image < 1, 0, 2)
    

    修改后的代码保证了在重新读取图片时像素值的类型是整数类型,这样就可以正确地将像素值转换为0和2了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^