栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

火柴人 | coco-analyze 奶瓶级操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

火柴人 | coco-analyze 奶瓶级操作

我前面有一篇论文复现笔记提到,有篇文章的可视化和误差分析做的很好,这里来实操如果做误差分析!怎么把我写的笔记拿来!我看看!

值得参考的可视化与误差分析|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
2.1 安装

在我们的环境里,克隆包,然后安装。

git clone git@github.com:matteorr/coco-analyze.git

cd coco-analyze
make all
2.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 遇到的问题

大概是三类问题:

  • 库问题

  • 科学上网问题

  • 玩坏环境问题

3.1 库问题 ❗ ImportError: cannot import ‘imresize’ from ‘scipy.misc’.

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!

如果不清楚之前结果文件里的文件夹都放啥,可视化图片哪里找,可以参考他这个报告的内容来看,就能找到我们想要的分析数据:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965354.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号