MMDetection 全景分割测试结果提交指南:COCO test-dev 推理、格式化与上传全流程
MMDetection 全景分割测试结果提交指南COCO test-dev 推理、格式化与上传全流程【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection导读本文以 MMDetection 官方用户指南 docs/en/user_guides/test_results_submission.md 为核心完整讲解如何在 COCO 数据集的 test-dev 无标注测试集上运行全景分割Panoptic Segmentation模型推理并将预测结果整理为 COCO 官方评测服务器可接受的提交包。读者完成本文学习后将掌握test-dev 测试数据的下载与标注信息修补、test_dataloader/test_evaluator的两种切换方式改配置文件与命令行--cfg-options覆盖、单卡 / 多卡 / Slurm 三种推理命令以及按 COCO 命名规范重命名并打包提交结果的完整流程。一、背景为什么 test-dev 需要一套单独的提交流程COCO 数据集的官方评测分为多个阶段。日常训练和调参阶段我们使用带有标注的train2017/val2017子集通过CocoPanopticMetric直接计算 PQPanoptic Quality、SQSegmentation Quality、RQRecognition Quality等指标而test-dev是官方评测服务器使用的测试集其图像是公开的但标注不对外发布——因此模型在 test-dev 上只能做推理无法在本地计算真实指标必须将预测结果以指定格式打包提交到 COCO 评测服务器由官方后台统一评测打分。这带来两个直接后果数据侧test-dev 只有图像与图像元信息image info没有目标标注而且其官方提供的image_info_test-dev2017.json中类别信息缺少全景分割评测所必需的isthing属性需要先修补。评测侧本地评测指标需要真实标注参与匹配计算而在 test-dev 上无标注可用因此需要让评测器进入format_only仅格式化输出模式——只负责把模型预测结果落盘为 COCO 规定的提交格式跳过指标计算。这两个问题正是本文要解决的核心。二、准备工作下载数据并修补类别信息2.1 下载 COCO test-dev 数据集与标注信息进入仓库根目录按如下命令下载并解压三个压缩包。假设data/coco/目录尚不存在# suppose data/coco/ does not exist mkdir -pv data/coco/ # download test2017 wget -P data/coco/ http://images.cocodataset.org/zips/test2017.zip wget -P data/coco/ http://images.cocodataset.org/annotations/image_info_test2017.zip wget -P data/coco/ http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip # unzip them unzip data/coco/test2017.zip -d data/coco/ unzip data/coco/image_info_test2017.zip -d data/coco/ unzip data/coco/panoptic_annotations_trainval2017.zip -d data/coco/ # remove zip files (optional) rm -rf data/coco/test2017.zip data/coco/image_info_test2017.zip data/coco/panoptic_annotations_trainval2017.zip三个压缩包各自的用途压缩包解压后的关键产物用途test2017.zipdata/coco/test2017/*.jpg测试图像推理输入image_info_test2017.zipdata/coco/annotations/image_info_test2017.json及image_info_test-dev2017.json测试图像元信息id、宽高、文件名panoptic_annotations_trainval2017.zipdata/coco/annotations/panoptic_train2017.json/panoptic_val2017.json及对应 mask 压缩包提供带isthing属性的完整类别表2.2 修补 test-dev 的类别信息image_info_test-dev2017.json中的类别信息缺少全景分割评测所需的isthingthing / stuff 类别标识属性。MMDetection 提供了专门的脚本 tools/misc/gen_coco_panoptic_test_info.py 来完成修补它读取panoptic_val2017.json中完整的categories含isthing替换掉 test-dev 信息文件中的对应字段并写出新的panoptic_image_info_test-dev2017.jsonpython tools/misc/gen_coco_panoptic_test_info.py data/coco/annotations从脚本源码tools/misc/gen_coco_panoptic_test_info.py可以看到其核心逻辑val_info load(osp.join(data_root, panoptic_val2017.json)) test_old_info load(osp.join(data_root, image_info_test-dev2017.json)) # replace categories from image_info_test-dev2017.json # with categories from panoptic_val2017.json which # has attribute isthing. test_info test_old_info test_info.update({categories: val_info[categories]}) dump(test_info, osp.join(data_root, panoptic_image_info_test-dev2017.json))该脚本接收的唯一参数是 COCO 标注目录路径。运行完成后data目录结构应如下data -- coco |-- annotations | |-- image_info_test-dev2017.json | |-- image_info_test2017.json | |-- panoptic_image_info_test-dev2017.json | |-- panoptic_train2017.json | |-- panoptic_train2017.zip | |-- panoptic_val2017.json | -- panoptic_val2017.zip -- test2017说明panoptic_train2017.zip/panoptic_val2017.zip解压后的 mask 目录在此流程中并非必需但保留它们便于日后在 val 集上复算指标。这里为与官方指南保持一致而完整列出。三、切换 test 配置让评测器输出提交格式在 test-dev 上推理前需要修改两处设置test_dataloader把ann_file指向修补好的annotations/panoptic_image_info_test-dev2017.json并把data_prefix.img指向test2017/test-dev 不提供seg前缀因为无标注。test_evaluator把type保持为CocoPanopticMetric并设置format_onlyTrue与outfile_prefix——前者让评测器只格式化不计算指标后者决定结果文件的落盘位置与文件名前缀。CocoPanopticMetric的源码mmdet/evaluation/metrics/coco_panoptic_metric.py对这两个参数有明确约束当format_onlyTrue时outfile_prefix必须非空否则结果会被写入临时目录并在评测结束时被清理outfile_prefix被解读为“路径 文件名前缀”实际会生成prefix.panoptic.json与prefix.panoptic/两个产物见 coco_panoptic_metric.py 中result2json的实现。MMDetection 在基础配置 configs/base/datasets/coco_panoptic.py 末尾以注释形式预置了这份 test-dev 设置便于直接启用或复制。3.1 方式一修改配置文件Case 1直接取消注释编辑 configs/base/datasets/coco_panoptic.py启用文件末尾预置的配置块test_dataloader dict( batch_size1, num_workers1, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse), datasetdict( typedataset_type, data_rootdata_root, ann_fileannotations/panoptic_image_info_test-dev2017.json, data_prefixdict(imgtest2017/), test_modeTrue, pipelinetest_pipeline)) test_evaluator dict( typeCocoPanopticMetric, format_onlyTrue, ann_filedata_root annotations/panoptic_image_info_test-dev2017.json, outfile_prefix./work_dirs/coco_panoptic/test)Case 2覆盖到你正在使用的配置文件中如果你不想改动基础配置也可以把以下片段复制进当前使用的实验配置。注意dataset内通过_delete_True删除基础配置里data_prefix中的seg键——因为 test-dev 没有分割标注前缀保留它会触发加载错误test_dataloader dict( datasetdict( ann_fileannotations/panoptic_image_info_test-dev2017.json, data_prefixdict(imgtest2017/, _delete_True))) test_evaluator dict( format_onlyTrue, ann_filedata_root annotations/panoptic_image_info_test-dev2017.json, outfile_prefix./work_dirs/coco_panoptic/test)配置就绪后使用标准测试入口推理python tools/test.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE}3.2 方式二命令行覆盖推荐不改任何文件用--cfg-options以keyvalue形式临时覆盖配置效果与改文件一致且不会污染配置文件。这也是官方指南最推荐的免修改方案# test with single gpu CUDA_VISIBLE_DEVICES0 python tools/test.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --cfg-options \ test_dataloader.dataset.ann_fileannotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.imgtest2017 \ test_dataloader.dataset.data_prefix._delete_True \ test_evaluator.format_onlyTrue \ test_evaluator.ann_filedata/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix${WORK_DIR}/results注意此处ann_file在--cfg-options中被写为相对仓库根目录的路径data/coco/...因为命令行覆盖不再经过data_root拼接而_delete_True与配置覆盖方式一样用于清除data_prefix中继承的seg键。三个细节值得留意test_dataloader.dataset.data_prefix.imgtest2017不带尾部斜杠也能正常匹配test2017/前缀--cfg-options由 tools/test.py 中的DictAction解析支持点号嵌套键与_delete_等特殊操作符tools/test.py会把命令行传入的 checkpoint 写入cfg.load_from并构建 Runner 执行测试tools/test.py因此无需再修改配置里的load_from。四、多卡与 Slurm 集群推理4.1 多卡分布式推理通过 tools/dist_test.sh 可在一台多卡机器上分布式推理。该脚本内部通过torch.distributed.launch以--nproc_per_node$GPUS拉起tools/test.py并把--launcher pytorch与其余参数透传tools/dist_test.sh# test with four gpus CUDA_VISIBLE_DEVICES0,1,3,4 bash tools/dist_test.sh \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ 8 \ # eights gpus --cfg-options \ test_dataloader.dataset.ann_fileannotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.imgtest2017 \ test_dataloader.dataset.data_prefix._delete_True \ test_evaluator.format_onlyTrue \ test_evaluator.ann_filedata/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix${WORK_DIR}/results原文此例的第三个位置参数写为8并注释 eights gpus同时上方注释又写 four gpus属于原文档中的笔误。dist_test.sh的第三个参数是并行进程数与CUDA_VISIBLE_DEVICES指定的卡数保持一致即可例如用0,1,2,3四张卡就应传4。若省略可先export GPUS4之类的环境变量该脚本默认未设默认值必须显式传入。4.2 Slurm 集群推理在 Slurm 管理的集群上使用 tools/slurm_test.sh。脚本接收 分区 / 作业名 / 配置 / 权重 四个位置参数GPUS默认 8与GPUS_PER_NODE默认 8等通过环境变量控制tools/slurm_test.sh# test with slurm GPUS8 tools/slurm_test.sh \ ${Partition} \ ${JOB_NAME} \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --cfg-options \ test_dataloader.dataset.ann_fileannotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.imgtest2017 \ test_dataloader.dataset.data_prefix._delete_True \ test_evaluator.format_onlyTrue \ test_evaluator.ann_filedata/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix${WORK_DIR}/results4.3 完整示例用 MaskFormer R50 在 test-dev 上推理官方指南以 MaskFormer ResNet-50 预训练权重为例。注意原文档示例中引用的配置文件名maskformer_r50_mstrain_16x1_75e_coco.py在当前仓库版本中已更名为 configs/maskformer/maskformer_r50_ms-16xb1-75e_coco.py其基础配置同样继承自 configs/base/datasets/coco_panoptic.py并通过panoptic_fusion_headtest_cfg.panoptic_onTrue输出全景结果见 maskformer_r50_ms-16xb1-75e_coco.py。请以实际下载的权重文件名为准# test with single gpu CUDA_VISIBLE_DEVICES0 python tools/test.py \ configs/maskformer/maskformer_r50_ms-16xb1-75e_coco.py \ checkpoints/maskformer_r50_ms-16xb1-75e_coco.pth \ --cfg-options \ test_dataloader.dataset.ann_fileannotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.imgtest2017 \ test_dataloader.dataset.data_prefix._delete_True \ test_evaluator.format_onlyTrue \ test_evaluator.ann_filedata/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefixwork_dirs/maskformer/results推理完成后CocoPanopticMetric会在outfile_prefix指向的目录下产出两个结果可对照 coco_panoptic_metric.py 中result2json与 coco_panoptic_metric.py 中seg_out_dir的定义work_dirs/maskformer/ |-- results.panoptic.json # 每张图的 segments_info 聚合annotations 数组 -- results.panoptic/ # 每张图一张 RGB 编码的 mask PNG与 json 一一对应其中 mask PNG 的写盘逻辑在_parse_predictions中模型输出的全景图先过滤 VOID 类别sem_label等于类别数或ignore_index的像素被置为VOID再通过id2rgb转为 RGB 并以img_id对应的文件名写入seg_out_dircoco_panoptic_metric.py。五、重命名结果并打包提交COCO 官方评测服务器对提交文件有严格的命名约定。按官方指南得到results.panoptic.json与results.panoptic/之后将 mask 目录重命名为panoptic_test-dev2017_[algorithm_name]_results将 json 重命名为panoptic_test-dev2017_[algorithm_name]_results.json将两者打包为同名 zip且zip 包根目录必须直接包含这两个文件不能嵌套一层子目录。其中[algorithm_name]替换为所用算法名称。官方命令如下# In WORK_DIR, we have panoptic segmentation results: panoptic and results.panoptic.json. cd ${WORK_DIR} # replace [algorithm_name] with the name of algorithm you used. mv ./panoptic ./panoptic_test-dev2017_[algorithm_name]_results mv ./results.panoptic.json ./panoptic_test-dev2017_[algorithm_name]_results.json zip panoptic_test-dev2017_[algorithm_name]_results.zip -ur panoptic_test-dev2017_[algorithm_name]_results panoptic_test-dev2017_[algorithm_name]_results.json若你按本文第 3.2 节的命令把outfile_prefix设为work_dirs/maskformer/results则实际产物名为results.panoptic.json与results.panoptic/对应替换mv命令中的源文件即可最终得到panoptic_test-dev2017_[algorithm_name]_results.zip。提交到 COCO 评测服务器后服务器会依据panoptic_image_info_test-dev2017.json中记录的图像 id / 尺寸对预测 mask 逐图匹配并计算 PQ / SQ / RQ 以及 Things / Stuff 分组指标——这正是全景分割任务的标准评测口径。六、常见问题与排查要点panopticapi未安装CocoPanopticMetric初始化时会直接抛错提示安装panopticapicoco_panoptic_metric.py。请按错误提示安装后再运行。outfile_prefix未设置format_onlyTrue时若未给outfile_prefix评测器会断言失败并提示结果将写入临时目录、结束后被清理coco_panoptic_metric.py。务必显式设置一个持久路径。加载报错找不到seg前缀基础配置data_prefix含seg键而 test-dev 无分割标注在--cfg-options或配置覆盖中忘记_delete_True就会触发此问题。ann_file路径不一致配置文件内ann_file相对data_root解析命令行--cfg-options中则需写全相对仓库根的路径如data/coco/annotations/...两者混用是常见坑。zip 解包结构不对COCO 要求 zip 根目录直接包含 json 与 mask 目录若提交后在服务器侧报文件缺失先检查是否多包了一层目录。相关资源用户指南原文docs/en/user_guides/test_results_submission.md基础数据配置configs/base/datasets/coco_panoptic.py测试信息修补脚本tools/misc/gen_coco_panoptic_test_info.py评测指标实现mmdet/evaluation/metrics/coco_panoptic_metric.py全景数据集实现mmdet/datasets/coco_panoptic.py测试入口tools/test.py、tools/dist_test.sh、tools/slurm_test.shMaskFormer 示例配置configs/maskformer/maskformer_r50_ms-16xb1-75e_coco.py【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考