制作语义分割数据集大致需要
(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