这里面好多坑,有好多版本的问题,还有内部代码的问题,有的缺少info.yaml文件的输出,最后改来改去,找来找去,弄好了。只需要改B:\Anaconda\Lib\site-packages\labelme\cil。类似这个目录中的json_to_dataset.py,就可以,然后使用cmd输入B:\Anaconda\Scripts>labelme_json_to_dataset.exe A:\huang\date -o=A:\huang\date
需要对应到自己的路径,然后就可以了。
import argparse import base64 import json import os import os.path as osp import imgviz import PIL.Image import yaml from labelme import logger from labelme import utils def main(): logger.warning( "批量处理json文件。" "注意!文件夹中不能有其他文件存在。" ) parser = argparse.ArgumentParser() parser.add_argument('json_file') parser.add_argument('-o', '--out', default=None) args = parser.parse_args() json_file = args.json_file # 输出路径 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.makedirs(out_dir) # 处理多个文件 json_files_names = os.listdir(json_file) for i in range(0, len(json_files_names)): path = os.path.join(json_file, json_files_names[i]) logger.info("正在处理: {}".format(path)) if os.path.isfile(path): try: data = json.load(open(path, encoding='UTF-8')) except: data = json.load(open(path)) if data['imageData']: imageData = data['imageData'] else: imagePath = os.path.join(os.path.dirname(path), data['imagePath']) try: with open(imagePath, 'rb', encoding='UTF-8') as f: imageData = f.read(encoding='UTF-8') imageData = base64.b64encode(imageData).decode('utf-8') except: 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" ) # 新建路径 save_dir = osp.join(out_dir, json_files_names[i].split('.')[0]) if not os.path.exists(save_dir): os.makedirs(save_dir) PIL.Image.fromarray(img).save(osp.join(save_dir, 'img.png')) utils.lblsave(osp.join(save_dir, 'label.png'), lbl) PIL.Image.fromarray(lbl_viz).save(osp.join(save_dir, 'label_viz.png')) with open(osp.join(save_dir, 'label_names.txt'), 'w') as f: for lbl_name in label_names: f.write(lbl_name + '\n') logger.info("Saved to: {}".format(save_dir)) info = dict(label_names=label_names) with open(osp.join(save_dir, 'info.yaml'), 'w') as f: yaml.safe_dump(info, f, default_flow_style=False) print('Saved to: %s' % out_dir)