语义分割标签mask的转化,从iSAID到VOC

一.VOC中分割数据集

文件位置:/VOCdevkit2012/VOC2012/SegmentationClass

文件名称:2007_000032.png

VOC中的mask看起来是彩色图,但是其位深只有8,故应该不是RGB三通道的彩色图

在读取VOC中的图片时,如何将SegmentationClass中的彩色mask转为训练时的标签图?

通过代码我们发现,在对数据读取的过程中,仅仅通过PIL读取图片,就已经将图片转为了0-21的标签图

标通过PIL读取图片题
标题PIL读取图片后的图片,可以发现其mode=P
此时图片已变成了0-21的标签图

 

问题的关键:在于彩色标签图的mode=p ,具体解释可见以下博客:

voc分割数据集 pil调色板-CSDN博客

二. iSAID中的mask

首先简单介绍以下iSAID数据集的组成结构

其分别如下所示:

Instance mask
Semantic mask
Semantic mask的详细属性

 

由上图中的属性信息可以看出,虽然iSAID中的彩色mask其位深为24

通过PIL将其打开,发现mode=RGB

故VOC和iSAID中的mask,虽然看起来都是彩色的,但其本质还是不一样,不能直接对iSAID中的彩色mask直接采用PIL读取使用,需要进行转换。

三.将iSAID中的彩色RGB mask转换为网络训练能用的标签 mask(即VOC中的mask格式)

方法一:

自制VOC格式图像分割数据集:使用python+PIL生成8位深的RGB图像_image.fromarray(mask.astype(np.uint8), mode="p")_Cai.SN的博客-CSDN博客

方法二:

iSAID_palette = \
    {
        0: (0, 0, 0),
        1: (0, 0, 63),
        2: (0, 63, 63),
        3: (0, 63, 0),
        4: (0, 63, 127),
        5: (0, 63, 191),
        6: (0, 63, 255),
        7: (0, 127, 63),
        8: (0, 127, 127),
        9: (0, 0, 127),
        10: (0, 0, 191),
        11: (0, 0, 255),
        12: (0, 191, 127),
        13: (0, 127, 191),
        14: (0, 127, 255),  
        15: (0, 100, 155)
    }
iSAID_invert_palette = {v: k for k, v in iSAID_palette.items()}


mode = "train"
txt_name = "train.txt"
root = "/datasets/iSAID"
image_dir = os.path.join(root, 'image', mode)
mask_dir = os.path.join(root, 'label', mode, 'Semantic_masks')
image_txt_path = os.path.join(root, 'image', txt_name)  
mask_txt_path = os.path.join(root, "label", txt_name)   
label_to_PATH = "/datasets/iSAID/label/train/mask_2d"                                                  

with open(os.path.join(image_txt_path), "r") as f:
    file_names = [x.strip() for x in f.readlines() if len(x.strip()) > 0]
images = [os.path.join(image_dir, x + ".png") for x in file_names]
with open(os.path.join(mask_txt_path), "r") as f:
    file_names = [x.strip() for x in f.readlines() if len(x.strip()) > 0]
masks = [os.path.join(mask_dir, x + ".png") for x in file_names]

# 通过将semantic_masks中每个像素点(1×1×3的向量)和iSAID_palette进行对比,从而将其convert为由类别标注的mask
for idx, label_path in enumerate(masks):
    file_name = os.path.basename(masks[idx])
    arr_3d = cv2.imread(label_path, cv2.IMREAD_COLOR) 
    arr_3d = cv2.cvtColor(arr_3d, cv2.COLOR_BGR2RGB) 
    arr_2d = np.zeros((arr_3d.shape[0], arr_3d.shape[1]), dtype=np.uint8)
    for c, i in iSAID_invert_palette.items():
        m = np.all(arr_3d == np.array(c).reshape(1, 1, 3), axis=2)
        arr_2d[m] = i
    arr_2d = Image.fromarray(arr_2d.astype(np.uint8)) 
    arr_2d.save(osp.join(label_to_PATH, file_name)) 

 

类别mask

标题类别mask的位深已变为8
此时读取图片的mode=L
且已变为类别标签

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值