MMDetection实用工具详解(下):模型复杂度、基准测试

工具目录

  • 四、模型复杂度
    • 应用展示
      • 结果解析
  • 五、基准测试
    • 鲁棒性测试基准
    • 应用展示
      • 结果解析
        • Testing gaussian_noise at severity 0
        • Testing gaussian_noise at severity 2
        • Aggregated results
  • 遇到的tools自定义导包模块No Module Error错误
    • 解决思路

上期MMDetection内三个实用工具详解:日志分析、结果分析、混淆矩阵介绍了三个实用工具,接着上一期我们继续分享两个实用工具:模型复杂度、基准测试。

四、模型复杂度

tools/analysis_tools/get_flops.py 工具可用于计算指定模型的 FLOPs、参数量大小(改编自 flops-counter.pytorch )。

python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}]

获得的结果如下:

==============================
Input shape: (3, 1280, 800)
Flops: 239.32 GFLOPs
Params: 37.74 M
==============================

注意:这个工具还只是实验性质,我们不保证这个数值是绝对正确的。你可以将他用于简单的比较,但如果用于科技论文报告需要再三检查确认。

  1. FLOPs 与输入的形状大小相关,参数量没有这个关系,默认的输入形状大小为 (1, 3, 1280, 800) 。
  2. 一些算子并不计入 FLOPs,比如 GN 或其他自定义的算子。你可以参考 mmcv.cnn.get_model_complexity_info() 查看更详细的说明。
  3. 两阶段检测的 FLOPs 大小取决于 proposal 的数量。

应用展示

python tools/analysis_tools/get_flops.py work_dirs/faster-rcnn_r50_fpn_ms-3x_coco_oxford/faster-rcnn_r50_fpn_ms-3x_coco_oxford.py

结果解析

==============================
Use size divisor set input shape from (297, 300) to (800, 832)
==============================
Compute type: dataloader: load a picture from the dataset
Input shape: (800, 832)
Flops: 0.181T
Params: 41.353M
==============================
!!!Please be cautious if you use the results in papers. You may need to check if all ops are supported and verify that the flops computation is correct.
  • Flops: 0.181T FLOPs(Floating Point Operations Per Second)表示每秒浮点运算次数,这里是0.181万亿次(Tera,T=10^12)。这是评估模型计算复杂度的一个指标,意味着在执行特定任务或前向传播时,该模型大约需要进行0.181万亿次浮点运算。较高的FLOPs值通常意味着更大的计算需求和潜在的更长运行时间。

  • Params: 41.353M 参数量(Params)指的是模型中所有可学习参数的总数,这里是41.353百万(Mega,M=10^6)。模型参数包括权重和偏置等,它们是模型学习过程中的关键组成部分,决定了模型的容量、表达能力和泛化能力。较大的参数量可能会带来更强的学习能力,但也需要更多的内存资源,并可能导致过拟合问题,尤其是在数据集较小的情况下。

五、基准测试

鲁棒性测试基准

tools/analysis_tools/test_robustness.pytools/analysis_tools/robustness_eval.py 帮助使用者衡量模型的鲁棒性。其核心思想来源于 Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming。
在这里插入图片描述

应用展示

详细了解如何在污损图像上评估模型的效果,以及参考该基准的一组标准模型,请参照官方文档 robustness_benchmarking.md 获取终端命令模板,这里不再赘述。

首次使用请先安装包含图像损坏变换功能的科学库

pip install imagecorruptions

然后根据实际情况参考命令模板依次填入配置文件、权重文件、其他必要参数等

python tools/analysis_tools/test_robustness.py 
work_dirs/faster-rcnn_r50_fpn_ms-3x_coco_oxford/faster-rcnn_r50_fpn_ms-3x_coco_oxford.py 
work_dirs/faster-rcnn_r50_fpn_ms-3x_coco_oxford/iter_7080.pth 
--corruptions gaussian_noise 
--severities 0 2 
--out robustness_result.pkl

