基于 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 即直接复用了官方方案)。下载前需要:
- 在 Roboflow 平台注册账号,获取私有 API Key;
- 将 API Key 写入环境变量:
export ROBOFLOW_API_KEY = Your Private API Key- 安装 Roboflow 的 Python 包:
pip install roboflow2. 执行下载脚本
在仓库根目录执行以下命令,即可按 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 完成,其原理是:
- 读取 labels_names.json,其中记录了每个数据集的
name、category(所属领域)和classes(类别及样本数); - 查找目标数据集名,取出其类别元组;
- 将模板内容中的字符串
('profile_info', )替换为真实类别元组,将tweeter-profile替换为目标数据集名; - 写出到
temp_configs/<dataset>.py。
这就是 README 中特别强调的原因:用户提供的自定义配置必须是tweeter-profile数据集,且必须包含data_root和class_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=False与frozen_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_dirs2. 分布式多卡训练
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 ...启动,并支持通过环境变量NNODES、NODE_RANK、PORT、MASTER_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_dirsSlurm 模式通过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_dirstxt 文件格式为每行一个数据集名,注意第 4 行的空行是必不可少的(用于标记列表结束):
acl-x-ray tweeter-profile abdomen-mri该 txt 文件也可以不手工创建,直接用下面介绍的log_extract.py自动生成。
训练结果汇总:一键生成 CSV / Excel 报告
训练完成后(或训练过程中),可用 log_extract.py 收集work_dirs下的结果并输出为 csv 和 xlsx 格式。运行前请确保已安装pandas和openpyxl:
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 的实现)是:
- 遍历
rf100/下每个数据集目录,读取其train/_annotations.coco.json与valid/_annotations.coco.json,统计训练/验证图像数,并从labels_names.json中获取所属领域category与类别数class_num; - 找到该数据集在
work_dirs下最新的时间戳日志目录,用正则Epoch\(val\) \[25\]检查是否完成训练;未完成则计入fail列表; - 用正则从日志中提取最优 checkpoint 对应的
coco/bbox_mAP、coco/bbox_mAP_50、coco/bbox_mAP_s、coco/bbox_mAP_m、coco/bbox_mAP_l等指标; - 汇总写入 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-ptywi、circuit-elements、marbles、printed-circuit-board、solar-panels-taxvb这 5 个数据集的单张图像 GT 框数量极大,DINO 在 3090 上会 OOM,因此这 5 个数据集改在 A100 上训练(slurm_train.sh 示例datasets_list中正好列出了这 5 个数据集)。
从官方结果可以观察到:DINO(Transformer 类算法)的整体表现优于Faster R-CNN、TOOD等传统 CNN 检测算法,说明 Transformer 检测器在不同领域、不同数据规模下同样具备优势;但若单独分析某一领域,结论并不一定成立。
同时官方也如实指出了 RF100 基准自身的一些缺陷:
- 部分数据集训练图像极少,在统一超参数下可能表现不佳;
- 部分领域的某些数据集目标极小且数量众多,
Faster RCNN、TOOD、DINO不做针对性调参时结果很差,这类结果可忽略; - 部分数据集标注质量较随意,若用于图文检测模型可能效果不佳。
另外两点补充说明:
- 由于数据集多达 100 个,官方无法逐一核查,若发现不合理之处欢迎反馈修正;
- 汇总时提供 mAP_s 等不同尺度指标的汇总,但当某数据集不存在对应尺度的 bbox 时,会在汇总时忽略该数据集。
自定义算法接入基准评测
如果想评测自己的算法在 RF100 上的表现,只需在projects/RF100-Benchmark/configs目录下新增一份算法配置即可。前提是遵循模板的两个约束:
- 配置必须是
tweeter-profile数据集(内部流程通过字符串替换生成其余数据集配置); - 必须包含
data_root和class_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_classes、metainfo等骨架不变。训练与汇总流程与官方算法完全一致。
引用
如果你在研究中使用了本基准或本文描述的复现流程,可引用 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),仅供参考