news 2026/9/20 3:26:17

MMDetection 使用 VISION-Datasets 训练工业缺陷检测模型:数据集准备、COCO 配置与实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MMDetection 使用 VISION-Datasets 训练工业缺陷检测模型:数据集准备、COCO 配置与实战指南

MMDetection 使用 VISION-Datasets 训练工业缺陷检测模型:数据集准备、COCO 配置与实战指南

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

VISION Datasets 是面向视觉工业检测(Vision-based InduStrial InspectiON)的基准数据集,包含 14 个子数据集、约 1.8 万张工业图像与 44 类缺陷标注。本文基于 MMDetection 仓库中的 projects/VISION-Datasets/README.md,完整讲解该数据集的下载、解压与目录组织方法,并结合仓库源码与现有 COCO 配置文件,给出在 MMDetection 3.x 下接入 Mask R-CNN 等检测/实例分割模型的完整配置与训练、评测、推理实战方案。

一、VISION-Datasets 是什么:面向工业质检的缺陷检测基准

1.1 数据集背景与设计动机

在视觉检测算法持续进步的背景下,真实工业场景仍面临三大痛点:数据可用性不足、数据质量参差不齐、生产工艺要求复杂多变。VISION Datasets 正是针对这些问题设计的一个工业质检基准,其核心特色包括:

  • 14 个工业检测子数据集:覆盖线缆(Cable)、电容(Capacitor)、铸造件(Casting)、控制台(Console)、圆柱件(Cylinder)、电子产品(Electronics)、沟槽(Groove)、半球件(Hemisphere)、镜片(Lens)、PCB 电路板(PCB_1 / PCB_2)、环形件(Ring)、螺丝(Screw)、木材(Wood)等典型工业品。
  • 总计约 1.8 万张图像、44 类缺陷,力求贴近真实生产场景的多样性。
  • 所有划分(split)均提供标注掩码(annotation masks),可同时支持缺陷检测与实例分割等多种检测范式。
  • 提供实例分割标注,可支撑更精确的缺陷定位与识别。
  • 数据集托管于 HuggingFace(仓库 README 中给出的下载地址为https://huggingface.co/datasets/VISION-Workshop/VISION-Datasets),并配套有持续进行的挑战赛以推动工业视觉检测的发展。

在 MMDetection 中,对 VISION 数据集的支持由 PR #10530 引入,随 v3.1.0 版本一同发布,见 docs/en/notes/changelog.md 中的Support VISION dataset (#10530)记录。

1.2 为什么适合接入 MMDetection

MMDetection 3.x 的CocoDataset(实现见 mmdet/datasets/coco.py)原生支持 COCO 格式的标注,而 VISION 数据集每个子集都提供_annotations.coco.json标注文件。这意味着你无需编写任何新的 Dataset 类,只需把数据按 COCO 目录规范组织好,再在配置文件中把dataset_type设为'CocoDataset'、把data_root指向对应子集即可完成接入,检测与实例分割任务均可覆盖。

二、数据集准备:下载、解压与目录组织

2.1 下载与目录放置

首先从https://huggingface.co/datasets/VISION-Workshop/VISION-Datasets下载全部压缩包,然后在 MMDetection 仓库根目录下建立data/VISION-Datasets/目录,并按如下结构放置(对应 README 中的组织方式):

mmdetection ├── mmdet ├── tools ├── configs ├── data │ └── VISION-Datasets │ ├── Cable.tar.gz │ ├── Capacitor.tar.gz │ ├── Casting.tar.gz │ ├── Console.tar.gz │ ├── Cylinder.tar.gz │ ├── Electronics.tar.gz │ ├── Groove.tar.gz │ ├── Hemisphere.tar.gz │ ├── Lens.tar.gz │ ├── PCB_1.tar.gz │ ├── PCB_2.tar.gz │ ├── Ring.tar.gz │ ├── Screw.tar.gz │ ├── Wood.tar.gz │ └── README.md

2.2 一键解压脚本

压缩包全部为.tar.gz格式。将下面的内容保存为vision_unzip.sh,放在mmdetection 根目录下,然后执行bash vision_unzip.sh即可完成批量解压:

#!/usr/bin/env bash for file in data/VISION-Datasets/*.tar.gz; do tar -xzvzf "$file" -C data/VISION-Datasets/ done

该脚本会遍历data/VISION-Datasets/下的所有.tar.gz文件,并逐个解压到同一目录。-x表示解压,-z表示通过 gzip 解压,-v输出详细过程便于确认,-f指定文件,-C指定解压目标目录。

2.3 解压后的目录结构

解压完成后,每个子数据集(以 Cable 为例)内部的组织格式如下:

mmdetection ├── mmdet ├── tools ├── configs ├── data │ └── VISION-Datasets │ ├── Cable.tar.gz │ ├── Capacitor.tar.gz │ ├── ...(其余 .tar.gz 压缩包保留) │ ├── README.md │ ├── Cable │ │ ├── train │ │ │ ├── _annotations.coco.json # COCO 格式标注文件 │ │ │ ├── 000001.png # 训练图像 │ │ │ ├── 000002.png │ │ │ └── xxxxxx.png │ │ ├── val │ │ │ ├── _annotations.coco.json # COCO 格式标注文件 │ │ │ └── xxxxxx.png # 验证图像 │ │ └── inference │ │ ├── _annotations.coco.json # 仅含未标注图像列表的 COCO 文件 │ │ └── xxxxxx.png # 推理图像 │ └── ...(其余子数据集解压结果)

关键点:

  • 每个子集(train / val / inference)目录下都有一个_annotations.coco.json,其中train 与 val 的标注文件包含真实标注,而inference 的标注文件仅包含未标注的图像列表,专用于推理与测试阶段。
  • 图像文件统一为.png格式,命名以000001.png依次递增(以 Cable 为例)。
  • 训练/验证目录结构与 COCO 标准布局天然对齐:标注文件与图像位于同一目录,便于通过ann_filedata_prefix直接定位。

三、在 MMDetection 中配置 VISION 数据集(以 Mask R-CNN 为例)

VISION 数据以 COCO 格式组织,因此直接复用 MMDetection 的CocoDatasetCocoMetric。下面以实例分割任务为例,从基础配置出发给出完整接入方法。

3.1 从现有 COCO 配置出发

MMDetection 为 COCO 实例分割提供的官方配置是 configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py,它由四个基础配置拼接而成:

_base_ = [ '../_base_/models/mask-rcnn_r50_fpn.py', '../_base_/datasets/coco_instance.py', '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ]

对 VISION 数据集而言,模型、训练计划与运行时配置均可保持不变,只需重写数据集相关配置。以Cable子集为例,推荐在configs/下新建配置文件并重写:

_base_ = [ '../_base_/models/mask-rcnn_r50_fpn.py', '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ] dataset_type = 'CocoDataset' data_root = 'data/VISION-Datasets/Cable/' train_pipeline = [ dict(type='LoadImageFromFile', backend_args=None), dict(type='LoadAnnotations', with_bbox=True, with_mask=True), dict(type='Resize', scale=(1333, 800), keep_ratio=True), dict(type='RandomFlip', prob=0.5), dict(type='PackDetInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', backend_args=None), dict(type='Resize', scale=(1333, 800), keep_ratio=True), # 若没有 GT 标注,删除下面这行 dict(type='LoadAnnotations', with_bbox=True, with_mask=True), dict( type='PackDetInputs', meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'scale_factor')) ] train_dataloader = dict( batch_size=2, num_workers=2, persistent_workers=True, sampler=dict(type='DefaultSampler', shuffle=True), batch_sampler=dict(type='AspectRatioBatchSampler'), dataset=dict( type=dataset_type, data_root=data_root, ann_file='train/_annotations.coco.json', data_prefix=dict(img='train/'), filter_cfg=dict(filter_empty_gt=True, min_size=32), pipeline=train_pipeline, backend_args=None)) val_dataloader = dict( batch_size=1, num_workers=2, persistent_workers=True, drop_last=False, sampler=dict(type='DefaultSampler', shuffle=False), dataset=dict( type=dataset_type, data_root=data_root, ann_file='val/_annotations.coco.json', data_prefix=dict(img='val/'), test_mode=True, pipeline=test_pipeline, backend_args=None)) test_dataloader = val_dataloader val_evaluator = dict( type='CocoMetric', ann_file=data_root + 'val/_annotations.coco.json', metric=['bbox', 'segm'], format_only=False, backend_args=None) test_evaluator = val_evaluator

3.2 关键配置项说明

  • dataset_type = 'CocoDataset':VISION 的标注为 COCO 格式,直接使用CocoDataset(注册于 mmdet/datasets/coco.py),其load_data_list()通过_annotations.coco.json加载图像与标注,ANN_ID_UNIQUE = True会校验标注 id 唯一性,若解压后的标注不符合该约束(极小概率的脏数据情况)训练会直接报错提示。
  • data_root:指向单个子数据集目录(如data/VISION-Datasets/Cable/)。注意:训练某个子集时,data_root应指向该子集而非整个VISION-Datasets目录。
  • ann_filedata_prefix:因为标注文件与图像位于同一子目录(如train/),ann_file='train/_annotations.coco.json'data_prefix=dict(img='train/')即可完成定位。这与 COCO 官方布局(annotations/instances_train2017.json+train2017/)略有差异,但CocoDataset.parse_data_info()会通过data_prefix['img']拼接图像路径,两种布局均可正常解析。
  • metric=['bbox', 'segm']CocoMetric同时输出框(bbox)与掩码(segm)指标,对应 VISION 数据集的缺陷检测 + 实例分割双任务能力;若只做检测可改为metric=['bbox']
  • filter_cfg=dict(filter_empty_gt=True, min_size=32):过滤掉没有 GT 或尺寸过小的样本,避免空标注干扰训练。

3.3 关于类别数与模型头

VISION 数据集共包含 44 类缺陷,但并非每个子集都包含全部类别。子集标注中的类别即该子集的缺陷类别集合。因此在使用 COCO 预训练权重微调时,需要将模型头中的num_classes改为目标子集的真实缺陷类别数。以 Mask R-CNN 为例,基础配置 configs/base/models/mask-rcnn_r50_fpn.py 中bbox_headnum_classes=80(COCO 类别数),接入 VISION 时应在你的新配置中通过model字段覆盖为对应子集的类别数,例如:

model = dict( roi_head=dict( bbox_head=dict(num_classes=<你的子集缺陷类别数>), mask_head=dict(num_classes=<你的子集缺陷类别数>)))

提示:可以通过读取子集的_annotations.coco.json中的categories字段确认实际类别数;也可以在配置中使用metainfo指定类别名(若标注文件缺失 categories 字段)。具体类别数请以你下载数据集的标注文件为准。

四、训练、评测与推理实战

4.1 单卡训练

配置完成后,用 tools/train.py 启动训练:

python tools/train.py configs/vision/mask-rcnn_r50_fpn_1x_cable.py --work-dir work_dirs/mask-rcnn_cable

常用参数:

参数说明
config训练配置文件路径(必填)
--work-dir日志与权重保存目录
--amp开启自动混合精度训练
--auto-scale-lr自动按 batch size 缩放学习率
--resume断点续训;指定 checkpoint 路径则从该权重恢复,不指定则自动从 work-dir 中最新权重恢复
--cfg-options命令行覆盖配置项,如--cfg-options model.roi_head.bbox_head.num_classes=5

4.2 多卡分布式训练

使用仓库自带的 tools/dist_train.sh:

bash tools/dist_train.sh configs/vision/mask-rcnn_r50_fpn_1x_cable.py 8

其中8为 GPU 数量;Slurm 集群用户可改用 tools/slurm_train.sh。

4.3 评测

用 tools/test.py 在验证集上评估:

python tools/test.py configs/vision/mask-rcnn_r50_fpn_1x_cable.py work_dirs/mask-rcnn_cable/best_coco_bbox_mAP_epoch_12.pth --out results.pkl

CocoMetric会输出bbox_mAPsegm_mAP等指标,多卡评测使用 tools/dist_test.sh。由于 VISION 数据集中推理划分的_annotations.coco.json不含标注,评测务必在val划分上进行。

4.4 推理与可视化

使用 demo/image_demo.py 进行单图推理:

python demo/image_demo.py data/VISION-Datasets/Cable/val/000001.png \ configs/vision/mask-rcnn_r50_fpn_1x_cable.py \ work_dirs/mask-rcnn_cable/best_coco_bbox_mAP_epoch_12.pth \ --pred-score-thr 0.3

若需要对测试划分(无标注)批量生成推理结果,可仿照 configs/base/datasets/coco_instance.py 末尾注释中的test_dataloader写法,将ann_file指向inference/_annotations.coco.json,并设置test_evaluator = dict(type='CocoMetric', metric=['bbox', 'segm'], format_only=True, outfile_prefix='./work_dirs/vision_inference/test'),此时不会计算指标,仅输出格式化结果文件。

五、源码级原理补充

5.1 数据加载链路

接入 VISION 数据集的整个数据流不需要任何自定义代码,链路如下:

  1. 配置文件中指定dataset_type='CocoDataset',注册器(DATASETS)从 mmdet/datasets/init.py 找到 CocoDataset 类;
  2. CocoDataset.load_data_list()读取_annotations.coco.json,通过COCOAPI(见 mmdet/datasets/api_wrappers)加载图像 id、标注 id 与类别映射,并校验标注 id 全局唯一(ANN_ID_UNIQUE = True);
  3. parse_data_info()根据data_prefix['img']拼接图像路径,并解析 bbox 与 mask 标注,送入训练/测试 pipeline;
  4. 训练时由train_pipeline中的LoadImageFromFileLoadAnnotationswith_bbox=True, with_mask=True)等完成读取与增强(详见 mmdet/datasets/transforms)。

5.2 评测链路

CocoMetric使用验证集标注计算bbox/segm指标,底层调用 COCO API 的评估逻辑;当format_only=True时不计算指标而只导出结果 JSON,适用于无标注的 inference 划分。

六、多子集扩展:如何批量训练全部 14 个子集

VISION 包含 14 个子数据集,若需要逐个训练,最直接的做法是为每个子集复制一份配置文件,仅修改data_rootann_filedata_prefixnum_classes。也可以利用--cfg-options复用同一个模板配置,例如:

python tools/train.py configs/vision/mask-rcnn_r50_fpn_1x_vision.py \ --cfg-options data_root=data/VISION-Datasets/PCB_1/ \ model.roi_head.bbox_head.num_classes=10 \ model.roi_head.mask_head.num_classes=10 \ --work-dir work_dirs/mask-rcnn_pcb1

说明:data_root修改后,ann_file='train/_annotations.coco.json'data_prefix=dict(img='train/')的相对定位依然成立;各子集类别数以各自_annotations.coco.json为准,训练前请务必核对并覆盖num_classes

七、引用

若你在论文或报告中使用了 VISION Datasets,请按 README 中给出的 BibTeX 引用:

@article{vision-datasets, title = {VISION Datasets: A Benchmark for Vision-based InduStrial InspectiON}, author = {Haoping Bai, Shancong Mou, Tatiana Likhomanenko, Ramazan Gokberk Cinbis, Oncel Tuzel, Ping Huang, Jiulong Shan, Jianjun Shi, Meng Cao}, journal = {arXiv preprint arXiv:2306.07890}, year = {2023}, }

八、参考资源

  • 数据集接入说明:projects/VISION-Datasets/README.md(另见 projects/VISION-Datasets/README_zh-CN.md 中文版)
  • 数据集支持引入记录:docs/en/notes/changelog.md
  • COCO 数据集实现:mmdet/datasets/coco.py
  • 官方 COCO 实例分割配置:configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py、configs/base/datasets/coco_instance.py
  • Mask R-CNN 模型配置:configs/base/models/mask-rcnn_r50_fpn.py
  • 训练/评测/推理脚本:tools/train.py、tools/test.py、tools/dist_train.sh、tools/dist_test.sh、demo/image_demo.py

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 3:24:59

大数据迁移工具选型指南:从场景分类到POC落地的六个核心维度

1. 企业大数据迁移的选型困局&#xff1a;为什么你总是选错工具干了十多年数据工程&#xff0c;我参与过的大数据迁移项目少说也有几十个。从早期传统数仓的ETL抽数&#xff0c;到后来Hadoop生态整体搬迁&#xff0c;再到近几年国产化替代背景下的异构数据库迁移&#xff0c;踩…

作者头像 李华
网站建设 2026/9/20 3:24:43

从编译器基础设施到LLVM:架构解析与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 3:22:29

2026年AI编程工具五大流派与33款主流工具选型指南

2026年一开年&#xff0c;团队里好几个同事都在问同一个问题&#xff1a;现在AI编程工具这么多&#xff0c;到底该用哪个&#xff1f;我把自己正在用、试用过、以及明确观察到的33个主流工具拢在一起&#xff0c;按使用场景分成几大类&#xff0c;整理成了一份可以直接抄作业的…

作者头像 李华
网站建设 2026/9/20 3:19:41

TortoiseSVN安装配置与使用教程:从下载汉化到冲突处理

1. 为什么版本控制工具值得你花十分钟装好如果你写过代码、改过文档、做过设计稿&#xff0c;大概率遇到过这种场景&#xff1a;改到第三版的时候突然发现第一版的思路更好&#xff0c;但原文件已经被覆盖了&#xff1b;或者几个人协作同一个项目&#xff0c;你改你的我改我的&…

作者头像 李华