制作分割数据集

制作语义分割数据集大致需要

(1)使用labelme对数据进行标注,生成对应图片的json格式。

(2)批量转化 json文件为单通道的png文件,根据生成的文件夹,生成语义图片。

(3)将语义图片转化成灰度图。

1. 用labelme标注的样本,然后批量重命名图片和json格式的样本

import os
path = "D:\\tu"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
i=1
for file in filelist: #遍历所有文件
  if file.endswith('.jpg'):
    Olddir=os.path.join(path,file) #原来的文件路径
    if os.path.isdir(Olddir): #如果是文件夹则跳过
      continue
    filename=os.path.splitext(file)[0] #文件名
    filetype=os.path.splitext(file)[1] #文件扩展名
    Newdir=os.path.join(path,str(i).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)#重命名
  if file.endswith('.json'):
    Olddir=os.path.join(path,file) #原来的文件路径
    if os.path.isdir(Olddir): #如果是文件夹则跳过
      continue
    filename=os.path.splitext(file)[0] #文件名
    filetype=os.path.splitext(file)[1] #文件扩展名
    Newdir=os.path.join(path,str(i).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)#重命名
  i = i + 1

批量提取同一文件夹下相同后缀的所有文件: 打开命令行,输入copy d:\tupian\*.json d:\yangben

2. 批量转化 json文件为单通道的png文件

2.1 json文件的批量转化

将C:\Users\ss\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli下的 json_to_dataset.py文件的代码替换如下:

import json
import os
import os.path as osp
import warnings
import copy
import numpy as np
import PIL.Image
import yaml

from labelme import utils

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()

    json_file = args.json_file

    list = os.listdir(json_file)
    for i in range(0, len(list)):
        path = os.path.join(json_file, list[i])
        filename = list[i][:-5]       # .json
        if os.path.isfile(path):
            data = json.load(open(path))
            img = utils.image.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.shape.labelme_shapes_to_label(img.shape, data['shapes'])  # labelme_shapes_to_label

            captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
            lbl_viz = utils.draw.draw_label(lbl, img, captions)
            out_dir = osp.basename(list[i]).replace('.', '_')
            out_dir = osp.join(osp.dirname(list[i]), out_dir)
            if not osp.exists(out_dir):
                os.mkdir(out_dir)

            PIL.Image.fromarray(img).save(osp.join(out_dir, '{}.png'.format(filename)))
            PIL.Image.fromarray(lbl).save(osp.join(out_dir, '{}_gt.png'.format(filename)))
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, '{}_viz.png'.format(filename)))

            with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')

            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=lbl_names)
            with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)

            print('Saved to: %s' % out_dir)


if __name__ == '__main__':
    main()

打开cmd环境,输入activate labelme 激活labelme

输入labelme_json_to_dataset D:/yangben  进行批量转化json文件,其中D:/yangben为json所在文件夹,转化后的文件保存在c/usrs/ss

2.2 从文件夹中批量获取label.png文件

        执行后的结果会生成对应图片的文件夹,里面包括四个文件:img,info,label,label_viz。labelme_json_dataset生成的标注图像文件是每个json对应一个文件夹,写了以下代码来进行批量获取label.png文件。

只需将GT_from_PATH设置为所有json文件夹所在根目录即可。   

import os
import random
import shutil
import re


GT_from_PATH = "D:/jsons"
GT_to_PATH = "./gts"


def copy_file(from_dir, to_dir, Name_list):
    if not os.path.isdir(to_dir):
        os.mkdir(to_dir)
    for name in Name_list:
        try:
            # print(name)
            if not os.path.isfile(os.path.join(from_dir, name)):
                print("{} is not existed".format(os.path.join(from_dir, name)))
            shutil.copy(os.path.join(from_dir, name), os.path.join(to_dir, name))
            # print("{} has copied to {}".format(os.path.join(from_dir, name), os.path.join(to_dir, name)))
        except:
            # print("failed to move {}".format(from_dir + name))
            pass
        # shutil.copyfile(fileDir+name, tarDir+name)
    print("{} has copied to {}".format(from_dir, to_dir))


if __name__ == '__main__':
    filepath_list = os.listdir(GT_from_PATH)
    # print(name_list)
    for i, file_path in enumerate(filepath_list):
        gt_path = "{}/{}_gt.png".format(os.path.join(GT_from_PATH, filepath_list[i]), file_path[:-5])
        print("copy {} to ...".format(gt_path))
        gt_name = ["{}_gt.png".format(file_path[:-5])]
        gt_file_path = os.path.join(GT_from_PATH, file_path)
        copy_file(gt_file_path, GT_to_PATH, gt_name)

  2.3 生成24位语义图片

import os
import PIL.Image
import numpy as np
from skimage import io, color

path = "D:\\gts"
filelist = os.listdir(path)
i = 1
for file in filelist:
    filename = os.path.join(path, 'label'+str(i)+'.png') 
    img = PIL.Image.open(filename)#读取图片
    img = np.array(img)
    img24 = color.label2rgb(img, bg_label=0, bg_color=(0, 0, 0)) 
    #img8 = PIL.Image.fromarray(np.uint8(img24))
    dstName = os.path.join("D:\\transform", 'label' + str(i) + '.png')
    io.imsave(dstName, img8)
    i = i+1

你可能感兴趣的:(深度学习)