12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import copy
- import json
- import argparse
- import numpy
- import glob
- import os
- from tqdm import tqdm
- def Labelme2Label_Studio(labelme_dirs, project_id):
- all_label_list = []
- label_dict = {}
- data_dict = {}
- annotations_dict = {}
- result_dict = {}
- vale_dict = {}
- labelme_path = []
- for labelme_dir in labelme_dirs:
- list_path = glob.glob(labelme_dir + "/*.json")
- labelme_path.extend(list_path)
- # print(label_path)
- # 进行必要信息的json转换
- for label in tqdm(labelme_path):
- with open(label, 'r', encoding='utf-8') as f:
- info = json.load(f)
- if not info['shapes']:
- continue
- annotations_list = [] # 会把之前的也添加进来,必须重置
- result_list = [] # 同上
- width = info['imageWidth']
- height = info['imageHeight']
- result_dict['original_width'] = copy.deepcopy(width)
- result_dict['original_height'] = copy.deepcopy(height)
- result_dict['image_rotation'] = 0
- result_dict['from_name'] = 'label'
- result_dict['to_name'] = 'image'
- result_dict['type'] = 'rectanglelabels'
- result_dict['origin'] = 'manual'
- # 标注信息写入
- for shape in info['shapes']:
- # print(shape)
- # print(shape['points'][0][0])
- vale_dict['x'] = shape['points'][0][0] * 100 / copy.deepcopy(width)
- vale_dict['y'] = shape['points'][0][1] * 100 / copy.deepcopy(height)
- vale_dict['width'] = (shape['points'][1][0] - shape['points'][0][0]) * 100 / copy.deepcopy(width)
- vale_dict['height'] = (shape['points'][1][1] - shape['points'][0][1]) * 100 / copy.deepcopy(height)
- vale_dict['rotation'] = 0
- vale_dict['rectanglelabels'] = [copy.deepcopy(shape['label'])]
- result_dict['value'] = copy.deepcopy(vale_dict)
- result_list.append(copy.deepcopy(result_dict))
- annotations_dict['result'] = copy.deepcopy(result_list)
- if 'updated_by' in info:
- annotations_dict['updated_by'] = info['updated_by']
- annotations_list.append(copy.deepcopy(annotations_dict))
- label_dict['annotations'] = copy.deepcopy(annotations_list)
- data_dict['image'] = '/data/upload/' + str(project_id) + '/' + os.path.basename(info['imagePath'])
- label_dict['data'] = copy.deepcopy(data_dict)
- if 'updated_by' in info:
- label_dict['updated_by'] = info['updated_by']
- all_label_list.append(copy.deepcopy(label_dict))
- f.close()
- # print(all_label_list)
- if not all_label_list:
- print('无有效json数据')
- else:
- json.dump(all_label_list, open('project' + str(project_id) + '.json', 'w', encoding='utf-8'),
- ensure_ascii=False, indent=2)
- if __name__ == '__main__':
- parser = argparse.ArgumentParser()
- parser.add_argument('--labelme_dirs', type=str, nargs="+", default=[])
- parser.add_argument('--project_id', type=int)
- args = parser.parse_args()
- Labelme2Label_Studio(args.labelme_dirs, args.project_id)
|