基于 mmdetection 的 Roboflow 100 多域目标检测基准复现指南
2026/9/19 13:44:36 网站建设 项目流程

基于 mmdetection 的 Roboflow 100 多域目标检测基准复现指南

【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection

导读

Roboflow 100(RF100)是一个覆盖 7 大图像领域、包含 100 个数据集的跨域目标检测基准,常用于检验检测模型的泛化能力。本文将围绕 projects/RF100-Benchmark/README.md 展开,系统讲解如何基于 OpenMMLab 的 mmdetection 仓库从零复现这一基准:包括 RF100 数据集下载与整理、基于模板配置自动生成 100 份训练配置、单卡/多卡/Slurm 训练与断点续训、训练结果自动汇总分析,以及如何接入自定义算法进行公平对比。读完本文,你将掌握一套开箱即用的"一脚本跑完 100 个数据集"的基准评测流水线。

Roboflow 100 基准简介

RF100 由 Roboflow 团队于 2022 年提出(论文《Roboflow 100: A Rich, Multi-Domain Object Detection Benchmark》,见 arXiv:2211.13523),其设计动机非常明确:主流检测模型的评估通常只在 COCO、Pascal VOC 等固定数据集上优化单一指标(如 mAP),而这些数据集主要来源于网络图片,无法覆盖卫星图像、显微图像、游戏画面等真实业务中常见的领域,因而难以评估模型的真实泛化能力。

RF100 的构成可以概括为:

  • 100 个数据集7 个图像领域(aerial、documents、electromagnetic、microscopic、real world、underwater、videogames,可参见仓库中 labels_names.json 的category字段);
  • 224,714 张图像805 个类别标签,累计标注时长超过 11,170 小时;
  • 数据从 Roboflow Universe 上 90,000 多个公开数据集、6,000 万张公开图像中筛选而来,具有极强的语义多样性与领域多样性。

在 mmdetection 仓库中,该基准的完整实现位于 projects/RF100-Benchmark,代码结构如下:

# current path is projects/RF100-Benchmark/ ├── configs │ ├── dino_r50_fpn_ms_8xb8_tweeter-profile.py │ ├── faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py │ └── tood_r50_fpn_ms_8xb8_tweeter-profile.py ├── README.md ├── README_zh-CN.md ├── rf100 # 下载后生成的目录,存放 100 个数据集 └── scripts ├── create_new_config.py # 基于模板配置生成其余 99 个数据集的训练配置 ├── datasets_links_640.txt # 数据集下载链接(100 行,来自官方仓库) ├── download_dataset.py # 数据集下载代码(来自官方仓库) ├── download_datasets.sh # 数据集下载脚本(来自官方仓库) ├── labels_names.json # 数据集信息(来自官方仓库,修正过部分错误) ├── parse_dataset_link.py # 解析 Roboflow 链接(来自官方仓库) ├── log_extract.py # 训练结果收集与整理 ├── dist_train.sh # 训练与评测启动脚本(单卡/多卡) └── slurm_train.sh # Slurm 集群训练与评测启动脚本

数据集准备:注册、下载与目录组织

1. 注册 Roboflow 并安装依赖

RF100 数据集托管在 Roboflow 平台,官方提供了完整的下载脚本(roboflow-100-benchmark 即直接复用了官方方案)。下载前需要:

  1. 在 Roboflow 平台注册账号,获取私有 API Key;
  2. 将 API Key 写入环境变量:
export ROBOFLOW_API_KEY = Your Private API Key
  1. 安装 Roboflow 的 Python 包:
pip install roboflow

2. 执行下载脚本

在仓库根目录执行以下命令,即可按 datasets_links_640.txt 中罗列的 100 个链接依次下载全部数据集:

cd projects/RF100-Benchmark/ bash scripts/download_datasets.sh

下载完成后,当前目录projects/RF100-Benchmark/下会生成rf100/文件夹,内含全部数据集。每个数据集的目录结构如下(以tweeter-profile为例):

# current path is projects/RF100-Benchmark/ ├── rf100 │ └── tweeter-profile │ ├── train │ │ ├── 0b3la49zec231_jpg.rf.8913f1b7db315c31d09b1d2f583fb521.jpg │ │ └── _annotations.coco.json │ ├── valid │ │ ├── 0fcjw3hbfdy41_jpg.rf.d61585a742f6e9d1a46645389b0073ff.jpg │ │ └── _annotations.coco.json │ ├── test │ │ ├── 0dh0to01eum41_jpg.rf.dcca24808bb396cdc07eda27a2cea2d4.jpg │ │ └── _annotations.coco.json │ ├── README.dataset.txt │ └── README.roboflow.txt

