AI Challenge Human Pose 评测代码分析
评测方法和标准
根据最终提交的submit.json文件和ground.json文件计算mAP得分;
评测代码最终会输出mAP结果,错误信息和警告信息;
主函数分析
- 读入检测结果的json文件和ground truth的json文件名称,分别赋值给args.submit和args.ref;
- 初始化返回字典,包含一个error信息,一个score信息,多个warning信息;
- 加载标注文件信息,load_annotations分析见下;
- 加载检测结果文件信息,load_predictions分析见下(这里很重要,关系到我们生成预测结果文件的格式);
- 根据解压后的标注和预测信息,计算得分,keypoint_eval分析见下;
load_annotations函数分析
- 初始化输出字典,其中包括image_ids字段用来存储图片ID,annos字段用来存储人体框标注和关键点标注,delta字段用来存储14个关键点的得分权重信息;
- 加载标注json文件,如果在加载标注文件时发生读取错误,输出错误信息并退出程序;
将标注文件中的信息逐一加载到输出字典中;
最终输出字典格式如下:annotations[‘image_ids’]=[‘image1_id’,’image2_id’,’image3_id’…],annotations[‘annos’]=[‘image1_id’][‘human_annos’]+[‘image1_id’][‘keypoint_annos’]+[‘image2_id’][‘human_annos’]+[‘image2_id’][‘keypoint_annos’]+[‘image3_id’][‘human_annos’]+[‘image3_id’][‘keypoint_annos’];
load_predictions函数分析
- 初始化输出字典,其中包括’image_ids’和’annos’字段,分别为列表和字典,最后的id_set与输出无关,仅仅用来判断是否在结果文件中多次包含一个图片id和结果;
- 加载结果json文件,如果在加载结果文件时发生读取错误,输出错误信息并退出程序;
- 对结果文件中的每一项,判断是否有’image_id’和’keypoint_annotations’关键字,没有则发出警告;
- 获取去掉.jpg的image_id,加入到id_set中,用以后续判断是否有重复ID;
- 将结果文件信息添加到输出信息predictions中,最终predictions格式为:predictions[‘image_ids’]=[‘image1_id’,’image2_id’,’image3_id’…],predictions[‘annos’]=[image_id1][‘keypoint_annos’]+[image_id2][‘keypoint_annos’]+[image_id3][‘keypoint_annos’];
keypoint_eval函数分析
- oks_all:得分统计结果,oks_num:max(预测人数,标注人数);
- 如果预测文件中包含了标注文件中的图片ID,使用compute_oks返回得分矩阵,compute_oks函数解析见下;
收集与每一个标注信息间得分最大的标注信息,统计入结果oks_all中;
oks_num用以对过多的结果预测进行惩罚;
- 如果没有对标注图片进行预测,会在oks_num中增加标注人数,进行最后的得分惩罚;
- 以多个阈值计算mAP,并取平均;
compute_oks函数分析
- anno_count:本图片中标注了多少个人的关键点,predict_count:本图片中预测了多少个人的关键点,oks建立得分矩阵,大小为anno_count*predict_count,对应每一个标注和每一个预测;
对于标注文件中预测的每一个人,获取其标注信息(其中包括标注点及该点是否可见)和其人的面积信息;
用预测的每一个信息与标注信息计算得分,计算过程中只关心标注信息中可见点的得分,也就是说我在输出信息的时候要输出14*3个信息,对于第3个信息并不关心输出值是多少,对于不可见点并不关心输出的x和y是多少——总而言之,对我输出预测结果的复杂度要求还是很低的;
得分计算使用技巧:欧氏距离,尺度归一,高斯分布,加权,去平均;