格式转化——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()
相关推荐
云姜.3 分钟前
JSON Schema使用
python·json
用户31673613034218 分钟前
SSE消息推送前后端代码
前端·后端
像我这样帅的人丶你还26 分钟前
JavaScript 迭代器详解
前端·javascript
逍遥归来31 分钟前
《SWIFTER -Swift开发者必备Tips》学习笔记
前端
timi先生31 分钟前
语料库全栈项目部署 (Vue + Java + CQPweb)
java·前端·vue.js
Lazy_zheng32 分钟前
Map / Set / WeakMap / WeakSet,一次给你讲透
前端·javascript·面试
learyuan32 分钟前
Windows原生开发
前端
uzong34 分钟前
ClaudeCode 入门详细教程,手把手带你Vibe Coding
前端·人工智能
英俊潇洒美少年44 分钟前
前端安全 完整精讲
前端·安全
aircrushin1 小时前
2026我最推荐的前端设计skills
前端