每个数据集按train/valid/test/三个子集划分,标注文件统一为 Roboflow 导出的 COCO 格式_annotations.coco.json,因此可以直接被 mmdetection 的 COCO 系数据集读取。

几点实操建议:

  • 全部数据集合计约占用12.3 GB存储空间;
  • 如果不需要一次性跑完全部 100 个数据集,可以直接编辑 datasets_links_640.txt,删除不想下载的数据集链接行——注意该文件共 100 行,一行一个链接;
  • 下载脚本会跳过已经存在的目录(if [ ! -d "$location/$project" ]判断),因此支持断点续下;
  • 若想深入了解各数据集的统计信息,可参考 Roboflow 官方仓库中提供的数据集分析脚本。

核心机制:一份模板配置生成 100 份训练配置

整个基准评测流水线的关键设计是"一份模板 + 一次字符串替换 = 100 份配置"。以 faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 为模板,其核心内容如下:

_base_ = '../../../configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py' custom_imports = dict( imports=['projects.RF100-Benchmark'], allow_failed_imports=False) data_root = 'rf100/tweeter-profile/' class_name = ('profile_info', ) num_classes = len(class_name) metainfo = dict(classes=class_name) image_scale = (640, 640)

模板配置固定指向tweeter-profile数据集,并把类别名固定为('profile_info', )。生成其他数据集配置的工作由 create_new_config.py 完成,其原理是:

  1. 读取 labels_names.json,其中记录了每个数据集的namecategory(所属领域)和classes(类别及样本数);
  2. 查找目标数据集名,取出其类别元组;
  3. 将模板内容中的字符串('profile_info', )替换为真实类别元组,将tweeter-profile替换为目标数据集名;
  4. 写出到temp_configs/<dataset>.py

这就是 README 中特别强调的原因:用户提供的自定义配置必须是tweeter-profile数据集,且必须包含data_rootclass_name变量,否则字符串替换无法完成,程序会报错。

模板配置中的关键参数解读

以 Faster R-CNN 模板为例,逐段说明各配置的作用:

model = dict( backbone=dict(norm_eval=False, frozen_stages=-1), roi_head=dict(bbox_head=dict(num_classes=int(num_classes))))
  • norm_eval=Falsefrozen_stages=-1:不对 backbone 的 BN 层和任何 stage 进行冻结,使整个骨干网络在跨域小数据集上充分参与训练,这是迁移到域外数据时提升拟合能力的常用设置。
train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations', with_bbox=True), dict(type='RandomResize', scale=image_scale, ratio_range=(0.8, 1.2), keep_ratio=True), dict(type='RandomCrop', crop_size=image_scale), dict(type='RandomFlip', prob=0.5), dict(type='PackDetInputs') ]
  • 训练采用 640×640 的随机缩放(比例范围 0.8~1.2)+ 随机裁剪 + 随机翻转的多尺度策略(ms即 multi-scale 之意),这与官方基准保持一致的增强设置。
train_dataloader = dict( batch_size=8, num_workers=4, batch_sampler=None, dataset=dict( _delete_=True, type='RepeatDataset', times=4, dataset=dict( type='RF100CocoDataset', metainfo=metainfo, data_root=data_root, ann_file='train/_annotations.coco.json', data_prefix=dict(img='train/'), filter_cfg=dict(filter_empty_gt=False, min_size=32), pipeline=train_pipeline)))
  • RepeatDataset+times=4:这是"训练 100 epoch、实际 25 epoch"说法的来源——配置中max_epochs = 25,而数据被重复 4 次,因此单卡每轮迭代实际相当于常规 100 epoch 的训练量;
  • RF100CocoDataset是专门为 RF100 定制的数据集类(见下文)。
val_evaluator = dict( type='RF100CocoMetric', ann_file=data_root + 'valid/_annotations.coco.json', metric='bbox', format_only=False) test_evaluator = val_evaluator
  • 评测统一在验证集上计算coco/bbox_mAP等指标,训练过程中保存验证 mAP 最优的 checkpoint(checkpoint=dict(save_best='auto', ...));
  • 训练完成后,work_dirs下会生成模型权重与日志。

为 RF100 定制的数据集与评测器

模板配置通过custom_imports引入了projects.RF100-Benchmark包,其中注册了两个自定义组件:

RF100CocoDataset(coco.py):继承自CocoDataset。RF100 的部分数据集(如bees-jt5in)存在类别名与sup_names同名的不规范情况,因此在load_data_list中增加了过滤逻辑:当按类别名取到的cat_ids数量与元信息中的类别数不一致时,剔除sup_names=['none']对应的类别 id,保证类别映射正确。

