尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MMDetection 全景分割测试结果提交指南:COCO test-dev 推理、结果格式化与打包提交全流程

MMDetection 全景分割测试结果提交指南:COCO test-dev 推理、结果格式化与打包提交全流程 MMDetection 全景分割测试结果提交指南COCO test-dev 推理、结果格式化与打包提交全流程【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection本文基于 MMDetection 仓库用户指南中的「提交测试结果」文档系统讲解如何在无公开标注的 COCO 测试开发集test-dev上运行全景分割Panoptic Segmentation模型推理把预测结果格式化为 COCO Panoptic 评测服务器所要求的文件结构并最终压缩为 zip 提交包。读完本文你将掌握测试数据准备、test_dataloader/test_evaluator的两种更新方式、单卡 / 多卡 / Slurm 三种推理启动方式以及结果文件命名与打包的完整实战流程并能结合仓库源码理解format_only模式背后的实现机制。1. 为什么需要一套专门的提交流程COCO 的test-dev与test-challenge集合的标注信息不对外公开模型在本地无法直接计算 PQPanoptic Quality、SQSegmentation Quality、RQRecognition Quality等指标。因此MMDetection 提供了一条“只输出、不评估”的推理链路在 test-dev 上运行模型推理借助评估器CocoPanopticMetric的format_onlyTrue模式把预测结果写成 COCO 官方评估脚本可读取的JSON 文件 掩码 PNG 目录按照 COCO 官方的命名约定重命名打包为 zip 上传到评估服务器完成打分。在仓库中这条链路由三块核心代码支撑数据侧CocoPanopticDataset继承自CocoDataset注册名为CocoPanopticDataset配置侧configs/base/datasets/coco_panoptic.py内含默认的 val 配置以及被注释掉的 test-dev 提交配置评估侧CocoPanopticMetricformat_only与outfile_prefix参数。2. 前提条件下载 test2017 数据并生成全景标注信息2.1 下载与解压全景分割结果提交需要三类文件COCO 测试集图像test2017测试图像的基础信息image_info_test2017含image_info_test-dev2017.json全景标注panoptic_annotations_trainval2017用于取得带isthing属性的类别定义。可参考以下命令下载并解压到data/coco/# 假设 data/coco/ 不存在 mkdir -pv data/coco/ # 下载 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 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/ # 删除 zip 文件可选 rm -rf data/coco/test2017.zip data/coco/image_info_test2017.zip data/coco/panoptic_annotations_trainval2017.zip说明以上命令面向 Linux 环境下载产物也可手动放置到对应目录只要最终目录结构符合下文即可。2.2 用脚本补齐类别信息gen_coco_panoptic_test_info.pyimage_info_test-dev2017.json中的类别信息缺少isthing属性而全景分割评估以及CocoPanopticMetric的预测解析需要区分 thing有形体目标如 person、car与 stuff背景材质如 road、sky。MMDetection 提供脚本 tools/misc/gen_coco_panoptic_test_info.py用panoptic_val2017.json中的完整类别信息替换掉 test-dev 信息文件中的类别字段python tools/misc/gen_coco_panoptic_test_info.py data/coco/annotations从 脚本源码 可以看到其核心逻辑非常简单直接val_info load(osp.join(data_root, panoptic_val2017.json)) test_old_info load(osp.join(data_root, image_info_test-dev2017.json)) # 用带 isthing 属性的类别信息替换 image_info_test-dev2017.json 中的类别 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))执行后会生成新的标注文件panoptic_image_info_test-dev2017.json它将被后续推理配置中的ann_file引用。2.3 准备完成后的目录结构完成上述步骤后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其中test2017/存放测试图像panoptic_image_info_test-dev2017.json即后续推理的标注来源。3. 在 COCO test-dev 上执行推理要在 test-dev 上推理需要更新两处配置test_dataloader把数据源指向 test-dev 的标注与图像和test_evaluator进入format_only输出模式。MMDetection 提供两种更新方式修改配置文件或通过命令行--cfg-options动态覆盖。3.1 方式一在配置文件中更新test-dev 的提交相关配置在 configs/base/datasets/coco_panoptic.py 的末尾以注释形式给出第 7594 行。完整内容如下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)其中dataset_type CocoPanopticDataset、data_root data/coco/在文件开头定义见 coco_panoptic.py。注意这里的test_pipeline与训练管线不同test 阶段的PackDetInputs保留了img_id、img_path、ori_shape、img_shape、scale_factor等元信息供结果导出使用见 coco_panoptic.py。更新方式有两种情况情况 1直接取消注释configs/_base_/datasets/coco_panoptic.py中上述设置。由于多数全景分割模型如 MaskFormer、Mask2Former的配置文件都以该文件为_base_取消注释即可全局生效。情况 2将以下精简配置复制到你现在使用的配置文件中推荐避免改动公共 base 配置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)这里data_prefix中使用了_delete_True表示用dict(imgtest2017/)整体替换基类中的data_prefix基类默认还包含seg前缀而 test-dev 没有真值掩码必须清除而不是做浅层合并。随后执行推理python tools/test.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE}tools/test.py的完整参数说明可参见 tools/test.py其中--cfg-options支持以keyvalue形式覆盖任意配置项。3.2 方式二在命令行中更新不修改任何配置文件直接通过--cfg-options覆盖适合临时验证或脚本化提交# 用一个 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 # 用四个 GPU 测试 CUDA_VISIBLE_DEVICES0,1,3,4 bash tools/dist_test.sh \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ 4 \ --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 # 用 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}/results使用多卡启动时需要注意两个脚本的参数约定tools/dist_test.sh第 3 个位置参数是 GPU 数量GPUS脚本内部通过torch.distributed.launch --nproc_per_node$GPUS拉起分布式测试GPU 总数应与你设置的CUDA_VISIBLE_DEVICES数量一致tools/slurm_test.sh通过GPUS环境变量默认 8控制srun --ntasks通过GPUS_PER_NODE默认 8控制每节点任务数并透传--launcherslurm。命令行覆盖同样支持_delete_True语法——--cfg-options由tools/test.py中的DictAction解析后合并进配置见 tools/test.py因此它与配置文件覆盖是等价的。小提示data_prefix.img在命令行写作test2017不带末尾斜杠即可数据集解析时通过osp.join(data_prefix[img], img_info[file_name])拼接图像路径见 coco_panoptic.py有无斜杠不影响结果。3.3 完整实例用 MaskFormerResNet-50在 test2017 上推理假设我们使用预训练的 MaskFormerResNet-50 骨干对test2017执行推理单卡命令如下# 单 GPU 测试 CUDA_VISIBLE_DEVICES0 python tools/test.py \ configs/maskformer/maskformer_r50_ms-16xb1-75e_coco.py \ checkpoints/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.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需要留意的是当前仓库中 MaskFormer 的 R50 配置文件名是 configs/maskformer/maskformer_r50_ms-16xb1-75e_coco.py多尺度训练、16 卡 batch_size1、75 个 epoch而非旧版文档中的maskformer_r50_mstrain_16x1_75e_coco.py使用前请以仓库configs/maskformer/目录下的实际文件名为准。该配置以 configs/base/datasets/coco_panoptic.py 为基类因此直接继承上文的全景数据管线模型侧num_things_classes80、num_stuff_classes53与 COCO 全景标注的类别划分一致见 maskformer_r50_ms-16xb1-75e_coco.py。4. 输出结果是如何生成的CocoPanopticMetric.format_only源码解析推理结束后结果并非由模型直接写出而是由评估器CocoPanopticMetric在 runner 的测试阶段统一导出。理解这一机制有助于排查“结果没生成/生成位置不对”的问题。4.1 关键参数CocoPanopticMetric 的构造参数与提交场景相关的有参数作用提交时的取值ann_fileCOCO 格式标注文件路径data/coco/annotations/panoptic_image_info_test-dev2017.jsonformat_only只格式化输出结果不执行评估Trueoutfile_prefix结果文件前缀路径 文件名前缀format_onlyTrue时必填./work_dirs/.../resultsnprocPQ 计算进程数默认 32默认即可提交场景不计算 PQbackend_args文件读写后端参数如对象存储与数据集保持一致其中format_onlyTrue时源码会强制校验outfile_prefix非空否则结果会被写入临时目录并在进程结束时被清理见 coco_panoptic_metric.py。这也解释了为什么提交场景必须显式指定outfile_prefix。4.2 输出文件的生成在compute_metrics中当format_onlyTrue时评估器完成预测转换后直接返回空指标字典见 coco_panoptic_metric.py。实际导出动作发生在result2json每个预测样本会生成一张全景掩码 PNG写入目录{outfile_prefix}.panoptic/目录名由self.seg_out_dir f{self.outfile_prefix}.panoptic决定见 coco_panoptic_metric.py汇总所有segments_info生成 JSON 文件{outfile_prefix}.panoptic.json见 coco_panoptic_metric.py。因此当outfile_prefixwork_dirs/maskformer/results时输出为work_dirs/maskformer/ |-- results.panoptic.json # 每个图像的 segments_info 汇总 -- results.panoptic/ # 存储每个测试图像的掩码 PNG值得注意的是掩码目录名是results.panoptic含.panoptic后缀而 JSON 文件名是results.panoptic.json这与官方提交包中“JSON 掩码目录”的文件对结构一一对应。4.3 依赖说明CocoPanopticMetric依赖panopticapi库用于 PQ 计算与id2rgb/rgb2id编解码未安装时会直接抛出RuntimeError提示安装见 coco_panoptic_metric.py。即使是format_only提交场景也需要保证该依赖可用因为掩码 PNG 的 RGB↔ID 编解码同样依赖它。5. 重命名文件并压缩结果推理完成后工作目录下会产生一个 JSON 文件和一个掩码目录。接下来需要按照 COCO 官方上传页的命名约定重命名将两个文件直接不套外层目录打包进同一个 zip按约定重命名 zip 文件后上传。重命名与压缩命令如下# 在 WORK_DIR 中我们有全景分割结果results.panoptic 目录和 results.panoptic.json cd ${WORK_DIR} # 将 [algorithm_name] 替换为你使用的算法名称 mv ./results.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命名约定说明以算法名为xxx为例掩码目录名panoptic_test-dev2017_xxx_resultsJSON 文件名panoptic_test-dev2017_xxx_results.json最终提交包panoptic_test-dev2017_xxx_results.zip。其中zip -uupdate与-rrecursive组合可增量更新归档、递归打包目录。打包完成后将 zip 提交到 COCO 全景分割评估服务器即可获得 PQ / SQ / RQ 等官方指标。6. 常见问题与注意事项1. 多节点训练/测试时outfile_prefix必须指向共享存储。CocoPanopticMetric的注释明确要求多节点场景下outfile_prefix应指向共享存储路径否则各节点写出的结果无法汇聚见 coco_panoptic_metric.py。2.data_prefix覆盖务必携带_delete_True。基类coco_panoptic.py的data_prefix同时包含img与seg两个键而 test-dev 只有图像没有真值掩码若不做整体删除seg前缀残留可能导致数据解析异常。3. 配置文件与命令行二选一即可。两种方式在功能上等价若同时使用--cfg-options的覆盖优先生效tools/test.py通过cfg.merge_from_dict(args.cfg_options)合并见 tools/test.py。4. 测试阶段不做数据过滤。CocoPanopticDataset.filter_data在test_modeTrue时直接返回完整数据列表不执行空 GT 过滤见 coco_panoptic.py保证 test-dev 上每张图都会产出预测。5. 区分 test-dev 与 test-challenge。本文流程面向test-dev2017若提交到test-challenge需将标注文件、命名中的test-dev2017相应替换为test-challenge2017其余流程完全一致。通过本文的步骤——准备 test-dev 数据、用脚本补齐isthing类别信息、更新test_dataloader/test_evaluator配置文件或命令行两种方式、按命名约定打包——你就能把任意基于 MMDetection 训练的全景分割模型如 MaskFormer、Mask2Former的预测结果规范地提交到 COCO 评估服务器并获得官方的 PQ / SQ / RQ 分数。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表