jin-s13 / COCO-WholeBody

ECCV2020 paper "Whole-Body Human Pose Estimation in the Wild"
768 stars 73 forks source link

The question about the float flag of face and hand kpt? #32

Closed 2050airobert closed 2 years ago

2050airobert commented 2 years ago

hi, 1 认真分析了下coco-wholebody数据集,感觉face valid为ture 标记过的脸只有2480多个,标记为false的为1388个,这个合理吗? 感觉加起来只有四五千个,跟11万多的图片比起来还是少了很多啊,这个是不是哪里有问题呢?为什么咱们真正标注的只有四五千个face? 2 其他的比如lefthand 和 righthand 也存在类似问题,不知道是否有官方的数据统计 valid标注有效为true的有多少,包括foot? 3 尤其不明白的一点是,hand 和 face都有许多 float类型的v 也就是三元组(x,y ,v )中到的v 表示改点是否可见或者被遮挡的数值,但是咱们这里不是 coco原始使用的0 1 2 ,而是采用了 0到1之间的浮点数,不知道这里的0和1 以及中间的浮点数代表什么含义,是跟概率和置信度有关吗? 如果使用这些数据进行训练,那么该选择多大范围内的标注点才有效呢? 有木有官方的说明呢? 多谢 4 附加一条,hand和face的 三元组第三位 的数值还不一样,hand是从0到1范围,而face 是有0 还有 1到2之内的吧,如果没统计错的话,face并没有0到1之内的数值?这个是什么意思呢? 期待您的答复 BR

jin-s13 commented 2 years ago

对于问题1和问题2:具体数字记不清了。为什么人脸数量不是11万?1)我们只对有body kpt标注的人体进行标注。2)大量的图都没有有效的脸(尺寸过小、过于模糊、被遮挡等原因)

对于问题3和问题4:可以参考 https://github.com/jin-s13/COCO-WholeBody/blob/master/data_format.md 只要大于0,就可以认为是有效数据。

2050airobert commented 2 years ago

1 那这个置信度或者score 是不是最好作为loss的 权重,正比权重,是不是对于各部位尤其是手 脚部位的检测效果有明显提升呢? 或者说这个score如何使用可以对训练出来的模型更有帮助? 2 我仔细检查了对于face来说 flag 实际山没有0到1之间的,只有1 0 2 三种,这个又与其他的foot hand不同,这是为什么

jin-s13 commented 2 years ago
  1. 没有尝试过用这个score,也许会有帮助。
  2. 0、1、2 的标注是符合coco的标注传统吧
2050airobert commented 2 years ago

多谢,再问个开源代码mmpose的问题,这部分wholebody json文件读入,尤其是各个新增关键点部分的读入,主处理部分是在哪个源码文件里实现的呀?

jin-s13 commented 2 years ago

https://github.com/open-mmlab/mmpose/blob/master/mmpose/datasets/datasets/top_down/topdown_coco_wholebody_dataset.py

2050airobert commented 2 years ago

我看了下 1 您这个文件提到的格式应该是跟传统coco json标注文件一样的,只不过现在是133个点, 具体是 COCO-WholeBody keypoint indexes:: 0-16: 17 body keypoints, 17-22: 6 foot keypoints, 23-90: 68 face keypoints, 91-132: 42 hand keypoints 可是我我看到的coco_wholebody_val_v1.0.json 以及coco_wholebody_train_v1.0.json 文件,他们的格式是另外一种 "face_valid": false, "lefthand_valid": false, "righthand_valid": false, "foot_valid": false, "foot_kpts": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] },

都是以单独的某个部位来体现的,而不是像coco一样统一放到keypoints里面 组成一个大的3x133的向量。 2 咱们是不是有一种转换方式,能够将我看到的这种coco_wholebody_train_v1.0.json 文件转为 传统coco格式的json,能提供下脚本位置吗? 3 假如 我只想要foot里面的两个点加上手上的10个点,那么有木有类似的脚本可以直接转换为coco传统格式的json,能否提供下?多谢

