mmdetection tools工具梳理

mmdetection tools工具梳理

mmdetection 是一个非常好用的开源目标检测框架,我们可以用它方便地训练自己的目标检测模型,mmdetection 项目仓库提供许多实用的工具来实现帮助我们进行各种测试。本篇将梳理以下 mmdetection 项目仓库 tools 目录下的各种实用工具。

测试版本:

mmcv-full == 1.4.8

mmdet == 2.24.1

训练相关

tools/train.py

这个自然是最常用的,我们训练模型通常就是用这个脚本来启动,通常只需要传入配置文件路径即可,其他更详细的参数可参考源码,

python tools/train.py configs/my_coco_config/my_coco_config.py

tools/dist_train.sh

该脚本是用于启动单机多卡/多机多卡分布式训练的,里面内容不多,无非是对 python -m torch.distributed.launch ... 的封装,留给用户的接口很简单,只需要指定想要用的 GPU 的个数即可,

bash tools/dist_train.sh configs/my_coco_config/my_coco_config.py 3

性能测试相关

tools/test.py

此工具用来测试模型的性能

  • 可以选择评估方式 --eval ,对于 COCO 数据集,可选 bboxsegmproposal ;对于 VOC 数据集,可选 maprecall
  • 也可以选择 --out ,指定测试结果的 pkl 输出文件
python tools/test.py configs/my_coco_config/my_coco_config.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth  --eval bbox

输出:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.374Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 0.581Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.404Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.212Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.410Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.481Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.517Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.517Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.517Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.326Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.557Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.648OrderedDict([('bbox_mAP', 0.374), ('bbox_mAP_50', 0.581), ('bbox_mAP_75', 0.404), ('bbox_mAP_s', 0.212), ('bbox_mAP_m', 0.41), ('bbox_mAP_l', 0.481), ('bbox_mAP_copypaste', '0.374 0.581 0.404 0.212 0.410 0.481')])

或指定输出到 pkl 文件:

python tools/test.py configs/my_coco_config/my_coco_config.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth  --out faster_rcnn_fpn_coco.pkl

tools/analysis_tools/eval_metric.py

可以根据上面 --out 保存的结果 pkl 文件计算指标,而无需重新跑

python ./tools/analysis_tools/eval_metric.py configs/my_coco_config/my_coco_config.py faster_rcnn_fpn_coco.pkl --eval bbox

tools/analysis_tools/analyze_results.py

可以将模型的预测结果框画出来进行可视化,其中第二个参数是上面 --out 保存的结果 pkl 文件,第三个是参数是结果保存到的目录,可以通过 --show-score-thr 来指定可视化框的阈值

python tools/analysis_tools/analyze_results.py configs/my_coco_config/my_coco_config.py faster_rcnn_fpn_coco.pkl show_dir/

tools/analysis_tools/analyze_logs.py

用于分析我们训练过程中得到的日志文件,注意这里传入的日志文件必须是 json 文件,而第一个参数 plot_curve 有两个可选项:plot_curvecal_train_time ,同样可以通过 --out 指定输出图片文件。

python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/my_coco_config/20220503_165551.log.json --out log_curve.png

在这里插入图片描述

tools/analysis_tools/benchmark.py

此工具是用来测试模型在当前环境下的推理速度的,模型会跑一遍配置文件中指定的测试集,计算单图推理时间(FPS)。

python tools/analysis_tools/benchmark.py configs/my_coco_config/my_coco_config.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth

笔者在 mmdet == 2.24.1 版本亲测是不能按照如上方式进行 benchmark 测试的,会报错只支持分布式模式(如下)

NotImplementedError: Only supports distributed mode

但这无妨,我们改用分布式的方式启动即可,注意只有一张卡也可以用分布式的方式启动,将 n_proc_per_node 设置为 1 即可,如下可行:

python -m torch.distributed.launch --nproc_per_node=1 --master_port=29500 tools/analysis_tools/benchmark.py configs/my_coco_config/my_coco_config.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --launcher pytorch

