从零构建目标检测模型OpenMMLab实战指南与数据集制作全流程当你第一次成功运行OpenMMLab的Demo时那种成就感可能很快会被新的困惑取代——如何让这套强大的工具识别你自己的数据本文将带你跨越从跑通示例到训练自定义模型的关键鸿沟。不同于大多数教程停留在环境配置阶段我们直接切入工业界最关心的实战环节数据准备、模型训练与调优全流程。1. 数据准备构建高质量检测数据集目标检测模型的性能上限往往由数据质量决定。在MMDetection框架中支持COCO和VOC两种主流格式我们以更灵活的COCO格式为例详解数据集制作要点。1.1 数据标注规范与工具选型LabelImg和CVAT是两种常用的标注工具但对于团队协作项目推荐使用支持在线协作的CVAT。标注时需特别注意类别定义采用树状结构组织类别如vehicle/car,vehicle/truck标注密度每个目标实例至少需要15-20个样本负样本保留5%不含目标的图像作为负样本# 安装CVAT标注工具 docker-compose -f docker-compose.yml -f components/analytics/docker-compose.analytics.yml up -d1.2 COCO格式深度解析完整的COCO数据集包含以下核心JSON字段{ images: [{id: 1, width: 800, height: 600, file_name: 001.jpg}], annotations: [{ id: 1, image_id: 1, category_id: 1, bbox: [x,y,width,height], area: width*height, iscrowd: 0 }], categories: [{id: 1, name: car}] }关键转换脚本示例Pascal VOC转COCOfrom xml.etree import ElementTree as ET import json def voc_to_coco(voc_ann_dir, output_path): coco {images: [], annotations: [], categories: []} # 实现细节省略... with open(output_path, w) as f: json.dump(coco, f)注意bbox格式为[x_top_left, y_top_left, width, height]不是对角坐标1.3 数据集划分策略推荐的数据集划分比例数据子集比例用途train70%模型训练val15%超参调优test15%最终评估使用scikit-learn实现自动划分from sklearn.model_selection import train_test_split image_ids list(annotations.keys()) train_ids, test_ids train_test_split(image_ids, test_size0.3) val_ids, test_ids train_test_split(test_ids, test_size0.5)2. 模型配置定制化训练方案MMDetection采用模块化设计通过配置文件组合不同组件。以Faster R-CNN为例详解关键配置项。2.1 基础配置继承机制_base_ [ ../_base_/models/faster_rcnn_r50_fpn.py, # 模型架构 ../_base_/datasets/coco_detection.py, # 数据加载 ../_base_/schedules/schedule_1x.py, # 训练策略 ../_base_/default_runtime.py # 运行时配置 ]通过继承机制可快速修改特定组件# 修改分类头类别数 model dict( roi_headdict( bbox_headdict(num_classes10)))2.2 数据管道优化标准数据处理流程包含以下阶段数据加载随机增强翻转、裁剪等归一化均值/标准差调整格式转换to tensor示例配置train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations, with_bboxTrue), dict(typeRandomFlip, flip_ratio0.5), dict(typeNormalize, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375]), dict(typePad, size_divisor32), dict(typeDefaultFormatBundle), dict(typeCollect, keys[img, gt_bboxes, gt_labels]) ]2.3 训练策略调优不同规模数据集的推荐配置数据量学习率Batch Size训练轮次1k0.002220-301k-10k0.01840-6010k0.021680-120学习率预热配置示例lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[8, 11])3. 模型训练与监控3.1 分布式训练启动单机多卡训练命令./tools/dist_train.sh configs/faster_rcnn_r50_fpn_1x_coco.py 4 --work-dir work_dirs/exp1关键参数说明4使用的GPU数量--work-dir日志和模型保存路径3.2 训练过程监控MMDetection集成多种可视化工具日志解析python tools/analysis_tools/analyze_logs.py plot_curve log.json --keys loss_cls loss_bbox --out losses.pngTensorBoard支持log_config dict( interval50, hooks[ dict(typeTextLoggerHook), dict(typeTensorboardLoggerHook) ])验证集评估./tools/dist_test.sh configs/faster_rcnn_r50_fpn_1x_coco.py work_dirs/exp1/latest.pth 4 --eval bbox3.3 常见问题排查训练初期异常情况处理指南现象可能原因解决方案Loss值为NaN学习率过高降低10倍学习率mAP始终为0类别ID错误检查annotations的category_id显存溢出Batch Size过大减小batch_size或使用梯度累积4. 模型部署与优化4.1 模型导出与推理将训练好的模型转换为ONNX格式from mmdet.apis import init_detector, export_model config_file configs/faster_rcnn_r50_fpn_1x_coco.py checkpoint_file work_dirs/exp1/latest.pth export_model(config_file, checkpoint_file, faster_rcnn.onnx)Python推理API示例from mmdet.apis import init_detector, inference_detector model init_detector(config.py, model.pth, devicecuda:0) result inference_detector(model, test.jpg)4.2 模型量化加速使用TensorRT进行FP16量化from mmdet.apis import create_trt_model trt_model create_trt_model( faster_rcnn.onnx, faster_rcnn.trt, fp16_modeTrue, max_workspace_size1 30)4.3 性能优化技巧不同场景下的模型选择建议场景需求推荐模型推理速度(FPS)mAP实时检测YOLOv34533.7高精度Cascade R-CNN1242.8移动端SSD6025.1实际项目中我们发现在工业质检场景下适当调整Faster R-CNN的RPN参数如anchor_scales[4,8,16]可以提升小目标检测效果约15%。
从Demo到实战:手把手教你用OpenMMLab的MMDetection训练自己的第一个目标检测模型(附数据集制作)
从零构建目标检测模型OpenMMLab实战指南与数据集制作全流程当你第一次成功运行OpenMMLab的Demo时那种成就感可能很快会被新的困惑取代——如何让这套强大的工具识别你自己的数据本文将带你跨越从跑通示例到训练自定义模型的关键鸿沟。不同于大多数教程停留在环境配置阶段我们直接切入工业界最关心的实战环节数据准备、模型训练与调优全流程。1. 数据准备构建高质量检测数据集目标检测模型的性能上限往往由数据质量决定。在MMDetection框架中支持COCO和VOC两种主流格式我们以更灵活的COCO格式为例详解数据集制作要点。1.1 数据标注规范与工具选型LabelImg和CVAT是两种常用的标注工具但对于团队协作项目推荐使用支持在线协作的CVAT。标注时需特别注意类别定义采用树状结构组织类别如vehicle/car,vehicle/truck标注密度每个目标实例至少需要15-20个样本负样本保留5%不含目标的图像作为负样本# 安装CVAT标注工具 docker-compose -f docker-compose.yml -f components/analytics/docker-compose.analytics.yml up -d1.2 COCO格式深度解析完整的COCO数据集包含以下核心JSON字段{ images: [{id: 1, width: 800, height: 600, file_name: 001.jpg}], annotations: [{ id: 1, image_id: 1, category_id: 1, bbox: [x,y,width,height], area: width*height, iscrowd: 0 }], categories: [{id: 1, name: car}] }关键转换脚本示例Pascal VOC转COCOfrom xml.etree import ElementTree as ET import json def voc_to_coco(voc_ann_dir, output_path): coco {images: [], annotations: [], categories: []} # 实现细节省略... with open(output_path, w) as f: json.dump(coco, f)注意bbox格式为[x_top_left, y_top_left, width, height]不是对角坐标1.3 数据集划分策略推荐的数据集划分比例数据子集比例用途train70%模型训练val15%超参调优test15%最终评估使用scikit-learn实现自动划分from sklearn.model_selection import train_test_split image_ids list(annotations.keys()) train_ids, test_ids train_test_split(image_ids, test_size0.3) val_ids, test_ids train_test_split(test_ids, test_size0.5)2. 模型配置定制化训练方案MMDetection采用模块化设计通过配置文件组合不同组件。以Faster R-CNN为例详解关键配置项。2.1 基础配置继承机制_base_ [ ../_base_/models/faster_rcnn_r50_fpn.py, # 模型架构 ../_base_/datasets/coco_detection.py, # 数据加载 ../_base_/schedules/schedule_1x.py, # 训练策略 ../_base_/default_runtime.py # 运行时配置 ]通过继承机制可快速修改特定组件# 修改分类头类别数 model dict( roi_headdict( bbox_headdict(num_classes10)))2.2 数据管道优化标准数据处理流程包含以下阶段数据加载随机增强翻转、裁剪等归一化均值/标准差调整格式转换to tensor示例配置train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations, with_bboxTrue), dict(typeRandomFlip, flip_ratio0.5), dict(typeNormalize, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375]), dict(typePad, size_divisor32), dict(typeDefaultFormatBundle), dict(typeCollect, keys[img, gt_bboxes, gt_labels]) ]2.3 训练策略调优不同规模数据集的推荐配置数据量学习率Batch Size训练轮次1k0.002220-301k-10k0.01840-6010k0.021680-120学习率预热配置示例lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[8, 11])3. 模型训练与监控3.1 分布式训练启动单机多卡训练命令./tools/dist_train.sh configs/faster_rcnn_r50_fpn_1x_coco.py 4 --work-dir work_dirs/exp1关键参数说明4使用的GPU数量--work-dir日志和模型保存路径3.2 训练过程监控MMDetection集成多种可视化工具日志解析python tools/analysis_tools/analyze_logs.py plot_curve log.json --keys loss_cls loss_bbox --out losses.pngTensorBoard支持log_config dict( interval50, hooks[ dict(typeTextLoggerHook), dict(typeTensorboardLoggerHook) ])验证集评估./tools/dist_test.sh configs/faster_rcnn_r50_fpn_1x_coco.py work_dirs/exp1/latest.pth 4 --eval bbox3.3 常见问题排查训练初期异常情况处理指南现象可能原因解决方案Loss值为NaN学习率过高降低10倍学习率mAP始终为0类别ID错误检查annotations的category_id显存溢出Batch Size过大减小batch_size或使用梯度累积4. 模型部署与优化4.1 模型导出与推理将训练好的模型转换为ONNX格式from mmdet.apis import init_detector, export_model config_file configs/faster_rcnn_r50_fpn_1x_coco.py checkpoint_file work_dirs/exp1/latest.pth export_model(config_file, checkpoint_file, faster_rcnn.onnx)Python推理API示例from mmdet.apis import init_detector, inference_detector model init_detector(config.py, model.pth, devicecuda:0) result inference_detector(model, test.jpg)4.2 模型量化加速使用TensorRT进行FP16量化from mmdet.apis import create_trt_model trt_model create_trt_model( faster_rcnn.onnx, faster_rcnn.trt, fp16_modeTrue, max_workspace_size1 30)4.3 性能优化技巧不同场景下的模型选择建议场景需求推荐模型推理速度(FPS)mAP实时检测YOLOv34533.7高精度Cascade R-CNN1242.8移动端SSD6025.1实际项目中我们发现在工业质检场景下适当调整Faster R-CNN的RPN参数如anchor_scales[4,8,16]可以提升小目标检测效果约15%。