实际操作中请使用 paste in one line 粘贴以上代码

  • corruption:代表使用一组自定义的损坏变换,代码中使用的是 gaussian_noise
  • severities:代表选择施加在图像上的损坏变换的严重程度。 严重程度从 1 到 5 逐级增强,0 表示不对图像施加损坏变换,即原始图像数据。
  • out:指明输出的 pkl 格式的结果文件路径。

结果解析

Testing gaussian_noise at severity 0
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.850Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 0.990Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.968Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.789Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.868Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.886Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.886Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.886Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.822Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.901
06/14 00:43:06 - mmengine - INFO - bbox_mAP_copypaste: 0.850 0.990 0.968 -1.000 0.789 0.868
06/14 00:43:07 - mmengine - INFO - Results has been saved to robustness_result.pkl.
06/14 00:43:07 - mmengine - INFO - Epoch(test) [737/737]    coco/bbox_mAP: 0.8500  coco/bbox_mAP_50: 0.9900  coco/bbox_mAP_75: 0.9680  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: 0.7890  coco/bbox_mAP_l: 0.8680  data_time: 2.1947  time: 2.2805

在没有高斯噪声的情况下(Severity 0),模型展示出了非常出色的性能:

  • 总体平均精度(AP) 在不同的IoU阈值和目标尺寸上都很高,尤其是在 IoU 介于0.50到0.95之间时,AP达到了0.850,表明模型在无噪声环境下的目标检测精确度很高。
  • 特别是,当 IoU 设定为0.50时(AP@[IoU=0.50]),模型在不限制最大检测数量时(maxDets=1000)几乎达到了完美的识别率,AP为0.990,显示出极强的召回能力。
  • 对于更严格的要求,如IoU阈值为0.75时(AP@[IoU=0.75]),模型依然保持了0.968的AP,证明其在精确匹配目标边界方面表现优异。
  • 模型在检测大型目标时(AP@[area=large])的性能略优于中型目标(AP@[area=medium]),分别为0.868和0.789。
Testing gaussian_noise at severity 2
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.657Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 0.883Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.766Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.540Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.688Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.705Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.705Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.705Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.577Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.736
06/14 01:11:05 - mmengine - INFO - bbox_mAP_copypaste: 0.657 0.883 0.766 -1.000 0.540 0.688
06/14 01:11:05 - mmengine - INFO - Results has been saved to robustness_result.pkl.
06/14 01:11:06 - mmengine - INFO - Epoch(test) [737/737]    coco/bbox_mAP: 0.6570  coco/bbox_mAP_50: 0.8830  coco/bbox_mAP_75: 0.7660  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: 0.5400  coco/bbox_mAP_l: 0.6880  data_time: 2.1945  time: 2.2723

然而,在施加了些许高斯噪声(Severity 2)后,模型的性能显著下降:

  • 总体AP从0.850降到了0.657,尤其是在不同IoU阈值和目标尺寸上都观察到了下降,这说明噪声对模型识别和定位目标的能力产生了负面影响。
  • 尤其是对于中型目标(AP@[area=medium]),其性能从0.789骤降至0.540,表明噪声对此类尺寸的目标检测影响最大。
  • 召回率(AR)也呈现出类似的下降趋势,反映了在噪声环境下模型找回目标的能力减弱。
Aggregated results
model: robustness_result_results.pkl
Mean Performance under Corruption [mPC] (bbox)Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.131Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.177Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.153Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -0.200Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.108Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.138

