作者:HW-LC
在CV领域COCO数据集使用非常广泛,COCO官方也提供了COCO数据集的解析工具,支持Lua,Matlab和Python,我们常用的是Python版本,也就是pycocotools,具体链接如下:
但是如果单纯的做姿态估计,COCO数据集也有很明显的缺点,比如:场景复杂,单幅图片目标多,物体非中心分布,小目标也多(一般小目标只有bbox和segmentation,没有keypoints,而没有keypoints的annotation对姿态估计来说是无效数据)。
我的项目的工作场景一般常见于室内,物体中心分布,单幅图片目标一般不超过4人,最多不超过10人,对姿态识别的准确性和实时性要求很高,所以单纯的使用COCO数据集不能很好的满足项目需求,所以同事给我推荐的本文的主角:Human3.6 M dataset,官网链接如下:,这个数据集跟我项目的场景比较吻合:室内,物体中心分布,姿态标注准确,既然如此那就有必要来研究下这个比较冷门的数据集了。
首先当然是下载链数据集了,数据集一般包括:数据(图片)和标注,下载链接如下(Human3.6M应该有360W张图片和标注,这个网盘只有整个数据集的十分之一左右):,这个链接我没法访问,是请同事帮忙下载的,解压之后数据集文件结构如下:
lechao@Alien2:/Disk2T/H36M-images/images$ ls -l| head -n10
total 318360
-rw-rw-r-- 1 lechao lechao 214789536 12月 14 2016 annot_train.h5
-rw-rw-r-- 1 lechao lechao 75592688 12月 14 2016 annot_val.h5
drwxrwxr-x 2 lechao lechao 20480 8月 9 19:25 s_01_act_02_subact_01_ca_01
drwxrwxr-x 2 lechao lechao 20480 8月 9 19:25 s_01_act_02_subact_01_ca_02
drwxrwxr-x 2 lechao lechao 20480 8月 9 19:25 s_01_act_02_subact_01_ca_03
drwxrwxr-x 2 lechao lechao 20480 8月 9 19:25 s_01_act_02_subact_01_ca_04
drwxrwxr-x 2 lechao lechao 24576 8月 9 19:25 s_01_act_02_subact_02_ca_01
drwxrwxr-x 2 lechao lechao 24576 8月 9 19:25 s_01_act_02_subact_02_ca_02
drwxrwxr-x 2 lechao lechao 24576 8月 9 19:25 s_01_act_02_subact_02_ca_03
这里没截完整,但是大致能看出来如下信息:
annot_train.h5:这个是train annotation file,h5是HDF5格式文件的后缀,在python中使用h5py包可以读取此文件,关于h5py的用法可以自行百度,这里不再赘述。
annot_val.h5:这个是evaluate annotation file。
s_01_act_02_subact_01_ca_01:这个是包含数据的文件夹,这些文件夹命名比较规整,其实是有规律的,这个后面再讲。
可以使用如下方法打印标注文件里面的属性:
with h5py.File(args.trainfile, 'r') as f:
key_list = list(f.keys())
print('train key list:', key_list)
打印结果如下:train key list: ['action', 'bbox', 'camera', 'id', 'joint_2d', 'joint_3d_mono', 'subaction', 'subject'],可以看到标注文件中有这些属性,这些属性在官网有些解释,不过不是解释的很模糊,一般人看了也是一脸懵逼,所以我还是有必要再解释下:
action:就是场景(scenarios),官网说的比较明白,总共有15个场景:directions,discussion,eating等等,编号02 ~ 16(我也没搞懂为啥不是从00或者01开始)。
bbox:boundary box,这个很明显了,是给object detection用的,我们项目是姿态估计,用不上这个属性。
camera:摄像机编号,这个官网有介绍,整个Human3.6M是用四个摄像机拍摄而成,摄像机位于场景的四个角落。
id:这个应该是annotation id。
joint_2d:person keypoints,也是我们姿态估计需要用到的关键信息。
joint_3d_mono:目标的3D信息,这个其实是Human3.6M的特色,为数不多的提供3D数据的数据集,不过我们工程用不上。
subaction:action的子动作,比如direction(id为02)这个动作,每个person做两次(id分别是01和02),就有了不同的subaction。
subject:person,官网上有说明,整个Human3.6M数据集使用了11个person(6 male和5 female),person的BMI从17到29(增加数据的多样性),7个用来训练和验证,4个用来测试。
bbox,joint_3d_mono等属性我们姿态检测完全用不到,所以不需要关注。
action,camera,subaction,subject,id等属性我们会用到,具体用法是我们需要根据这五个属性组合出annotation对应的image文件(要不然模型咋知道这个标注是对应哪个文件的呢?),比如我们打印一个annotation的这些信息:
action[0]: 2
camera[0]: 1
id[0]: 1
subaction[0]: 1
subject[0]: 1
subject 1可以解析出s_01,action 2可以解析出act_02,subaction 1可以解析出subact_01,camera 1可以解析出ca_01,组合起来就得到了annotation对应的image文件的文件夹:s_01_act_02_subact_01_ca_01,id 1可以解析出0000001,继续组合可以得到image文件的文件名:s_01_act_02_subact_01_ca_01_000001.jpg,这样就得到了annotation对应的image文件的绝对路径:s_01_act_02_subact_01_ca_01/ s_01_act_02_subact_01_ca_01_000001.jpg。
剩下就是最重要的joint_2d属性了,这个属性的值我们也打印一个看看:
joint_2d[0]: [[137.13937378 203.28787231]
[122.1421051 151.10655212]
[134.17036438 104.0575943 ]
[102.84673309 100.52474976]
[108.69631958 154.72946167]
[115.01844788 209.65567017]
[118.64239502 102.30228424]
[126.88787079 75.29245758]
[122.8181839 42.86528397]
[125.51329803 18.51787758]
[142.40003967 108.83320618]
[145.15391541 84.32307434]
[138.22865295 52.01548004]
[107.46088409 53.87348557]
[ 93.84050751 85.6969986 ]
[ 84.14053345 106.81880951]]
标准的16个[x, y]坐标点,比COCO数据集少一个,由于Human3.6M数据集场景状况十分良好,所以16个特征点是全标注的,不存在未标注和遮挡等情况。
有了标注的2D keypoints信息和标注对应的image文件,我们可以把对应的keypoint画出来看看:
最后放一张Human3.6M数据集的关节点图:






































苏公安网备 32011402010933号