得到结果类似如下:

Done image [50 / 2000], fps: 23.4 img / s, times per image: 42.7 ms / img
...
Done image [2000/ 2000], fps: 22.6 img / s, times per image: 44.2 ms / img

tools/analysis_tools/get_flops.py

本工具用于统计模型的参数量,可以通过 --shape 参数指定输入图片的尺寸

python tools/analysis_tools/get_flops.py configs/my_coco_config/my_coco_config.py --shape 640 480

tools/analysis_tools/confusion_matrix.py

计算混淆矩阵,需要输入的三个参数是:config文件,pkl结果文件,输出目录

mkdir coco_confusion_matrix/
python tools/analysis_tools/confusion_matrix.py configs/my_coco_config/my_coco_config.py faster_rcnn_fpn_coco.pkl coco_confusion_matrix/

Faster-RCNN w/ FPN 在 COCO 80 类的混淆矩阵如下:

在这里插入图片描述

这里只是展示一下,跑出来的原图很大很清晰可以放大看。

画 PR 曲线 plot_pr_curve.py

画 PR 曲线需要使用以下文件 plot_pr_curve.py ,并非官方仓库中的,而是来自这个 repo

import os
import sys
import mmcv
import numpy as np
import argparse
import matplotlib.pyplot as pltfrom pycocotools.coco import COCO
from pycocotools.cocoeval import COCOevalfrom mmcv import Config
from mmdet.datasets import build_datasetdef plot_pr_curve(config_file, result_file, out_pic, metric="bbox"):"""plot precison-recall curve based on testing results of pkl file.Args:config_file (list[list | tuple]): config file path.result_file (str): pkl file of testing results path.metric (str): Metrics to be evaluated. Options are'bbox', 'segm'."""cfg = Config.fromfile(config_file)# turn on test mode of datasetif isinstance(cfg.data.test, dict):cfg.data.test.test_mode = Trueelif isinstance(cfg.data.test, list):for ds_cfg in cfg.data.test:ds_cfg.test_mode = True# build datasetdataset = build_dataset(cfg.data.test)# load result file in pkl formatpkl_results = mmcv.load(result_file)# convert pkl file (list[list | tuple | ndarray]) to jsonjson_results, _ = dataset.format_results(pkl_results)# initialize COCO instancecoco = COCO(annotation_file=cfg.data.test.ann_file)coco_gt = cocococo_dt = coco_gt.loadRes(json_results[metric]) # initialize COCOeval instancecoco_eval = COCOeval(coco_gt, coco_dt, metric)coco_eval.evaluate()coco_eval.accumulate()coco_eval.summarize()# extract eval dataprecisions = coco_eval.eval["precision"]'''precisions[T, R, K, A, M]T: iou thresholds [0.5 : 0.05 : 0.95], idx from 0 to 9R: recall thresholds [0 : 0.01 : 1], idx from 0 to 100K: category, idx from 0 to ...A: area range, (all, small, medium, large), idx from 0 to 3M: max dets, (1, 10, 100), idx from 0 to 2'''pr_array1 = precisions[0, :, 0, 0, 2] pr_array2 = precisions[1, :, 0, 0, 2] pr_array3 = precisions[2, :, 0, 0, 2] pr_array4 = precisions[3, :, 0, 0, 2] pr_array5 = precisions[4, :, 0, 0, 2] pr_array6 = precisions[5, :, 0, 0, 2] pr_array7 = precisions[6, :, 0, 0, 2] pr_array8 = precisions[7, :, 0, 0, 2] pr_array9 = precisions[8, :, 0, 0, 2] pr_array10 = precisions[9, :, 0, 0, 2] x = np.arange(0.0, 1.01, 0.01)# plot PR curveplt.plot(x, pr_array1, label="iou=0.5")plt.plot(x, pr_array2, label="iou=0.55")plt.plot(x, pr_array3, label="iou=0.6")plt.plot(x, pr_array4, label="iou=0.65")plt.plot(x, pr_array5, label="iou=0.7")plt.plot(x, pr_array6, label="iou=0.75")plt.plot(x, pr_array7, label="iou=0.8")plt.plot(x, pr_array8, label="iou=0.85")plt.plot(x, pr_array9, label="iou=0.9")plt.plot(x, pr_array10, label="iou=0.95")plt.xlabel("recall")plt.ylabel("precison")plt.xlim(0, 1.0)plt.ylim(0, 1.01)plt.grid(True)plt.legend(loc="lower left")plt.savefig(out_pic)if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument('config', help='config file path')parser.add_argument('pkl_result_file', help='pkl result file path')parser.add_argument('--out', default='pr_curve.png')parser.add_argument('--eval', default='bbox')cfg = parser.parse_args()plot_pr_curve(config_file=cfg.config, result_file=cfg.pkl_result_file, out_pic=cfg.out, metric=cfg.eval)

