目标检测转语义分割的新手,在数据集处理阶段遇到了一些麻烦,特此记录一下。
labelme标注的数据集,成功转为原始影像图与对应的mask图,但转出的mask图为调色板格式,一开始在影像图与mask图同步resize的过程中,mask图resize后的图片与原始mask在像素值上存在较大差别,经过一番折腾,终于在转化前后保持像素值不变,以下为具体代码(切记,用labelme处理的mask图不能用opencv处理,会改变mask的像素值)。
import cv2
from PIL import Image
import os
import numpy as np
import imgviz
# 定义待批量裁剪图像的路径地址
IMAGE_INPUT_PATH = './VOC2007/JPEGImages'
MASK_INPUT_PATH = './VOC2007/SegmentationClass'
# 定义裁剪后的图像存放地址
IMAGE_OUTPUT_PATH = './VOC2007/JPEGImages_resize'
MASK_OUTPUT_PATH = './VOC2007/SegmentationClass_resize'
imglist = os.listdir(IMAGE_INPUT_PATH)
masklist = os.listdir(MASK_INPUT_PATH)
def save_colored_mask(path, save_path,width,height):
lbl_pil = Image.open(path)
lbl_pil = lbl_pil.resize((width, height))
colormap = imgviz.label_colormap()
lbl_pil.putpalette(colormap.flatten())
lbl_pil.save(save_path)
for i in range(len(imglist)):
# 每个图像全路径
image_input_fullname = IMAGE_INPUT_PATH + '/' + imglist[i]
mask_input_fullname = MASK_INPUT_PATH + '/' + imglist[i].replace('.jpg','.png')
image_output_fullname = IMAGE_OUTPUT_PATH + '/' + imglist[i]
mask_output_fullname = MASK_OUTPUT_PATH + '/' + imglist[i].replace('.jpg','.png')
img = cv2.imread(image_input_fullname)
height, width = img.shape[:2]
# 定义缩放信息 以等比例缩放到1024为例
scale=1024/height
height=1024
width=int(width*scale)
img = cv2.resize(img, (width, height))
cv2.imwrite(image_output_fullname,img)
save_colored_mask(mask_input_fullname,mask_output_fullname, width,height)