每个图片一个.json文件标注,生成list
其中.json文件内容为:
{
"version": "4.5.6",
"flags": {},
"shapes": [
{
"label": "card",
"line_color": null,
"fill_color": null,
"points": [
[
251.78217821782175,
126.73267326732673
],
[
407.2079207920792,
106.93069306930693
],
[
442.3564356435644,
346.53465346534654
],
[
291.86138613861385,
377.7227722772277
]
],
"shape_type": "polygon",
"flags": {}
}
],
"lineColor": [
0,
255,
0,
128
],
"fillColor": [
255,
0,
0,
128
],
"imagePath": "1621317954959.jpg",
"imageData":hSZp2KTFACUUHrRiiwXP/2Q==",
"imageHeight": 480,
"imageWidth": 640
}
相应code:
#!/usr/bin/python3
import os
import cv2
import json
import shutil
headstr = """
<annotation>
<folder>VOC</folder>
<filename>%s</filename>
<source>
<database>My Database</database>
<annotation>COCO</annotation>
<image>flickr</image>
<flickrid>NULL</flickrid>
</source>
<owner>
<flickrid>NULL</flickrid>
<name>company</name>
</owner>
<size>
<width>%d</width>
<height>%d</height>
<depth>%d</depth>
</size>
<segmented>0</segmented>
"""
objstr = """
<object>
<name>%s</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>%d</xmin>
<ymin>%d</ymin>
<xmax>%d</xmax>
<ymax>%d</ymax>
</bndbox>
</object>
"""
tailstr = '''
</annotation>
'''
def mkr(path):
if os.path.exists(path):
shutil.rmtree(path)
os.mkdir(path)
else:
os.mkdir(path)
def write_xml(anno_path,head, objs, tail):
f = open(anno_path, "w")
f.write(head)
for obj in objs:
f.write(objstr%(obj[0],obj[1],obj[2],obj[3],obj[4]))
f.write(tail)
def jsonload(data,label):
objs=[]
print('data------------',data['shapes'][0])
points0=data['shapes'][0]['points'][0]
points1=data['shapes'][0]['points'][1]
points2=data['shapes'][0]['points'][2]
points3=data['shapes'][0]['points'][3]
points0_x=int(points0[0])
points0_y=int(points0[1])
points1_x=int(points1[0])
points1_y=int(points1[1])
points2_x=int(points2[0])
points2_y=int(points2[1])
points3_x=int(points3[0])
points3_y=int(points3[1])
leftpoint_x=min(points0_x,points1_x,points2_x,points3_x)
leftpoint_y=min(points0_y,points1_y,points3_y,points3_y)
rightpoint_x=max(points0_x,points1_x,points2_x,points3_x)
rightpoint_y=max(points0_y,points1_y,points3_y,points3_y)
object_height=rightpoint_y-leftpoint_y
object_width=rightpoint_x-leftpoint_x
if object_height<1:
print('height is wrong!')
if object_width < 1:
print('width is wrong!')
height=data['imageHeight']
width=data['imageWidth']
#obj=[label,leftpoint_x,leftpoint_y,rightpoint_x,rightpoint_y,width,height]
obj=[label,leftpoint_x,leftpoint_y,rightpoint_x,rightpoint_y]
objs.append(obj)
return objs
def save_annotations_and_imgs(filename,objs):
anno_path=anno_dir+filename[:-3]+'xml'
img_path = os.path.join(dataDir,filename)
dst_imgpath=os.path.join(img_dir,filename)
img=cv2.imread(img_path)
#if (img.shape[2] == 1):
# print(filename + " not a RGB image")
# return
shutil.copy(img_path, dst_imgpath)
head=headstr % (filename, img.shape[1], img.shape[0], img.shape[2])
tail = tailstr
write_xml(anno_path,head, objs, tail)
if __name__ == '__main__':
jsonlist='jsonlist.txt'
f_json=open(jsonlist)
lines=f_json.readlines()
label='paper' #相应标签设置
savepath="data/"
img_dir=savepath+'images/'
anno_dir=savepath+'Annotations/'
dataDir= 'path/to/images'
mkr(img_dir)
mkr(anno_dir)
for line in lines:
print('------------------------------')
line_tmp=line.strip().split(' ')[0]
filepath,filename=os.path.split(line_tmp)
filename_tmp=filename.replace('.json','.jpg')
print('filename',filename)
with open(line_tmp, 'r') as f:
data = json.load(f)
json_str = json.dumps(data)
data = json.loads(json_str)
objs = jsonload(data,label)
save_annotations_and_imgs(filename_tmp, objs)