运行:

python plot_pr_curve.py configs/my_coco_config/my_coco_config.py faster_rcnn_fpn_coco.pkl

这里用到的 pkl 结果文件,即是上面运行 tools/test.py 指定 --out 的输出文件。

最终得到的 PR 曲线如下:

在这里插入图片描述

Misc

tools/misc/print_config

我们自定义的 config 文件通常是通过 _base_ 继承自很多基础的 config 文件,如:

_base_ = ['../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py']

所以我们直接看到的 config 文件内容并不是完整的,此时如果想要查看完整的 config 文件,即可通过该工具实现

python tools/misc/print_config.py configs/my_coco_config/my_coco_config.py

tools/misc/browse_dataset.py

有时

  • 我们完成数据集转换,转成 COCO 格式之后,我们不确定自己的转换是否正确,框的位置对不对(如xyxy、xywh没对齐之类的)
  • 或者我们添加了一些自定义的数据扩增,不确定结果数据扩增 pipeline 之后的是否是我们想要的结果

就可以通过这个工具来进行可视化,如果是远程服务器上的数据不方便直接显示,还可以通过指定 --output-dir 参数来指定可视化结果输出到的目录:

python tools/misc/browse_dataset.py configs/my_coco_config/my_coco_config.py  --output-dir viz_dataset/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorRT ONNX 基础(续)

TensorRT ONNX 基础(续) PyTorch正确导出ONNX 几条推荐的原则,可以减少潜在的错误: 对于任何使用到 shape、size 返回值的参数时,例如 tensor.view(tensor.size(0), -1) 这类操作,避免直接使用 tensor.s…

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程,为求简洁,我们不介绍为什么内网穿透也不介绍其原理,这里假设各位读者都已经明确的知道自己的目的,本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说,内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo:https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换,我们通…

sed 简明教程

sed 简明教程 转自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了。所以 林妹妹跳了个Topless,他的哥哥sed坐不住了&#xf…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇:入门教程 转自:[原创][深度][PyTorch] DDP系列第一篇:入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析 转自:https://zhuanlan.zhihu.com/p/187610959 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:实战与技巧

