语义分割数据标注、格式转换

1. 数据准备

1.1 labelme标注数据

labelme标注完之后会生成json格式标注文件,与图像在同一文件夹下面,如图

语义分割数据标注、格式转换_第1张图片

1.2 labelme标注格式转换(json转voc格式)

labelme官方提供了标注格式转换脚本,https://github.com/wkentaro/labelme/tree/main/examples,其中包含了检测、分类、分割等标注任务的格式转换脚本,其中,语义分割的转换脚本位于https://github.com/wkentaro/labelme/tree/main/examples/semantic_segmentation,运行如下命令即可实现json格式转换为voc标准数据集格式,

python ./labelme2voc.py data_annotated data_dataset_voc --labels labels.txt

之后将生成如下文件,

语义分割数据标注、格式转换_第2张图片

 其中,SegmentationClassPNG为mask掩码标签,直接为png的8位伪彩色图。

注:

        1. voc的分割标注直接为png的8位伪彩色图,通过调用调色板来显示色彩。

        2. PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。其中,模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。

python --- 之pil图像转换的一些方式_zxyhhjs2017的博客-CSDN博客_pil_image.fromarray

1.3 CVAT标注格式转换

语义分割数据标注、格式转换_第3张图片

 

CVAT导出的标注mask并不是voc标准格式,是真彩色RGB图像,需要进行简单转换,转换代码如下:

import mmcv
import os.path as osp
from PIL import Image
import cv2
import numpy as np
import os

root = '/home/liuzhicai/project/mmsegmentation-0.17.0/data/bare_soil_voc'
masks = 'SegmentationClass_bak'

palette = [[0, 0, 0], [128, 0, 0], [0, 128, 0]]

save_masks = 'SegmentationClass'

if not osp.exists(osp.join(root, save_masks)):
    os.makedirs(osp.join(root, save_masks))

for file in mmcv.scandir(osp.join(root, masks), suffix='.png'):
    seg_map = cv2.imread(osp.join(root, masks, file), cv2.IMREAD_GRAYSCALE)
    seg_img = Image.fromarray(seg_map).convert('P')
    seg_img.putpalette(np.array(palette, dtype=np.uint8))
    seg_img.save(osp.join(root, save_masks, file))

你可能感兴趣的:(pytorch,人工智能,python)