汇总结果 中的“Mean Performance under Corruption [mPC]”似乎是对模型在不同噪声等级下的平均性能评估:

  1. AP@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.131:这表示在所有目标尺寸范围内,当考虑从IoU阈值0.50至0.95的匹配,并且每张图片只考虑最多100个检测结果时,模型的平均精度是13.1%。这个值表明在广泛的匹配标准和有限的检测展示下,模型的整体性能较低。
  2. AP@[ IoU=0.50 | area= all | maxDets=100 ] = 0.177:特别针对IoU阈值为0.50时,模型的平均精度稍有提升,达到了17.7%,说明在较为宽松的匹配标准下,模型表现稍好。
  3. AP@[ IoU=0.75 | area= all | maxDets=100 ] = 0.153:当提高匹配严格度至IoU=0.75时,AP反而略有下降,说明模型在高精度匹配上的能力较弱。
  4. AP@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -0.200:理论上,这是一个不合理的值,因为AP不能为负。正常解读应寻找错误或理解这里的-0.200是一个标记错误,可能意在指出模型在小目标检测上的性能极差或无法计算,但这需要根据实际情况校正。
  5. AP@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.108AP@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.138:这两个值分别表示中型和大型目标在同样条件下的平均精度,显示模型在检测较大目标时比小目标稍有优势,但仍处于较低水平。

总之,高斯噪声,尤其是在Severity 2的水平,显著降低了模型在目标检测任务上的精度和召回率,特别是对中型目标的影响最为严重。这强调了在实际应用中,提高模型对图像噪声鲁棒性的必要性。

遇到的tools自定义导包模块No Module Error错误

报错from tools.analysis_tools.robustness_eval import get_results ModuleNotFoundError: No module named 'tools.analysis_tools'

解决思路

我习惯性进入mmdetection文件后再用tools/内的工具文件

cd mmdetection

进入mmdetection目录之后使用鲁棒性测试基准工具,需要注意以下自定义导包语句

from tools.analysis_tools.robustness_eval import get_results

去掉tools.analysis.改为

from robustness_eval import get_results

再在tools/analysis_tools/文件夹下加上__init__.py(空文件即可)

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

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

相关文章

算法day29

第一题 695. 岛屿的最大面积 本题解法:采用bfs的算法; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历; 本题具体分析如上题故事,但是由于要求区域的最大面…

如何更新 iOS 18 Beta 版本?具体步骤总结

如何更新 iOS 18 Beta 想必有一些用户已经迫不及待的想要知道怎么更新 iOS 18 Beta 版本了吧,下面就给大家总结了具体的操作步骤: 在更新 iOS 18 Beta 版本之前记得我们需要将手机的数据进行备份,大家可以自行选用备份软件比如 iCloud 等。…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中,硬件和软件是密不可分的两个方面。但是,究竟是硬件开发更具挑战性,还是软件开发更难以应对呢?本文将就这一问题展开讨论,探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

html是什么?http是什么?

