将标注后的json文件转化为包含如下格式的文件夹
踩坑
进入含有labelme的环境后,输入
labelme_json_to_dataset 001.json
但是!
这只是单个文件的处理,对于大量的数据集,上述方法效率会非常低!
而且,如果是自动命名的话eg:格式为7 (14),中间有空格会报错!
正片
于是,开始了探索批量处理的方法(此方法适用于用labelme将所有图片标注完后)
import argparse
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
from labelme.logger import logger
from labelme import utils
import yaml
def json_to_dataset(json_file_path, json_file_name):
json_file = json_file_path
out_dir = osp.basename(json_file).replace(".", "_")
out_dir = osp.join(osp.dirname(json_file), out_dir)
img_path = osp.join(osp.dirname(json_file), "img")
mask_path = osp.join(osp.dirname(json_file), "mask")
if not osp.exists(out_dir):
os.mkdir(out_dir)
if not osp.exists(img_path):
os.mkdir(img_path)
if not osp.exists(mask_path):
os.mkdir(mask_path)
data = json.load(open(json_file))
imageData = data.get("imageData")
if not imageData:
imagePath = os.path.join(os.path.dirname(json_file), data["imagePath"])
with open(imagePath, "rb") as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode("utf-8")
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {"_background_": 0}
for shape in sorted(data["shapes"], key=lambda x: x["label"]):
label_name = shape["label"]
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
lbl, _ = utils.shapes_to_label(
img.shape, data["shapes"], label_name_to_value
)
label_names = [None] * (max(label_name_to_value.values()) + 1)
for name, value in label_name_to_value.items():
label_names[value] = name
lbl_viz = imgviz.label2rgb(
label=lbl, img=imgviz.asgray(img), label_names=label_names, loc="rb"
)
PIL.Image.fromarray(img).save(osp.join(out_dir, json_file_name+"_json_img.png"))
utils.lblsave(osp.join(out_dir, json_file_name+"_json_label.png"), lbl)
PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, json_file_name+"_json_label_viz.png"))
# 另存为
PIL.Image.fromarray(img).save(osp.join(img_path, json_file_name + "_json_img.png"))
utils.lblsave(osp.join(mask_path, json_file_name + "_json_label.png"), lbl)
with open(osp.join(out_dir, "label_names.txt"), "w") as f:
for lbl_name in label_names:
f.write(lbl_name + "\n")
info = dict(label_names=label_names)
with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
yaml.safe_dump(info, f, default_flow_style=False)
logger.info("Saved to: {}".format(out_dir))
# 返回path下所有文件构成的一个list列表
filelist = os.listdir("D:/Pythondata/sample/json/")
# 遍历输出每一个文件的名字和类型
for item in filelist:
# 输出指定后缀类型的文件
# if(item.endswith('.py')):
print(item)
json_to_dataset("D:/Pythondata/sample/json/"+item,item.split(".")[0])
把最后两个路径修改成为存放原始json文件的路径运行即可。