[深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! – – …

机器学习:系统设计与实现 分布式训练

机器学习系统:设计与实现 分布式训练 转自:https://openmlsys.github.io/chapter_distributed_training/index.html 随着机器学习的进一步发展,科学家们设计出更大型,更多功能的机器学习模型(例如说,GPT-3)…

从零Makefile落地算法大项目,完整案例教程

从零Makefile落地算法大项目,完整案例教程 转自:从零Makefile落地算法大项目,完整案例教程 作者:手写AI 前言 在这里,你能学到基于Makefile的正式大项目的使用方式和考虑,相信我,其实可以很简单…

PyTorch扩展自定义PyThonC++(CUDA)算子的若干方法总结

PyTorch扩展自定义PyThon/C(CUDA)算子的若干方法总结 转自:https://zhuanlan.zhihu.com/p/158643792 作者:奔腾的黑猫 在做毕设的时候需要实现一个PyTorch原生代码中没有的并行算子,所以用到了这部分的知识,再不总结就要忘光了 &a…

给 Python 算法插上性能的翅膀——pybind11 落地实践

给 Python 算法插上性能的翅膀——pybind11 落地实践 转自:https://zhuanlan.zhihu.com/p/444805518 作者:jesonxiang(向乾彪),腾讯 TEG 后台开发工程师 1. 背景 目前 AI 算法开发特别是训练基本都以 Python 为主&…

chrome自动提交文件_收集文档及提交名单统计

知乎文章若有排版问题请见谅,原文放在个人博客中【欢迎互踩!】文叔叔文档收集使用动机在我们的学习工作中,少不了要让大家集体提交文件的情况,举个最简单的例子:收作业。 传统的文件收集流程大致是:群内发出…

惠普800g1支持什么内存_惠普黑白激光打印机哪种好 惠普黑白激光打印机推荐【图文详解】...

打印机的出现让我们在生活和日常工作中变得越来越方便,不过随着科技的发展,打印机的类型也变得非常多,其中就有黑白激光打印机,而黑白激光打印机的品牌也有很多,比如我们的惠普黑白激光打印机,今天小编就给…

控制台输出颜色控制

控制台输出颜色控制 转自:https://cloud.tencent.com/developer/article/1142372 前端时间,写了一篇 PHP 在 Console 模式下的进度显示 ,正好最近的一个数据合并项目需要用到控制台颜色输出,所以就把相关的信息整理下,…

idea连接跳板机_跳板机服务(jumpserver)

一、跳板机服务作用介绍1、有效管理用户权限信息2、有效记录用户登录情况3、有效记录用户操作行为二、跳板机服务架构原理三、跳板机服务安装过程第一步:安装跳板机依赖软件yum -y install git python-pip mariadb-devel gcc automake autoconf python-devel readl…

【详细图解】再次理解im2col

【详细图解】再次理解im2col 转自:https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句话:im2col是将一个[C,H,W]矩阵变成一个[H,W]矩阵的一个方法,其原理是利用了行列式进行等价转换。 为什么要做im2col? 减少调用gemm的次数。 重要…

反思 大班 快乐的机器人_幼儿园大班教案《快乐的桌椅》含反思

大班教案《快乐的桌椅》含反思适用于大班的体育主题教学活动当中,让幼儿提高协调性和灵敏性,创新桌椅的玩法,正确爬的方法,学会匍匐前进,快来看看幼儿园大班《快乐的桌椅》含反思教案吧。幼儿园大班教案《快乐的桌椅》…

DCN可形变卷积实现1:Python实现

DCN可形变卷积实现1:Python实现 我们会先用纯 Python 实现一个 Pytorch 版本的 DCN ,然后实现其 C/CUDA 版本。 本文主要关注 DCN 可形变卷积的代码实现,不会过多的介绍其思想,如有兴趣,请参考论文原文: …

蓝牙耳机声音一顿一顿的_线控耳机党阵地转移成功,OPPO这款TWS耳机体验满分...

“你看到我手机里3.5mm的耳机孔了吗”,这可能是许多线控耳机党最想说的话了。确实,如今手机在做“减法”,而厂商们首先就拿3.5mm耳机孔“开刀”,我们也丧失了半夜边充电边戴耳机打游戏的乐趣。竟然如此,那如何在耳机、…

AI移动端优化之Im2Col+Pack+Sgemm

AI移动端优化之Im2ColPackSgemm 转自:https://blog.csdn.net/just_sort/article/details/108412760 这篇文章是基于NCNN的Sgemm卷积为大家介绍Im2ColPackSgemm的原理以及算法实现,希望对算法优化感兴趣或者做深度学习模型部署的读者带来帮助。 1. 前言 …