jin-s13 commented 2 years ago

我们直接读的是 coco_wholebody_train_v1.0.json 请注意看这一行。

https://github.com/open-mmlab/mmpose/blob/c6f9b2dcbbee7dfda741f26ee08896c5e606064e/mmpose/datasets/datasets/top_down/topdown_coco_wholebody_dataset.py#L131

2050airobert commented 2 years ago

嗯,确实是直接处理coco_wholebody_train_v1.0.json 的。那这就有两个问题了。 我这里有两种不同格式的 133个关键点的json标注文件,有两种方案可以一起使用这两个json 1 将coco_wholebody_train_v1.0.json 转为传统json格式的文件,然后合并两个json 2 在代码中训练之前,分别读入这两个json,然后抽取其中所需的关键点坐标部分,然后把他们组合起来,这样就不需要合并两个json成一个json文件了 3 附加个问题,这个json里keypoint有一个字段 "num_keypoints": 12, 这个num_keypoints 在训练的过程中会用到吗? 如果随便填写一个非0值,应该也不会影响训练结果吧? 如果影响,为什么呢? 期待您的答复 ,多谢

jin-s13 commented 2 years ago

1)关于这两个方案,感觉都可以。 2)在数据处理过程中,num_keypoints=0 (body keypoints数量为0的)的会被过滤掉,不参与训练。

2050airobert commented 2 years ago

1)哈哈,其实还是应该有一种更方便的方法,哪种呢? 2)num_keypoints不等于0的时候呢,这时候num_keypoints 的值 小于或者远远小于实际keypoint 标志不为0的三元组数量总和,会对训练结果有影响吗? 也就是说训练的时候会用到大于0的 num_keypoints 吗? 还是只会使用keypoint 那个向量,甚至代码内部已经在内部又统计了一次 num_keypoints 。 麻烦指教下具体细节属于哪一种呢?

2050airobert commented 2 years ago

另外,稍微插播一个小问题,如何能在json.dump保存json文件的时候格式能像原始train2017 coco json文件person_keypoints_train2017.json 的格式一样的紧凑呢?
我保存出来的如图 image 而person_keypoints_train2017.json的格式是下面的 image 麻烦大佬指点迷津,多谢

jin-s13 commented 2 years ago

有个 indent 参数,不加应该就好了。

jin-s13 commented 2 years ago

num_keypoints不等于0的时候呢,这时候num_keypoints 的值 小于或者远远小于实际keypoint 标志不为0的三元组数量总和,会对训练结果有影响吗? 也就是说训练的时候会用到大于0的 num_keypoints 吗? 还是只会使用keypoint 那个向量,甚至代码内部已经在内部又统计了一次 num_keypoints 。 麻烦指教下具体细节属于哪一种呢?

不会有影响。只判断一次,过滤掉一个关键点都没有的人。

2050airobert commented 2 years ago

json.dump(root_data2, f, ensure_ascii=False,separators=(',', ':')) 这样写吗? 还是 json.dump(root_data2, f, separators=(',', ':')) 或者json.dump(root_data2, f, ensure_ascii=True,separators=(',', ':')) json.dump(root_data2, f, ensure_ascii=“utf-8”,separators=(',', ':'))

jin-s13 commented 2 years ago
import json_tricks as json
json.dump(data, f) 

貌似这样就可以

2050airobert commented 2 years ago

tks, it works 还有个小问题,就是如下图这种, 1 被遮挡的很厉害,于是标注时候根据猜测给纯粹脑补出来的这种嘴唇两个角的点,有必要吗? 这个会对训练结果有比较好的提升吗? 会不会引来一些误解,导致把后脑勺给当成嘴唇角之类的负面影响呢? 2 咱们coco wholebody这批 foot hand face 几乎都是能脑补出来的点,只要图片清晰物体足够大,即使遮挡很严重,也都是尽可能脑补出来的对吗? image

jin-s13 commented 2 years ago

嗯嗯,会尽量脑补。 因为coco的评价指标是希望大家脑补出遮挡点的。