RF100CocoMetric(coco_metric.py):继承自CocoMetric,在compute_metrics中同样加入了针对sup_names同名问题的cat_ids修正逻辑,确保 COCOeval 只对有效类别计算 mAP、mAP_50、mAP_75、mAP_s、mAP_m、mAP_l 等指标。

这两个组件与 mmdetection 的注册机制(@DATASETS.register_module()@METRICS.register_module())无缝衔接,无需修改主仓库任何代码即可被配置系统识别。

模型训练与评测:三种启动方式

训练流程由脚本统一驱动:外层 for 循环遍历rf100/下的每个数据集 → 调用create_new_config.py生成该数据集的临时配置 → 调用 mmdetection 的 tools/train.py 训练。训练完成(或达到保存条件)后,脚本会继续处理下一个数据集,实现全自动串行评测。

1. 单卡训练

# current path is projects/RF100-Benchmark/ bash scripts/dist_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 1 # 指定保存路径 bash scripts/dist_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 1 my_work_dirs

2. 分布式多卡训练

bash scripts/dist_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 8 # 指定保存路径 bash scripts/dist_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 8 my_work_dirs

多卡场景下脚本内部通过python -m torch.distributed.launch --nproc_per_node=$GPUS ...启动,并支持通过环境变量NNODESNODE_RANKPORTMASTER_ADDR调整分布式参数(默认 1 节点、rank 0、端口 29500)。

3. Slurm 集群训练

bash scripts/slurm_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 8 # 指定保存路径 bash scripts/slurm_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 8 my_work_dirs

Slurm 模式通过srun提交作业,可自定义PARTITION(默认mm_dev)、JOB_NAME(默认benchmark)、GPUS_PER_NODE(默认 8)、CPUS_PER_TASK(默认 5)等环境变量。

训练结束后,当前目录会生成work_dirs/文件夹(或你指定的my_work_dirs/),每个数据集一个子目录,内含训练日志与最优权重。注意:dist_train.sh/slurm_train.sh中启动命令后的${@:4}支持透传 mmengine 训练器的额外参数(如--amp--cfg-options等)。

4. 面向调试与断点续训的两个开关

考虑到一次性训练 100 个数据集耗时极长、中途极易出现个别数据集失败,脚本内置了两个控制变量(见 dist_train.sh 与 slurm_train.sh 的头部):

  • DEBUG变量:用于调试或只训练特定数据集。把它设为 1,并在datasets_list变量中指定要训练的数据集名(脚本中的示例为("acl-x-ray", "tweeter-profile")),脚本就会跳过其他数据集;
  • RETRY_PATH变量:用于失败重训。传入一个 txt 数据集列表文件路径,脚本会读取该文件、置DEBUG=1,只训练文件中列出的数据集;不传则训练全部数据集。
RETRY_PATH=failed_dataset_list.txt bash scripts/dist_train.sh configs/faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py 8 my_work_dirs

txt 文件格式为每行一个数据集名,注意第 4 行的空行是必不可少的(用于标记列表结束):

acl-x-ray tweeter-profile abdomen-mri

该 txt 文件也可以不手工创建,直接用下面介绍的log_extract.py自动生成。

训练结果汇总:一键生成 CSV / Excel 报告

训练完成后(或训练过程中),可用 log_extract.py 收集work_dirs下的结果并输出为 csv 和 xlsx 格式。运行前请确保已安装pandasopenpyxl

python scripts/log_extract.py faster_rcnn --epoch 25 --work-dirs my_work_dirs

