作者:HW-LC
很多姿态估计的工程都是用pycocotools来解析COCO dataset,如果我们需要使用其他dataset来训练我们的工程,难不成我们还得自己写一个tool来解析dataset?评估了下工作量之后放弃了,还是写个工具把其他dataset转换成COCO dataset来的更容易些。现在需要转换的数据集是Human3.6M dataset和MPII dataset,前面的文章我们已经分析过了COCO,Human3.6M,MPII dataset,现在来写转换工具也就是水到渠成了。
COCO keypoints标注格式如下:
{
'images':Array[2],
'licenses':Array[8],
'categories':Array[1],
'info':Object{...},
'annotations':Array[2]
}
这里licenses,categories,info这三个属性是固定的,可以自行填充,具体填充方法如下:
def buildInfoDict():
fake_info_dict = dict()
fake_info_dict['description'] = 'Fake COCO Dataset'
fake_info_dict['url'] = 'http://cocodataset.org'
fake_info_dict['version'] = '1.0'
fake_info_dict['year'] = 2017
fake_info_dict['contributor'] = 'COCO Consortium'
fake_info_dict['date_created'] = '2018/08/08'
return fake_info_dict
def buildLicensesList():
fake_license_list = list()
for i in range(1, 9):
fake_dict = dict()
url = 'http://fakeurl' + str(i) + '.org'
name = 'fake name' + str(i)
fake_dict['url'] = url
fake_dict['id'] = i
fake_dict['name'] = name
fake_license_list.append(fake_dict)
return fake_license_list
def buildCategoryList():
fake_category_list = list()
fake_category_dict = dict()
fake_category_dict['supercategory'] = 'person'
fake_category_dict['name'] = 'person'
fake_category_dict['id'] = 1
fake_category_dict['skeleton'] = [[16, 14], [14, 12], [17, 15], [15, 13], [12, 13], [6, 12], [7, 13], [6, 7], [6, 8],[7, 9], [8, 10], [9, 11], [2, 3], [1, 2], [1, 3], [2, 4], [3, 5], [4, 6], [5, 7]]
fake_category_dict['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']
fake_category_list.append(fake_category_dict)
return fake_category_list
需要重点关注的是images和annotations等属性,接下来分别解析下Human3.6M和MPII如何填充images和annotations属性。
Human3.6M To COCO
images填充:
image_dict = dict()
image_dict['license'] = 4
image_dict['file_name'] = rel_path + '.jpg'
image_dict['coco_url'] = 'http://fake_coco.jpg'
image_dict['height'] = 224
image_dict['width'] = 224
image_dict['date_captured'] = '2018-08-08 08:08:08'
image_dict['flickr_url'] = 'http://fake_flickr.jpg'
image_dict['id'] = i
image_list.append(image_dict)
license,coco_url,data_captured,flickr_url:自行填充fake value。
height,width:固定的224,Human3.6M的image分辨率是固定的224x224。
id:image id,不重复就行,所以自增即可。
file_name:从Human3.6M annotation文件中解析出来。
一个image就是一个dict,多个dict就可以组成COCO格式的images属性(list格式)。
annotations填充:
anno_dict = dict()
anno_dict['image_id'] = i
anno_dict['iscrowd'] = 0
anno_dict['bbox'] = [0, 0, 0, 0]
anno_dict['id'] = i
anno_dict['category_id'] = 1
anno_dict['segmentation'] = [[0, 0, 0, 0]]
anno_dict['num_keypoints'] = 17
anno_dict['keypoints'] = buildKeypoint(f['joint_2d'].value[i].reshape(1, -1)[0])
anno_list.append(anno_dict)
image_id:annotation对应的image id(根据image id可以找到具体的image file)。
iscrowd:由于Human3.6M dataset只有单人场景,所以这个属性都是固定为0即可。
bbox:由于姿态估计用不到bbox,所以这里填充全0即可。
id:annotation id,不重复就行,所以自增即可。
category_id:1代表person,所以固定为1。
segmentation:Human3.6M不包含segmentation数据,所以这里填充全0即可。
num_keypoints:Human3.6M数据标注完整,每幅图片都是全标注,所以这里固定为17。
keypoints:从Human3.6M的joint_2d属性中可以解析出keypoints,visiable固定为2(即已标注且可见),Human3.6M的关节点序号和COCO的不太一样,所以需要做个转换,具体转换方式如下:
conv_list = [9, 7, 7, 7, 7, 13, 12, 14, 11, 15, 10, 3, 2, 4, 1, 5, 0]
即COCO节点中的0(Nose)对应Human3.6M的9(Head),Human3.6M中没有Nose,所以用Head替代,COCO节点中的5(Lshoulder)对应Human3.6M的13(Lshoulder),以此类推就不再赘述了。
一个annotation就是一个dict,多个dict就可以组成COCO格式的annotations属性(list格式)。
到此为止COCO数据集所需要的所有属性就填充完毕了,可以把Human3.6M数据集转换成COCO数据集,然后拿去训练模型和参数调优了~
MPII To COCO
images填充:
跟Human3.6M类似,file_name属性可以从MPII annotation的image属性中获取,但是height和width不是固定的,而annotation中也没有提供,所以需要使用cv2工具来获取。
annotations填充:
除了num_keypoints和keypoints这两个属性之外,其他的属性都跟Human3.6M一样填充fake value,num_keypoints和keypoints属性可以从MPII annotation的point属性中获取。
到此为止MPII数据集也可以转换成COCO数据集了。
PS:
使用转换过的数据进行模型训练之后,发现Human3.6M数据集训练出来的模型实际效果比较差(Human3.6M数据集动作比较单一,泛化能力差),MPII数据集训练出来的模型比较好(MPII数据集质量比较高,单幅图片目标数量适中,目标标注完整,基本没有小目标),所以当需要扩充COCO数据集时,可以优先考虑MPII数据集。





































苏公安网备 32011402010933号