python - 使用 Detectron2 进行每图像模型评估
问题描述
我已经使用Detectron2训练了一个自定义图像分割模型,并且我已经成功地对一批图像进行了推理和模型评估,主要是按照创建者提供的Colab Notebook中的指南进行的。
现在,我还想为测试数据集中的每个图像而不是整个批次收集评估指标(AP 或 mAP)。为此,我修改了inference_on_dataset
函数,将原始代码的最后一位从
results = evaluator.evaluate()
进入
for img_id in img_ids:
result = evaluator.evaluate(img_ids = [img_id,])
res_dict[img_id] = result
Whereimg_ids
是要评估的图像列表,res_dict
最初是空字典。这样做,推理应该只对整批图像运行一次,而对每个图像进行评估,将结果保存在字典中。
for循环的前两次迭代一切正常,但在第三次迭代时,出现以下错误
AssertionError: A prediction has category_id=4, which is not available in the dataset.
但是预测都是正确的,并且在正确的 ID 范围(0-3)内,我不明白 4 是从哪里来的。此外,如前所述,问题仅出现在第三次迭代中,而且奇怪的是,它独立于图像(如果我交换列表中图像的顺序,如果它在第一次迭代中,相同的图像不会出错两个位置)。也许每次迭代都必须以某种方式重置评估过程,但我找不到任何函数可以这样做(除非我也清除了预测)。
关于如何在测试数据集的每个图像上递归运行评估的任何想法?谢谢!
解决方案
推荐阅读
- ngxs - 在@ngxs/form-plugin 中,示例中提到的属性的定义是什么?
- ffmpeg - FFmpeg avcodec_decode_video2 将 RTSP H264 高清视频包解码为有错误的视频图片
- python - 数据框的条件合并
- vb.net - 使用 XPath 提取子字符串,其中字段中可能没有尾随分隔符
- orientdb - 有没有办法在 OrientDB 中将 ISO 8601 兼容日期设置为 DateTime 格式?
- javascript - 渲染存储在数据库中的 javascript
- ethereum - 如何从以太坊地址获取 ERC20、ERC721 和 ERC827 代币列表
- python - VRPTW:如何处理特殊仓库节点的时间窗口和松弛?
- wpf - PowerShell/WPF:单击时禁用按钮
- regex - Vim:如何改变短语(不同类型和长度)环境