用imglab做物体特征点标注,将标注数据转为coco keypoints数据集转换代码:
import xml.dom.minidom as xmldom
import os
import csv
import json
image_w = 640
image_h = 640
image_start_index = 0
instance_start_index = 10000
info = {"description": "COCO 2017 Dataset","url": "http://cocodataset.org","version": "1.0","year": 2017,"contributor": "COCO Consortium","date_created": "2017/09/01"}
licenses = [{"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/","id": 1,"name": "Attribution-NonCommercial-ShareAlike License"},
{"url": "http://creativecommons.org/licenses/by-nc/2.0/","id": 2,"name": "Attribution-NonCommercial License"},
{"url": "http://creativecommons.org/licenses/by-nc-nd/2.0/","id": 3,"name": "Attribution-NonCommercial-NoDerivs License"},
{"url": "http://creativecommons.org/licenses/by/2.0/","id": 4,"name": "Attribution License"},
{"url": "http://creativecommons.org/licenses/by-sa/2.0/","id": 5,"name": "Attribution-ShareAlike License"},
{"url": "http://creativecommons.org/licenses/by-nd/2.0/","id": 6,"name": "Attribution-NoDerivs License"},
{"url": "http://flickr.com/commons/usage/","id": 7,"name": "No known copyright restrictions"},
{"url": "http://www.usa.gov/copyright.shtml","id": 8,"name": "United States Government Work"}]
images = []
annotations = []
categories = [{"supercategory": "person","id": 1,"name": "person","keypoints": ["nose","left_eye","right_eye","left_ear","right_ear","left_shoulder","right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"],
"skeleton": []}]
xml_filepath = os.path.abspath("/home/jiajie/pytorch/detectron2/datasets/imglab_data/mydata.xml")
############################################
# 得到文件对象
dom_obj = xmldom.parse(xml_filepath)
# 得到元素对象
element_obj = dom_obj.documentElement
# 获得子标签
sub_element_obj = element_obj.getElementsByTagName("image")
for i in range(len(sub_element_obj)):
image_start_index = image_start_index + 1
#images
image_info = {"license": 1}
image_info['file_name'] = str(sub_element_obj[i].getAttribute("file")).split("\")[0]+"_"+str(sub_element_obj[i].getAttribute("file")).split("\")[1]
#print(image_info['file_name'])
image_info['coco_url'] = ""
image_info['height'] = int(image_h)
image_info['width'] = int(image_w)
image_info['date_captured'] = ""
image_info['flickr_url'] = ""
image_info['id'] = int(image_start_index)
images.append(image_info)
sub_element_obj_box = sub_element_obj[i].getElementsByTagName("box")
for j in range(len(sub_element_obj_box)):
instance_start_index = instance_start_index + 1
sub_element_obj_keypoints = sub_element_obj_box[j].getElementsByTagName("part")
# annotations
annotations_info = {"segmentation":[[]]}
annotations_info['num_keypoints'] = int(len(sub_element_obj_keypoints))
annotations_info['area'] = 0.0
annotations_info['iscrowd'] = 0
keypoints_dict = {}
for k in range(len(sub_element_obj_keypoints)):
#print(sub_element_obj_keypoints[k].getAttribute("x"),sub_element_obj_keypoints[k].getAttribute("y"))
kp_name = str(sub_element_obj_keypoints[k].getAttribute("name"))+"_"+str(sub_element_obj_keypoints[k].getAttribute("x"))+"_"+str(sub_element_obj_keypoints[k].getAttribute("y"))
keypoints_dict[kp_name] = pow(int(sub_element_obj_keypoints[k].getAttribute("x")),2)+pow(int(sub_element_obj_keypoints[k].getAttribute("y")),2)
sort_list = sorted(keypoints_dict.items(), key=lambda d: d[1], reverse=False)
#print(sort_list)
keypoints_list = []
#print(int(str(sort_list[0][0]).split("_")[1]))
keypoints_list.append(int(str(sort_list[0][0]).split("_")[1]))
keypoints_list.append(int(str(sort_list[0][0]).split("_")[2]))
keypoints_list.append(int(2))
keypoints_list.append(int(str(sort_list[1][0]).split("_")[1]))
keypoints_list.append(int(str(sort_list[1][0]).split("_")[2]))
keypoints_list.append(int(2))
keypoints_list.append(int(str(sort_list[2][0]).split("_")[1]))
keypoints_list.append(int(str(sort_list[2][0]).split("_")[2]))
keypoints_list.append(int(2))
keypoints_list.append(int(str(sort_list[3][0]).split("_")[1]))
keypoints_list.append(int(str(sort_list[3][0]).split("_")[2]))
keypoints_list.append(int(2) )
annotations_info['keypoints'] = keypoints_list
annotations_info['image_id'] = int(image_start_index)
#print(keypoints_list)
#bbox
annotations_info['bbox'] = [int(sub_element_obj_box[j].getAttribute("left")),int(sub_element_obj_box[j].getAttribute("top")),int(sub_element_obj_box[j].getAttribute("width")),int(sub_element_obj_box[j].getAttribute("height"))]
annotations_info['category_id'] = 1
annotations_info['id'] = instance_start_index
annotations.append(annotations_info)
image = {
'info': info,
'licenses': licenses,
'images': images,
'annotations': annotations,
'categories': categories
}
with open('/home/jiajie/pytorch/detectron2/datasets/imglab_data/person_keypoints_train2017.json', 'w') as f:
json.dump(image,f)