参数说明:

  • 第一个位置参数(如faster_rcnn:用于生成 CSV 表头,可填任意字符串,但建议填模型名,便于后期区分多组实验;
  • --epoch:训练轮数,用于解析日志判断训练是否完成。由于配置中每个数据集实际训练 25 epoch(RepeatDataset 4 次等价 100 epoch),默认值为 25;
  • --work-dirs:训练权重保存路径,默认是当前目录下的work_dirs

脚本的工作流程(对应 log_extract.py 的实现)是:

  1. 遍历rf100/下每个数据集目录,读取其train/_annotations.coco.jsonvalid/_annotations.coco.json,统计训练/验证图像数,并从labels_names.json中获取所属领域category与类别数class_num
  2. 找到该数据集在work_dirs下最新的时间戳日志目录,用正则Epoch\(val\) \[25\]检查是否完成训练;未完成则计入fail列表;
  3. 用正则从日志中提取最优 checkpoint 对应的coco/bbox_mAPcoco/bbox_mAP_50coco/bbox_mAP_scoco/bbox_mAP_mcoco/bbox_mAP_l等指标;
  4. 汇总写入 CSV,并进一步按"领域 + 数据集名"排序生成_detail.xlsx,按领域分组求均值生成_sum.xlsx

运行结束后,my_work_dirs下会生成 4 类文件:

timestamp_detail.xlsx # 100 个数据集按领域/名称排序后的详细信息 timestamp_sum.xlsx # 100 个数据集的汇总(按领域分组求均值)信息 timestamp_eval.csv # 100 个数据集按训练顺序排列的评测结果 failed_dataset_list.txt # 未训练/训练失败的数据集列表(可直接喂给 RETRY_PATH)

其中failed_dataset_list.txt就是上一节RETRY_PATH机制需要的输入文件,两者配合即可实现"先全量训练 → 自动找出失败数据集 → 重训失败子集"的闭环。

官方已提供的基准结果与分析

目前项目已给出 Faster R-CNN、TOOD、DINO 三个算法的 RF100 评测结果(未做精细调参)。为保证公平对比,三者统一遵循以下约定:

  • 使用相同的 epoch 数与数据增强策略(即上文模板中的 640 多尺度方案);
  • 全部加载 COCO 预训练权重(三个模板配置的load_from分别为 Faster R-CNN mstrain 3x、TOOD 1x、DINO 4scale 12e 的 COCO 权重,可参见各 configs 文件);
  • 训练期间保存验证集上性能最优的 checkpoint。

硬件与特殊处理说明:

  • 为加快速度,所有模型使用 8 卡 GPU 训练;除个别 OOM 的数据集外,其余模型与数据集均在 8 张 3090 上完成;
  • 由于bacteria-ptywicircuit-elementsmarblesprinted-circuit-boardsolar-panels-taxvb这 5 个数据集的单张图像 GT 框数量极大,DINO 在 3090 上会 OOM,因此这 5 个数据集改在 A100 上训练(slurm_train.sh 示例datasets_list中正好列出了这 5 个数据集)。

从官方结果可以观察到:DINO(Transformer 类算法)的整体表现优于Faster R-CNNTOOD等传统 CNN 检测算法,说明 Transformer 检测器在不同领域、不同数据规模下同样具备优势;但若单独分析某一领域,结论并不一定成立。

同时官方也如实指出了 RF100 基准自身的一些缺陷:

  • 部分数据集训练图像极少,在统一超参数下可能表现不佳;
  • 部分领域的某些数据集目标极小且数量众多,Faster RCNNTOODDINO不做针对性调参时结果很差,这类结果可忽略;
  • 部分数据集标注质量较随意,若用于图文检测模型可能效果不佳。

另外两点补充说明:

  1. 由于数据集多达 100 个,官方无法逐一核查,若发现不合理之处欢迎反馈修正;
  2. 汇总时提供 mAP_s 等不同尺度指标的汇总,但当某数据集不存在对应尺度的 bbox 时,会在汇总时忽略该数据集。

自定义算法接入基准评测

如果想评测自己的算法在 RF100 上的表现,只需在projects/RF100-Benchmark/configs目录下新增一份算法配置即可。前提是遵循模板的两个约束:

  • 配置必须是tweeter-profile数据集(内部流程通过字符串替换生成其余数据集配置);
  • 必须包含data_rootclass_name两个变量。

最省力的做法是复制现有任一模板(如 faster-rcnn_r50_fpn_ms_8xb8_tweeter-profile.py),替换其中的_base_为你自己的算法基座(仓库configs/下有 faster_rcnn、tood、dino、mask_rcnn、retinanet 等大量现成配置可选),并保持data_root = 'rf100/tweeter-profile/'class_name = ('profile_info', )num_classesmetainfo等骨架不变。训练与汇总流程与官方算法完全一致。

引用

如果你在研究中使用了本基准或本文描述的复现流程,可引用 RF100 原始论文:

@misc{2211.13523, Author = {Floriana Ciaglia and Francesco Saverio Zuppichini and Paul Guerrie and Mark McQuade and Jacob Solawetz}, Title = {Roboflow 100: A Rich, Multi-Domain Object Detection Benchmark}, Year = {2022}, Eprint = {arXiv:2211.13523}, }

小结

围绕 mmdetection 的 projects/RF100-Benchmark 目录,本文完整梳理了从数据集下载、模板配置生成、多方式训练、结果汇总到自定义算法接入的 RF100 基准评测闭环。整套流水线的核心价值在于:用"一份模板 + 字符串替换"的机制把 100 个跨域数据集的训练配置成本降到最低,并用RETRY_PATH+log_extract.py的组合解决长耗时训练中的失败重试与结果整理问题。无论你是想评估现有检测器的跨域泛化能力,还是想快速验证新算法在多领域数据上的表现,这套流程都可以直接复用。

【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询