问题提出
我训练的姿态估计模型是ViTPose,是一种自顶向下的姿态估计方法,人话就是先把人给框出来,然后再对这个框进行模型推理,获得最终的关键点:
因此,理论上来说,标注数据仅仅需要bbox和关键点坐标就可以了。但是我在写ViTPose训练配置文件的时候,我发现了一个匪夷所思的现象:
我发现官方的训练文档中的val_dataloader指定了bbox_file为COCO_val2017_Detections.json,但是这东西不应该在ann_file里面中就给了吗?很奇怪,我抱着怀疑的态度把这两个json文件对比了一下,发现val_dataloader对应的JSON文件确实也有bbox的信息,不过在相同图片下,他们的bbox的坐标和大小有微小的不同,这下真把我整蒙了。
问题解答
后来找了各种资料之后才理解到底为什么要这么做:
- person_keypints_val2017里面的是“标准答案”, 是从人工标注里面的数据切分出来的,用于最后的模型评估。
- 而COCO_val2017_detections是由一个指定的检测器生成的。
对于不同的姿态检测模型,如果检测的bbox框质量不同,那么就会直接直接影响到验证推理时候的keypoints位置,因此就很难公平的比较它们实际的keypoints预测能力。所以,为了让所有的模型都能在统一的bbox起跑线上,自顶向下的姿态估计模型在训练的时候都要统一使用这个bbox_file。
至于为什么不用person_keypoints_val2017里面的bbox,我觉得是在模拟一个完整的机器预测情况:从检测框的生成到关键点的生成全部都由机器负责,排除人的参与,才能真正体现整个top-down模型方法的性能如何。