工具目录
- 四、模型复杂度
- 应用展示
- 结果解析
- 五、基准测试
- 鲁棒性测试基准
- 应用展示
- 结果解析
- 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
==============================
注意:这个工具还只是实验性质,我们不保证这个数值是绝对正确的。你可以将他用于简单的比较,但如果用于科技论文报告需要再三检查确认。
- FLOPs 与输入的形状大小相关,参数量没有这个关系,默认的输入形状大小为 (1, 3, 1280, 800) 。
- 一些算子并不计入 FLOPs,比如 GN 或其他自定义的算子。你可以参考
mmcv.cnn.get_model_complexity_info()
查看更详细的说明。 - 两阶段检测的 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.py
及 tools/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.850
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.990
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.968
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.789
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.868
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.886
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.886
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.886
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.822
Average 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.657
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.883
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.766
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.540
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.688
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.705
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.705
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.705
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.577
Average 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.131
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.177
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.153
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -0.200
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.108
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.138
汇总结果 中的“Mean Performance under Corruption [mPC]”似乎是对模型在不同噪声等级下的平均性能评估:
- AP@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.131:这表示在所有目标尺寸范围内,当考虑从IoU阈值0.50至0.95的匹配,并且每张图片只考虑最多100个检测结果时,模型的平均精度是13.1%。这个值表明在广泛的匹配标准和有限的检测展示下,模型的整体性能较低。
- AP@[ IoU=0.50 | area= all | maxDets=100 ] = 0.177:特别针对IoU阈值为0.50时,模型的平均精度稍有提升,达到了17.7%,说明在较为宽松的匹配标准下,模型表现稍好。
- AP@[ IoU=0.75 | area= all | maxDets=100 ] = 0.153:当提高匹配严格度至IoU=0.75时,AP反而略有下降,说明模型在高精度匹配上的能力较弱。
- AP@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -0.200:理论上,这是一个不合理的值,因为AP不能为负。正常解读应寻找错误或理解这里的-0.200是一个标记错误,可能意在指出模型在小目标检测上的性能极差或无法计算,但这需要根据实际情况校正。
- AP@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.108 和 AP@[ 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
(空文件即可)