我前面有一篇论文复现笔记提到,有篇文章的可视化和误差分析做的很好,这里来实操如果做误差分析!怎么把我写的笔记拿来!我看看!
值得参考的可视化与误差分析|HRNet团队的另一款Bottom-up人体姿态估计方法
0 前情提要
工欲善其事必先利其器。
coco-analyze
- github: coco-analyze
- paper: Benchmarking and Error Diagnosis in Multi-Instance Pose Estimation
- dataset: keypoints-eval
这里记录一下用 coco-analyze 工具分别对 HigherHRNet 和 UDP 进行分析的过程。接下来我只说 higherhrnet 的过程,udp 类似。
1 coco-analyze 简单介绍在 coco 官网的 keypoints 挑战里提供了一个分析代码 4. Analysis Code ,这个工具对多人姿态估计上的误差做了详尽的分析。官网提供的示例如下:
这个图展示了各种类型的错误对多人姿态估计算法的影响。
图由一系列准确率-召回率曲线(PR,Precision Recall)。其中,这些曲线一条高过一条,因为检测被逐步矫正。
项目主页 有完整说明。
(图标从下往上看)
- Original Dts.: 在 OKS=.9 (严格 OKS 下的 AP ),也就是原始检测结果。
- Miss: 在 OKS=.9 下,所有的 遗漏 误差都被纠正后的结果。这个误差表示:检测到的关键点不在正确身体部件附近。是个大大误差!
- Swap: 在 OKS=.9 下,所有的 交换 误差都被纠正后的结果。这个误差表示:不同人的相同身体部分(比如,右手肘)被混淆。
- Inversion: 在 OKS=.9 下,所有的 逆 误差都被纠正后的结果。这个误差表示:同一个人的身体部分(比如,左右手肘)被混淆。
- Jitter: 在 OKS=.9 下,所有的 抖动 误差都被纠正后的结果。这个误差表示:检测到的关键点在正确的身体部分附近。算个小误差。
- Opt. Score: 在 OKS=.9 下,所有的算法都用 oracle 函数重新计算。检测和真实值之间匹配数量的最大计分。
- FP: 所有背景误报 fps 都被移除后。
- FN: 所有剩余误差都被移除后 (AP=1)。
那么看这个图,面积大的说明纠正这些误差会得到很大的增益。比如说,图例里的面积说明 CMU 的错误主要是 Jitter 抖动 和 Miss 遗漏 误差。
2 安装和运行环境:
- Ubuntu 16.04
- python=3.7
- git
在我们的环境里,克隆包,然后安装。
git clone git@github.com:matteorr/coco-analyze.git cd coco-analyze make all2.2 准备文件
这个工具制作的时候是根据 2014val 来做的,现在大家都用 2017val的数据比较多,那么在文件准备方面就需要做出一些改动。
2.2.1 annotations既然这是一个验证、误差分析工具,那么肯定是在验证集上面做的,我们需要下载一份 2017 val annotations 作为我们的 Ground-Truth。
2.2.2 detections然后我们还需要一份,使用训练好的模型,在 2017 val images 上面的预测结果,跟 annotations 同款格式的,拿来做验证。
简单来说就是,来份 results 。
这里我们用 mmpose 来对 Associative Embedding + Higherhrnet on Coco 做误差分析。
具体来说就是把 checkpoints: ckpt 下载下来,放到checkpoints/ 文件夹里。
然后终端输入:(这里的相关操作,可以参考我的另外一篇博客,链接我回头找找)
./tools/dist_test.sh configs/body/2d_kpt_sview_rgb_img/associative_embedding/coco/higherhrnet_w32_coco_512x512.pyco
checkpoints/higher_hrnet32_coco_512x512-8ae85183_20200713.pth 2
--eval mAP
参考 Test a dataset ,2卡,跑10min不到。
输出结果在生成的 work_dir/higherhrnet_w32_coco_512x512/result_keypoints.json
把这个结果复制到coco-analyze/detections文件夹下,顺便改个名,等下进行验证分析。
cp work_dir/higherhrnet_w32_coco_512x512/result_keypoints.json ../coco-analyze/detections/higherhrnet_keypoints_results.json❗ KeyError: ‘image_id’
我当时天真,不知道 results.json 放哪里,然后用了一个 flag --out 指定了文件夹。
其实一切的结果早就写在了 test.py 代码里。
多的不说了,2h瞎搞吃亏不如20s看下代码。
2.3 使用官网提供的运行代码有5个参数,也就是运行的时候需要传入的参数:
[annFile] -> ./annotations/keypoints_val2014.json [dtsFile] -> ./detections/fakekeypoints100_keypoints_val2014_results.json [saveDir] -> ./results/fakekeypoints100 [teamName] -> fakekeypoints100 [version] -> 1.0 $ python run_analysis.py [annFile] [dtsFile] [saveDir] [teamName] [version]
那我们做好了 [2.2 准备文件](# 准备文件) 的操作之后,针对 val2017 ,这里需要改写为:
[annFile] -> ./annotations/person_keypoints_val2017.json [dtsFile] -> ./detections/higherhrnet_keypoints_results.json [saveDir] -> ./results/higherhrnet [teamName] -> higherhrnet [version] -> 1.0 # 终端里运行这个代码 $ python run_analysis.py annotations/person_keypoints_val2017.json detections/higherhrnet_keypoints_results.json results/higherhrnet higherhrnet 1.0
那么运行一波,按道理,应该可以。
但我在这里不可以了。如果你们也不可以,可以看看我接下来的 debug 操作。
3 遇到的问题大概是三类问题:
-
库问题
-
科学上网问题
-
玩坏环境问题
scipy 这个版本已经不支持 imsize 函数了,可以用 numpy+pillow 两个库替代,或者降版本。
降版本有风险,容易玩坏,这里提供一个改语句的方式:
找到他报错的文件backgroundFalsePosErrors.py ,然后修改部分代码
## imports import os, time import numpy as np import matplotlib.pyplot as plt import matplotlib.path as mplPath # from scipy.misc import imresize from PIL import Image # ❗ 改这里 import skimage.io as io # package imports from . import utilities
在我的印象里改了3个吧,可以运行一下看看报错提示来改。
然后在 backgroundFalseNegErrors.py 文件里,修改代码,大概在150行左右:
for poly_verts in b['segmentation']:
path = mplPath.Path(np.array([[x,y] for x,y in zip(poly_verts[0::2],poly_verts[1::2])]))
grid = path.contains_points(points)
grid = grid.reshape((ny,nx))
the_mask += np.array(grid, dtype=int)
# segm_heatmap += imresize(the_mask,(128,128))
segm_heatmap += np.array(Image.fromarray(the_mask).resize((128,128))) # ❗ 改这里,换一种imresize的说法
只有这里用到了好像,只改一个。
❗ TypeError: ’numpy.float64‘ object cannot be interpreted as an integer.最开始我以为是 numpy 库的版本问题,1.7.0以后就不支持 float64 了,然后我就疯狂升降版本。
但如果更换版本只会弄得更混乱,``numpy` 的安装卸载牵连甚多,所以折腾了2h之后,我看了一眼 官方api 。
人家!!早就!!更新了!!这个bug!!
我就去官方github里面找了 cocoeval.py 的现在版本,里面将代码做了一下更改,我就改了两句:
self.iouThrs = np.linspace(.5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True)
self.recThrs = np.linspace(.0, 1.00, int(np.round((1.00 - .0) / .01)) + 1, endpoint=True)
大概在600多行那里,大家报错的话会出现索引行号。
3.2 科学上网问题跑到一半突然提示我
❗ urllib.error.URLError好家伙,翻墙警告,但其实加几行:
sudo gedit /etc/resolv.conf
加了8.8.8.8。
3.3 玩坏环境问题玩坏了 torch ,官网重装,懂得都懂。我累了。
4 结果分析 4.1 结果图运行结束后会在 results 文件夹里生成很多分析图:
比如:左右分别是 higherhrnet 和 udp 的 localization_errors 。
里面还会可视化一部分数据集图片,你要是也成功了就会看到哈哈哈哈!
4.2 分析报告然后在工作文件夹里会生成 .tex 文件,就是用他们官方的模板出的一份报告。如果需要看的话,下载一个 Tex Live 编译一下,变pdf!
如果不清楚之前结果文件里的文件夹都放啥,可视化图片哪里找,可以参考他这个报告的内容来看,就能找到我们想要的分析数据:



