ubuntu下运行该脚本批量转换
windows下没试过,可能需要把第二十六行和第二十七行代码改成
os.system('dir 文件夹路径\*.json /b/s > json_list.txt')
import argparse
import base64
import json
import os
import os.path
import warnings
import PIL.Image
import yaml
from labelme.logger import logger
from labelme import utils
#labelme .json文件批量转换脚本
#参数 -o 或者 --out:输出文件的位置,不带参数则默认存放在json文件同目录下
def check_dir(dir):
'''检查文件夹是否存在,不存在则创建文件夹'''
if not os.path.exists(dir):
os.makedirs(dir)
def main():
'''获取json文件列表'''
# pathdir = os.getcwd()
pathdir = './'
os.system('find %s -name *.json > json_list.txt' % pathdir)
with open('./json_list.txt', 'r') as json_file:
json_list = json_file.readlines()
'''转换文件'''
temp = 0
for file_name in json_list:
file_name = file_name.strip('\n')
print(file_name)
logger.warning('This script is aimed to demonstrate how to convert the'
'JSON file to a single image dataset, and not to handle'
'multiple JSON files to generate a real-use dataset.')
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--out', default=None)
args = parser.parse_args()
json_file = file_name
if args.out is None:
out_dir = os.path.basename(json_file).replace('.', '_')
out_dir = os.path.join(os.path.dirname(json_file), out_dir)
else:
out_dir = args.out
check_dir(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 = utils.draw_label(lbl, img, label_names)
# 保存文件
PIL.Image.fromarray(img).save(os.path.join(out_dir, 'img%s.png' % temp))
utils.lblsave(os.path.join(out_dir, 'label%s.png' % temp), lbl)
PIL.Image.fromarray(lbl_viz).save(os.path.join(out_dir, 'label_viz%s.png' % temp))
with open(os.path.join(out_dir, 'label_names%s.txt' % temp), 'w') as f:
for lbl_name in label_names:
f.write(lbl_name + '\n')
logger.warning('info.yaml is being replaced by label_names%s.txt' % temp)
info = dict(label_names=label_names)
with open(os.path.join(out_dir, 'info%s.yaml' % temp), 'w') as f:
yaml.safe_dump(info, f, default_flow_style=False)
logger.info('Saved to: {} {}'.format(out_dir, temp))
temp += 1
if __name__ == '__main__':
main()