html Html是什么?http是什么? Html 超文本标记语言;负责网页的架构; http((HyperText Transfer Protocol)超文本传输协议; https(全称:Hypertext Transfer Protocol …

Java | Leetcode Java题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxPoints(int[][] points) {int n points.length;if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i) {if (ret > n - i || ret > n / 2) {break;}Map<Integer, Integer> map ne…

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台&#xff0c;它提供了一个直观易用的…

AI数字人的开源解决方案

目前&#xff0c;国内外已经涌现出一些优秀的数字人开源解决方案&#xff0c;这些解决方案为开发者提供了构建数字人应用的工具和基础设施。以下是一些比较知名的数字人开源解决方案。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

如何通过 6 种方法从 iPhone 恢复已删除的文件

想知道如何从 iPhone 恢复已删除的文件吗&#xff1f;本文将指导您如何从 iPhone 恢复数据&#xff0c;无论您是否有 iTunes/iCloud 备份。 iPhone 上已删除的文件去哪儿了&#xff1f; 许多 iPhone 用户抱怨他们经常丢失 iPhone 上的一些重要文件。由于意外删除、iOS 更新失败…

【StableDiffusion】Embedding 底层原理,Prompt Embedding,嵌入向量

Embedding 是什么&#xff1f; Embedding 是将自然语言词汇&#xff0c;映射为 固定长度 的词向量 的技术 说到这里&#xff0c;需要介绍一下 One-Hot 编码 是什么。 One-Hot 编码 使用了众多 5000 长度的1维矩阵&#xff0c;每个矩阵代表一个词语。 这有坏处&#xff0c…

SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存

文章目录 1. 前言2. 缓存2.1 什么是缓存2.2 使用缓存的好处2.3 缓存的成本2.4 使用Spring Cache和Redis的优点 3. Spring Cache基础知识3.1 Spring Cache的核心概念3.2 Spring Cache的注解3.2.1 SpEL表达式3.2.2 Cacheable3.2.3 CachePut3.2.4 CacheEvict 4. 实现查询数据缓存4…

eclipse创建maven项目

第一步&#xff1a;打开eclipse 我们选择java项目即可 点击finish即可 它会自动下载插件 然后在控制台上输入Y即可

HCIE-QOS基本原理

QOS基本原理 QOS概述什么是QOSQoS服务模型区分服务模型QoS常用技术 (DiffServ模型)QoS数据处理流程 (DiffServ模型) QoS流分类和流标记QoS数据处理流程为什么需要流分类和流标记 简单流分类外部优先级 - VLAN报文外部优先级 - MPLS报文外部优先级 - IP报文各外部优先级间的对应…

机器学习作业7——PCA

目录 一、原理 1.数据中心化 2.白数据与目标 3.协方差与协方差矩阵 4.特征值与特征向量 5.最终结果构造 二、代码 代码解释&#xff1a; 三、结果 结果解释&#xff1a; pca优缺点分析&#xff1a; 参考视频&#xff1a; 一、原理 目的&#xff1a; pca是为了将原…

辽宁普通测径仪升级智能测径仪后都有哪些改进?

关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果&#xff0c;然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差&#xff0c;使得同一厂家、…

JUC并发编程-第一天

JUC并发编程-第一天 JUC开发基础知识进程、线程、协程 JUC开发基础知识 先有进程&#xff0c;然后进程可以创建线程&#xff0c;线程是依附在进程里面的&#xff0c;线程里面包含多个协程 进程之间不共享全局变量&#xff0c;线程之间共享全局变量(线程通信就是用的这个&#x…

经典的网站系统架构(入门级)

从开发到部署&#xff0c;从用户访问到底层数据库&#xff0c;介绍搭建网站系统的经典架构的10个核心部分。 &#xff08;图转自bytebytego&#xff0c;翻译整理by dogstar&#xff09; 1、使用Git管理和协同源代码&#xff0c;通过CI/CD或Git的Webhook方式自动同步更新部署到服…

java原子变量

在Java中&#xff0c;原子变量是一种特殊的变量&#xff0c;它们提供了一种不需要显式加锁的情况下进行线程安全的操作。Java.util.concurrent.atomic包提供了原子变量类&#xff0c;如AtomicInteger&#xff0c;AtomicLong等&#xff0c;它们利用底层硬件的原子操作来保证线程…

MyBatis 动态 SQL 的详细内容讲解

1. MyBatis 动态 SQL 的详细内容讲解 文章目录 1. MyBatis 动态 SQL 的详细内容讲解2. 准备工作3. if 标签4. where 标签5. trim 标签6. set 标签7. choose when otherwise 标签8. foreach 标签8.1 批量删除8.2 批量添加 9. SQL 标签与 include 标签10. 总结&#xff1a;11. 最…

使用pnpm创建vue3项目

https://pnpm.io/zh/ 全局安装&#xff1a; npm install -g pnpm 检查版本&#xff1a; pnpm -v 创建vue3项目&#xff1a; pnpm create vuelatest 项目装包&#xff1a; pnpm install 运行项目&#xff1a; pnpm dev 命令行&#xff1a; https://pnpm.io/zh/pnpm-cli pnpm …

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…