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,一经查实,立即删除!

相关文章

Mongodb使用$<identifier>过滤更新数组元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第65篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

JAVA学习笔记DAY5——SSM_Spring

文章目录 技术体系结构单体架构分布式架构 框架 FrameworkSpringIoc容器和核心概念组件Spring管理组件优点Spring Ioc 容器和容器实现普通容器复杂容器SpringIoc容器具体接口和实现类SpringIoc 容器管理配置方式 SpringIoc Ioc DI Spring Ioc 实践和应用Spring Ioc创建步骤配置…

算法day29

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

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

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

Codeforces Round 952 (Div. 4) c++题解(A-H1)

开头 : 这场没打,今天vp了一下,写了A-G,然后就去吃饭了! 比赛链接 : Dashboard - Codeforces Round 952 (Div. 4) - Codeforces A 直接交换,输出即可 inline void solve(){string a , b ; cin >> a>> b ;char c a[0] ;a…

GaussDB系统视图归纳总结及常用运维SQL

文章目录 一、GaussDB系统视图归纳总结二、常用运维SQL 一、GaussDB系统视图归纳总结 GaussDB 是华为基于开源数据库PostgreSQL开发的商业数据库,在兼容oracle和mysql上做出了不少努力,GaussDB的系统视图对标Oracle,有以下对应关系&#xff…

嵌入式硬件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…

递归函数知识点

基本概念 递归函数就是让函数自己调用自己。 static void Fun() {if (false){return;}Fun(); } 一个正确的递归函数 1.必须有结束调用的条件 2.用于体检判断的&#xff0c;这个条件&#xff0c;必须改变能够达到停止的目的。 实例 用递归函数打印出0~10。 递归函数就是…

Julia 文件读写

Julia 文件读写 Julia 是一种高性能的动态编程语言,特别适合于数值计算和科学计算。在数据处理和科学研究中,文件读写是一项基本且重要的技能。Julia 提供了一套丰富的函数和库来处理文件读写操作,使得文件操作变得简单而高效。 基本文件操作 打开和关闭文件 在 Julia 中…

eclipse创建maven项目

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

聚合分析是Elasticsearch中非常强大的工具

Elasticsearch的聚合分析&#xff08;Aggregations&#xff09;是一种强大的功能&#xff0c;它允许用户对数据进行汇总和分析。聚合分析可以揭示数据中的模式、趋势和异常&#xff0c;非常适合用于生成报告、仪表板或进行复杂的数据分析。 ### 聚合分析的基本概念&#xff1a…

HCIE-QOS基本原理

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

C++ 字符串处理4-根据指定的分隔符将字符串分割为多个子串根据指定的分隔符将多个子串连接成一个字符串

1. 关键词 C 字符串处理 分割字符串 连接字符串 跨平台 2. strutil.h #pragma once#include <string> #include <vector>namespace cutl {/*** brief The type of vector strings used in this library.**/using strvec std::vector<std::string>;/*** b…