格式转化——Labelme标注好的json文件批量转为png(标签)文件(物体为红色,背景为黑色)和jpg原图

作用如题目,批量将标注好的json文件转成png标签,jpg原图,其中标签时红黑图。

代码如下:

python 复制代码
import argparse
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
import yaml
from labelme.logger import logger
from labelme import utils
 
'''single json file'''
def main():
    logger.warning(
        "This script is aimed to demonstrate how to convert the "
        "JSON file to a single image dataset."
    )
    logger.warning(
        "It won't handle multiple JSON files to generate a "
        "real-use dataset."
    )
 
    parser = argparse.ArgumentParser()
    #parser.add_argument("json_file")
    parser.add_argument('--jsonfiles', nargs='?', const=True, default="datasets//before", help='resume most recent training') #设置输入路径  将default里面的路径转成json文件下的路径
    parser.add_argument("-o", "--out", default="datasets//png")  #设置输出路径 default里面的路径改为要存放标签png和原图jpg的路径
    args = parser.parse_args()
    import glob
    jsonfiles = glob.glob(args.jsonfiles+"/*.json")
    print(jsonfiles)
    for json_file in jsonfiles:
        if args.out is None:
            out_dir = osp.basename(json_file).replace(".", "_")
            out_dir = osp.join(osp.dirname(json_file), out_dir)
        else:
            out_dir = args.out
        if not osp.exists(out_dir):
            os.mkdir(out_dir)
 
        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, image=imgviz.asgray(img), label_names=label_names, loc="rb"
        )
 
        label_name  = json_file.split('\\')[-1].replace('.json','.png')
        image_name  = json_file.split('\\')[-1].replace('.json','.jpg')
        PIL.Image.fromarray(img).save(osp.join(out_dir, image_name))
        utils.lblsave(osp.join(out_dir, label_name), lbl)
        PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))
 
        with open(osp.join(out_dir, "label_names.txt"), "w") as f:
            for lbl_name in label_names:
                f.write(lbl_name + "\n")
 
        # 生成info.yaml文件
        # logger.warning('info.yaml is being replaced by label_names.txt')
        # 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))
 
if __name__ == "__main__":
    main()
相关推荐
carterwu4 分钟前
各个大厂是怎么实现组件库和相应扩展的?基础组件、区块、页面
前端
Face5 分钟前
promise 规范应用
前端
Mintopia5 分钟前
Node.js 中 fs.readFile API 的使用详解
前端·javascript·node.js
Face7 分钟前
事件循环
前端·javascript
ONE_Gua9 分钟前
chromium魔改——navigator.webdriver 检测
前端·后端·爬虫
CodePencil9 分钟前
CSS专题之盒模型
前端·css
谦谦橘子9 分钟前
服务端渲染原理解析
前端·javascript·react.js
carterwu10 分钟前
umi+模块联邦-配置指南
前端
Mintopia10 分钟前
深入理解 Three.js 中的 PerspectiveCamera
前端·javascript·three.js
无名之逆16 分钟前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust