分割标签转换为检测标签
用labelme工具标注了一些用于分割的标签,后面又需要用这个数据集用来做检测的任务,因此写了这个python脚本,用于将labelme生成的分割标签(json格式)转换为labelImg标注格式的检测标签(VOC格式的XML),转换后的数据可以使用labelImg正常的打开
import os
import json
def generatexml(json_dir,img_dir,save_xmldir):
jsonfiles = os.listdir(json_dir)
for json_file in jsonfiles:
if ".json" not in json_file:
continue
with open(os.path.join(json_dir,json_file)) as f:
anns=json.load(f)
segimagePath=anns["imagePath"]
image_file_name=os.path.basename(segimagePath)
imagePath=os.path.join(img_dir,image_file_name)
if not os.path.exists(imagePath):
raise f"not exist {imagePath}"
h,w=anns["imageHeight"],anns["imageWidth"]
xml_file = open(os.path.join(save_xmldir ,json_file[:-5] + '.xml'), 'w')
xml_file.write('<annotation>\n')
xml_file.write('\t<folder>'+os.path.basename(os.path.dirname(imagePath))+'</folder>\n')
xml_file.write('\t<filename>' + image_file_name + '</filename>\n')
xml_file.write('\t<path>' + imagePath + '</path>\n')
xml_file.write('\t<source>\n')
xml_file.write('\t\t<database>' + 'Unknown' + '</database>\n')
xml_file.write('\t</source>\n')
xml_file.write('\t<size>\n')
xml_file.write('\t\t<width>' + str(w) + '</width>\n')
xml_file.write('\t\t<height>' + str(h) + '</height>\n')
xml_file.write('\t\t<depth>1</depth>\n')
xml_file.write('\t</size>\n')
xml_file.write('\t<segmented>0</segmented>\n')
# write the region of text on xml file
for ann in anns["shapes"]:
label=ann["label"]
points=ann["points"]
x,y=list(zip(*points))
xmin,xmax,ymin,ymax=min(x),max(x),min(y),max(y)
xml_file.write('\t<object>\n')
xml_file.write('\t\t<name>' + label + '</name>\n')
xml_file.write('\t\t<pose>Unspecified</pose>\n')
xml_file.write('\t\t<truncated>0</truncated>\n')
xml_file.write('\t\t<difficult>0</difficult>\n')
xml_file.write('\t\t<bndbox>\n')
xml_file.write('\t\t\t<xmin>' + str(int(xmin)) + '</xmin>\n')
xml_file.write('\t\t\t<ymin>' + str(int(ymin)) + '</ymin>\n')
xml_file.write('\t\t\t<xmax>' + str(int(xmax)) + '</xmax>\n')
xml_file.write('\t\t\t<ymax>' + str(int(ymax)) + '</ymax>\n')
xml_file.write('\t\t</bndbox>\n')
xml_file.write('\t</object>\n')
xml_file.write('</annotation>')
xml_file.close()
if __name__ == '__main__':
json_dir="/home/fj/Documents/labeldata/dataset/4/json"
img_dir="/home/fj/Documents/labeldata/dataset/4/image"
save_xmldir="/home/fj/Documents/labeldata/dataset/4/xml"
generatexml(json_dir,img_dir,save_xmldir)