json文件的批量转化

实现json文件的批量转化


将标注后的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文件的路径运行即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值