如何用 Detectron2 COCOEvaluator 在自定义 COCO 格式数据集上评估检测与实例分割 AP

发布时间:2026/9/13 11:56:40
如何用 Detectron2 COCOEvaluator 在自定义 COCO 格式数据集上评估检测与实例分割 AP 如何用 Detectron2 COCOEvaluator 在自定义 COCO 格式数据集上评估检测与实例分割 AP【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2假设你手上有一个按 COCO 格式标注的验证集一个标注 json 文件加一个图片目录以及一个在类似任务上训练好的检测/实例分割模型现在需要用 detectron2 计算出这个数据集上的检测 AP 和实例分割 AP。detectron2 的 COCOEvaluator 就是为此设计的根据 docs/tutorials/evaluation.md它可以对任意自定义数据集计算 box 检测、实例分割以及关键点的 AP 指标底层使用 COCO 官方评测 API。完整操作路径是注册数据集 → 配置并构建模型 → 构建测试 data loader → 用inference_on_dataset驱动COCOEvaluator→ 读取返回的指标字典与落盘的 json 结果文件。前置条件已安装 detectron2具体环境要求见 INSTALL.md。数据集为 COCO 格式的实例级标注检测/分割即一个 json 标注文件 一个图片目录且 json 中包含annotations。没有annotations的 test 集只能落盘预测结果无法本地算分见后文“边界情况”。模型权重与数据集的类别数匹配或兼容。COCOEvaluator通过 metadata 中的thing_dataset_id_to_contiguous_id自动把模型输出的连续类 id 还原为数据集原始类别 id这个映射由register_coco_instances在注册时自动设置。第一步注册自定义数据集对已经是 COCO json 格式的数据集docs/tutorials/datasets.md 给出的注册方式是一行调用from detectron2.data.datasets import register_coco_instances register_coco_instances( my_dataset_val, # 数据集名后续 cfg.DATASETS.TEST 用它 {}, # 额外 metadata可为空 dict json_annotation.json, # COCO 格式标注 json 的路径 path/to/image/dir, # 图片根目录 )注册后detectron2 能通过DatasetCatalog.get(my_dataset_val)读到数据同时自动设置 COCO 评测必需的 metadatajson_file标注 json 路径、thing_classes各类别名以及thing_dataset_id_to_contiguous_id原始类别 id 到连续 id 的映射。COCOEvaluator初始化时要求数据集 metadata 里有json_file正是靠这一步满足。如果你的 COCO 格式数据还需要进一步处理、或带有额外的 per-instance 标注文档建议改用 load_coco_json 自行加载这属于可选分支常规 COCO 数据集不需要。第二步配置模型并加载权重按 docs/tutorials/models.md 的方式从 yacs config 构建模型并加载 checkpointfrom detectron2.config import get_cfg from detectron2.modeling import build_model from detectron2.checkpoint import DetectionCheckpointer cfg get_cfg() cfg.MODEL.WEIGHTS path/to/model_final.pth # 模型权重文件 cfg.MODEL.ROI_HEADS.NUM_CLASSES 2 # 数据集的 thing 类别数 cfg.DATASETS.TEST (my_dataset_val,) cfg.MODEL.DEVICE cuda model build_model(cfg) DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS)几个配置点的作用来自 docs/tutorials/datasets.md 的“Update the Config for New Datasets”一节MODEL.ROI_HEADS.NUM_CLASSESR-CNN 类模型的 thing 类别数必须与数据集一致COCOEvaluator的按类 AP 输出依赖thing_classes与类别数对齐。cfg.DATASETS.TEST填入上一步注册的数据集名。如果测试图片可能包含超过 100 个物体文档提示需要调大TEST.DETECTIONS_PER_IMAGE模型侧每图最大检测数。文档同时说明修改类别数后加载预训练模型时部分层会因不兼容而无法加载并产生 warning这是预期行为。第三步构建测试 data loader用内置的build_detection_test_loader从注册的数据集构建推理用的 data loader其工作机制见 docs/tutorials/data_loading.mdfrom detectron2.data import build_detection_test_loader data_loader build_detection_test_loader(cfg, cfg.DATASETS.TEST[0])默认的DatasetMapper会把每张图片读入并转成模型输入格式评估阶段不需要自定义 mapper。第四步创建 COCOEvaluator 并运行评估COCOEvaluator的构造参数及含义引自 detectron2/evaluation/coco_evaluation.py 的文档字符串dataset_name数据集名。要求 metadata 中有json_file否则数据集需符合 detectron2 标准格式以便自动转成 COCO 格式此时必须提供output_dir否则抛出ValueError。tasks要评测的任务取值bbox、segm、keypoints。默认None时从模型预测自动推断——预测带segmentation字段就会加入segm因此 Mask R-CNN 这类同时输出框和掩码的模型会同时评出 bbox 和 segm 两组指标。distributed默认True会从所有 rank 收集预测并在主进程上评测为False时只评测当前进程的结果。单进程脚本两种行为等价。output_dir可选。提供后会落盘两个文件instances_predictions.pth可用torch.load加载保存模型原始输出格式的全部结果和coco_instances_results.jsonCOCO 结果格式 json。max_dets_per_image每图最大检测数上限默认沿用 COCO 的 100可调大。use_fast_impl默认True使用快速但非官方的实现计算 AP且占用更多内存文档建议论文用途时用官方 COCO API即传use_fast_implFalse。若快速实现未编译会打印Fast COCO eval is not built. Falling back to official COCO eval.并自动回退到官方实现。实际调用时推荐用 inference_on_dataset 把模型推理和评测串起来它会以 eval 模式遍历整个 data loader、逐 batch 调用evaluator.process(inputs, outputs)最后返回evaluator.evaluate()的结果from detectron2.evaluation import COCOEvaluator, inference_on_dataset evaluator COCOEvaluator(my_dataset_val, output_diroutput/eval_results) eval_results inference_on_dataset(model, data_loader, evaluator) print(eval_results)也可以手动驱动逻辑完全一样def get_all_inputs_outputs(): for data in data_loader: yield data, model(data) evaluator.reset() for inputs, outputs in get_all_inputs_outputs(): evaluator.process(inputs, outputs) eval_results evaluator.evaluate()如何确认评估成功并读取结果eval_results是一个{任务名: {指标名: 分数}}的字典。对同时输出框和掩码的模型会包含bbox和segm两个键来自 detectron2/evaluation/coco_evaluation.py 的_derive_coco_resultsbbox与segm各自包含AP、AP50、AP75、APs、APm、APl六个指标类别数大于 1 时还会追加按类别的AP-{类别名}键并在日志中输出Per-category bbox AP:表格。成功时的日志会依次出现Preparing results for COCO format ...、Evaluating predictions with official COCO API...或unofficial取决于use_fast_impl以及Evaluation results for bbox:/Evaluation results for segm:的小表格。分数范围为 0 到 100文档明确说明-1或NaN表示该指标无法计算例如没有任何预测。只要eval_results中bbox/segm下的 AP 是有限数值且output_dir下生成了coco_instances_results.json本次评估就完成了。边界情况与失败信号以下现象都来自源码中的实际日志与异常可用于判断评估是否按预期执行output_dir must be provided to COCOEvaluator for datasets not in COCO format.数据集 metadata 没有json_file且未传output_dir。用register_coco_instances注册就不会触发。Annotations are not available for evaluation.标注 json 里没有annotations字段COCO test 集形态。此时不会计算任何指标只落盘预测结果需提交到 COCO 评测服务器计分。[COCOEvaluator] Did not receive valid predictions./No predictions from the model!模型没有产出任何有效预测返回的指标全为 NaN。此时应检查权重与NUM_CLASSES是否匹配、data loader 是否真的读到了数据。A prediction has classX, but the dataset only has N classes...模型输出的类别 id 超出了数据集类别数通常是MODEL.ROI_HEADS.NUM_CLASSES与权重/数据集不一致。继续深入更多评测器与自定义DatasetEvaluator例如只统计检测数量的Counter示例见 docs/tutorials/evaluation.mdDatasetEvaluators可以在一次前向中合并多个评测器见 docs/tutorials/evaluation.mdCOCO 各指标AP50/AP75/APs 等的定义参考 COCO 官方评测说明COCOEvaluator文档字符串中给出了链接。【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考