编辑labelme标注的json文件
- 解决的问题
- json文件的读取
- json文件的保存
- 编辑labelme的json文件
- 完整的程序
解决的问题
label是一种进行图像标注的软件,但是不同分类任务会需要不同的标注格式,人工修改标注结果极为费时。可以根据需求采用程序自动的按照一定的规则修改标注文件。
在使用maskrcnn程序时需要使用实例标注文件,但原始标注文件为语义分割格式,如原始语义分割标签为person,person,dog,dog,dog。实例分割的标签则为person0,person1,dog0,dog1,dog2。通过程序读取原始文件并依次对每个目标进行计数并修改标签名称。
json文件的读取
def read_json(json_path):
f = open(json_path)
json_file = json.load(f)
return json_file
json文件的保存
def save_json(out_path,json_file):
f = open(out_path, 'w',encoding='utf-8')
json.dump(json_file,f)
编辑labelme的json文件
def edit_labelme_json(labelme_json):
version = labelme_json['version']
flags = labelme_json['flags']
shapes = labelme_json['shapes']
imagePath = labelme_json['imagePath']
imageData = labelme_json['imageData']
imageHeight = labelme_json['imageHeight']
imageWidth = labelme_json['imageWidth']
label_list = []
label_dic = {
}
new_shapes = list([])
for tmp_shape in shapes:
for shape_key,shape_values in tmp_shape.items():
if shape_key == 'label':
if shape_values not in label_list:
label_list.append(shape_values)
label_dic.update({
shape_values:0})
shape_values = shape_values+'0'
else:
label_dic.update({
shape_values:label_dic[shape_values]+1})
shape_values = shape_values+str(label_dic[shape_values])
label_values = shape_values
elif shape_key == 'points':points_values = shape_values
elif shape_key == 'group_id':group_id_values = shape_values
elif shape_key == 'shape_type':shape_type_values = shape_values
elif shape_key == 'flags':flags_values = shape_values
new_shape = {
'label':label_values,'points':points_values,'group_id':group_id_values,'shape_type':shape_type_values,'flags':flags_values}
new_shapes.append(new_shape)
new_json = {
'version':version,
'flags':flags,
'shapes':new_shapes,
'imagePath':imagePath,
'imageData':imageData,
'imageHeight':imageHeight,
'imageWidth':imageWidth}
return new_json
完整的程序
import os,json
import numpy as np
def read_json(json_path):
f = open(json_path)
json_file = json.load(f)
return json_file
def save_json(out_path,json_file):
f = open(out_path, 'w',encoding='utf-8')
json.dump(json_file,f)
def edit_labelme_json(labelme_json):
version = labelme_json['version']
flags = labelme_json['flags']
shapes = labelme_json['shapes']
imagePath = labelme_json['imagePath']
imageData = labelme_json['imageData']
imageHeight = labelme_json['imageHeight']
imageWidth = labelme_json['imageWidth']
label_list = []
label_dic = {
}
new_shapes = list([])
for tmp_shape in shapes:
for shape_key,shape_values in tmp_shape.items():
if shape_key == 'label':
if shape_values not in label_list:
label_list.append(shape_values)
label_dic.update({
shape_values:0})
shape_values = shape_values+'0'
else:
label_dic.update({
shape_values:label_dic[shape_values]+1})
shape_values = shape_values+str(label_dic[shape_values])
label_values = shape_values
elif shape_key == 'points':points_values = shape_values
elif shape_key == 'group_id':group_id_values = shape_values
elif shape_key == 'shape_type':shape_type_values = shape_values
elif shape_key == 'flags':flags_values = shape_values
new_shape = {
'label':label_values,'points':points_values,'group_id':group_id_values,'shape_type':shape_type_values,'flags':flags_values}
new_shapes.append(new_shape)
new_json = {
'version':version,
'flags':flags,
'shapes':new_shapes,
'imagePath':imagePath,
'imageData':imageData,
'imageHeight':imageHeight,
'imageWidth':imageWidth}
return new_json
def list_json(path):
sup_ext = ['.json']
all_list = list(map(lambda x:os.path.join(path,x),os.listdir(path)))
json_list = [x for x in all_list if os.path.splitext(x)[1] in sup_ext]
return json_list
def get_outpath(out_dir,name):
if not os.path.exists(out_dir):os.makedirs(out_dir)
return os.path.join(out_dir,os.path.basename(name))
if __name__ == '__main__':
json_dir = 'json_ori'
out_dir = 'json'
json_list = list_json(json_dir)
for i in range(len(json_list)):
json_r = read_json(json_list[i])
json_ed = edit_labelme_json(json_r)
outpath = get_outpath(out_dir,json_list[i])
save_json(outpath,json_ed)