文档开发者中心
我的

【综合】姿态估计之数据集转换

作者: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数据集。

点赞
收藏
回复
11
分享
举报
浏览2048 发布于2019-11-20 00:34未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。