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

资讯详情

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

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

MMDetection 使用 VISION-Datasets 训练工业缺陷检测模型:数据集准备、COCO 配置与实战指南 MMDetection 使用 VISION-Datasets 训练工业缺陷检测模型数据集准备、COCO 配置与实战指南【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetectionVISION 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 为什么适合接入 MMDetectionMMDetection 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.md2.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_file与data_prefix直接定位。三、在 MMDetection 中配置 VISION 数据集以 Mask R-CNN 为例VISION 数据以 COCO 格式组织因此直接复用 MMDetection 的CocoDataset与CocoMetric。下面以实例分割任务为例从基础配置出发给出完整接入方法。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(typeLoadImageFromFile, backend_argsNone), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict(typeResize, scale(1333, 800), keep_ratioTrue), dict(typeRandomFlip, prob0.5), dict(typePackDetInputs) ] test_pipeline [ dict(typeLoadImageFromFile, backend_argsNone), dict(typeResize, scale(1333, 800), keep_ratioTrue), # 若没有 GT 标注删除下面这行 dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict( typePackDetInputs, meta_keys(img_id, img_path, ori_shape, img_shape, scale_factor)) ] train_dataloader dict( batch_size2, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), batch_samplerdict(typeAspectRatioBatchSampler), datasetdict( typedataset_type, data_rootdata_root, ann_filetrain/_annotations.coco.json, data_prefixdict(imgtrain/), filter_cfgdict(filter_empty_gtTrue, min_size32), pipelinetrain_pipeline, backend_argsNone)) val_dataloader dict( batch_size1, num_workers2, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse), datasetdict( typedataset_type, data_rootdata_root, ann_fileval/_annotations.coco.json, data_prefixdict(imgval/), test_modeTrue, pipelinetest_pipeline, backend_argsNone)) test_dataloader val_dataloader val_evaluator dict( typeCocoMetric, ann_filedata_root val/_annotations.coco.json, metric[bbox, segm], format_onlyFalse, backend_argsNone) test_evaluator val_evaluator3.2 关键配置项说明dataset_type CocoDatasetVISION 的标注为 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_file与data_prefix因为标注文件与图像位于同一子目录如train/ann_filetrain/_annotations.coco.json、data_prefixdict(imgtrain/)即可完成定位。这与 COCO 官方布局annotations/instances_train2017.jsontrain2017/略有差异但CocoDataset.parse_data_info()会通过data_prefix[img]拼接图像路径两种布局均可正常解析。metric[bbox, segm]CocoMetric同时输出框bbox与掩码segm指标对应 VISION 数据集的缺陷检测 实例分割双任务能力若只做检测可改为metric[bbox]。filter_cfgdict(filter_empty_gtTrue, min_size32)过滤掉没有 GT 或尺寸过小的样本避免空标注干扰训练。3.3 关于类别数与模型头VISION 数据集共包含 44 类缺陷但并非每个子集都包含全部类别。子集标注中的类别即该子集的缺陷类别集合。因此在使用 COCO 预训练权重微调时需要将模型头中的num_classes改为目标子集的真实缺陷类别数。以 Mask R-CNN 为例基础配置 configs/base/models/mask-rcnn_r50_fpn.py 中bbox_head的num_classes80COCO 类别数接入 VISION 时应在你的新配置中通过model字段覆盖为对应子集的类别数例如model dict( roi_headdict( bbox_headdict(num_classes你的子集缺陷类别数), mask_headdict(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_classes54.2 多卡分布式训练使用仓库自带的 tools/dist_train.shbash 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.pklCocoMetric会输出bbox_mAP、segm_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(typeCocoMetric, metric[bbox, segm], format_onlyTrue, outfile_prefix./work_dirs/vision_inference/test)此时不会计算指标仅输出格式化结果文件。五、源码级原理补充5.1 数据加载链路接入 VISION 数据集的整个数据流不需要任何自定义代码链路如下配置文件中指定dataset_typeCocoDataset注册器DATASETS从 mmdet/datasets/init.py 找到 CocoDataset 类CocoDataset.load_data_list()读取_annotations.coco.json通过COCOAPI见 mmdet/datasets/api_wrappers加载图像 id、标注 id 与类别映射并校验标注 id 全局唯一ANN_ID_UNIQUE Trueparse_data_info()根据data_prefix[img]拼接图像路径并解析 bbox 与 mask 标注送入训练/测试 pipeline训练时由train_pipeline中的LoadImageFromFile、LoadAnnotationswith_bboxTrue, with_maskTrue等完成读取与增强详见 mmdet/datasets/transforms。5.2 评测链路CocoMetric使用验证集标注计算bbox/segm指标底层调用 COCO API 的评估逻辑当format_onlyTrue时不计算指标而只导出结果 JSON适用于无标注的 inference 划分。六、多子集扩展如何批量训练全部 14 个子集VISION 包含 14 个子数据集若需要逐个训练最直接的做法是为每个子集复制一份配置文件仅修改data_root、ann_file、data_prefix与num_classes。也可以利用--cfg-options复用同一个模板配置例如python tools/train.py configs/vision/mask-rcnn_r50_fpn_1x_vision.py \ --cfg-options data_rootdata/VISION-Datasets/PCB_1/ \ model.roi_head.bbox_head.num_classes10 \ model.roi_head.mask_head.num_classes10 \ --work-dir work_dirs/mask-rcnn_pcb1说明data_root修改后ann_filetrain/_annotations.coco.json与data_prefixdict(imgtrain/)的相对定位依然成立各子集类别数以各自_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.mdCOCO 数据集实现mmdet/datasets/coco.py官方 COCO 实例分割配置configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py、configs/base/datasets/coco_instance.pyMask 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),仅供参考
返回列表