0


深度学习——制作自己的VOC图像分割数据集

1、数据集介绍
COCO数据集有80个类别,VOC数据集有20个类别。当这些数据集类别中没有自己需要的时候,就需要自己动手做自己的数据集了。

我自己在做数据集的时候主要使用到了labelme和labelImg两个工具。labelme主要是制作语义分割数据集(ImageSets,JPEGImages,SegmentationClass,SegmentationObject几个文件夹),labelImg主要是制作目标检测数据集(主要是Annoations中的xml文件),最后把两个合在一起就可以使用maskR-CNN来训练了。文件结构如下图所示:
在这里插入图片描述
2、安装labelme

参考:Windows下使用labelme标注图像
在这里插入图片描述

3、开始数据集制作
点击OpenDir打开要制作数据集图片的文件夹。点击CreatePolygons标记图片就可以了,最后每张图片标记好之后,别忘记点击save保存。此时的会保存问json格式的文件,如图所示:
在这里插入图片描述
接下来就要转换这些json格式为轮廓图片。
将图片和json文件放在同一个文件夹,命名为data_annotated
在这里插入图片描述

在data_annotated文件的目录下启动cmd,命令conda activate labelme切换至labelme环境下。

编辑labelme2voc.py文件

#!/usr/bin/env python

from __future__ importprint_functionimportargparseimportglobimportosimportos.path as osp
importsysimportimgvizimportnumpy as np

importlabelme

def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument("input_dir", help="input annotated directory")
    parser.add_argument("output_dir", help="output dataset directory")
    parser.add_argument("--labels", help="labels file", required=True)
    parser.add_argument("--noviz", help="no visualization", action="store_true")
    args = parser.parse_args()if osp.exists(args.output_dir):print("Output directory already exists:", args.output_dir)
        sys.exit(1)
    os.makedirs(args.output_dir)
    os.makedirs(osp.join(args.output_dir,"JPEGImages"))
    os.makedirs(osp.join(args.output_dir,"SegmentationClass"))
    os.makedirs(osp.join(args.output_dir,"SegmentationClassPNG"))ifnot args.noviz:
        os.makedirs(
            osp.join(args.output_dir,"SegmentationClassVisualization"))
    os.makedirs(osp.join(args.output_dir,"SegmentationObject"))
    os.makedirs(osp.join(args.output_dir,"SegmentationObjectPNG"))ifnot args.noviz:
        os.makedirs(
            osp.join(args.output_dir,"SegmentationObjectVisualization"))print("Creating dataset:", args.output_dir)

    class_names =[]
    class_name_to_id ={}for i, line in enumerate(open(args.labels).readlines()):
        class_id = i -1  # starts with -1
        class_name = line.strip()
        class_name_to_id[class_name]= class_id
        if class_id ==-1:
            assert class_name =="__ignore__"continue
        elif class_id ==0:
            assert class_name =="_background_"
        class_names.append(class_name)
    class_names =tuple(class_names)print("class_names:", class_names)
    out_class_names_file = osp.join(args.output_dir,"class_names.txt")
    with open(out_class_names_file,"w") as f:
        f.writelines("\n".join(class_names))print("Saved class_names:", out_class_names_file)for filename in glob.glob(osp.join(args.input_dir,"*.json")):print("Generating dataset from:", filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]
        out_img_file = osp.join(args.output_dir,"JPEGImages", base +".jpg")
        out_cls_file = osp.join(
            args.output_dir,"SegmentationClass", base +".npy")
        out_clsp_file = osp.join(
            args.output_dir,"SegmentationClassPNG", base +".png")ifnot args.noviz:
            out_clsv_file = osp.join(
                args.output_dir,"SegmentationClassVisualization",
                base +".jpg",)
        out_ins_file = osp.join(
            args.output_dir,"SegmentationObject", base +".npy")
        out_insp_file = osp.join(
            args.output_dir,"SegmentationObjectPNG", base +".png")ifnot args.noviz:
            out_insv_file = osp.join(
                args.output_dir,"SegmentationObjectVisualization",
                base +".jpg",)

        img = labelme.utils.img_data_to_arr(label_file.imageData)
        imgviz.io.imsave(out_img_file, img)

        cls, ins = labelme.utils.shapes_to_label(
            img_shape=img.shape,
            shapes=label_file.shapes,
            label_name_to_value=class_name_to_id,)
        ins[cls ==-1]=0  # ignore it.#classlabel
        labelme.utils.lblsave(out_clsp_file, cls)
        np.save(out_cls_file, cls)ifnot args.noviz:
            clsv = imgviz.label2rgb(
                cls,
                imgviz.rgb2gray(img),
                label_names=class_names,
                font_size=15,
                loc="rb",)
            imgviz.io.imsave(out_clsv_file, clsv)#instancelabel
        labelme.utils.lblsave(out_insp_file, ins)
        np.save(out_ins_file, ins)ifnot args.noviz:
            instance_ids = np.unique(ins)
            instance_names =[str(i)for i in range(max(instance_ids)+1)]
            insv = imgviz.label2rgb(
                ins,
                imgviz.rgb2gray(img),
                label_names=instance_names,
                font_size=15,
                loc="rb",)
            imgviz.io.imsave(out_insv_file, insv)if __name__ =="__main__":main()

编辑labels.txt文件
内容是数据集的各个类别
在这里插入图片描述
运行指令:

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

在这里插入图片描述
即生成如下文件夹
在这里插入图片描述


本文转载自: https://blog.csdn.net/qq_27353621/article/details/129865437
版权归原作者 马少爷 所有, 如有侵权,请联系我们删除。

“深度学习——制作自己的VOC图像分割数据集”的评论:

还没有评论