mmdetection实战:从零开始构建自定义数据集训练流程

张开发
2026/5/30 18:06:15 15 分钟阅读
mmdetection实战:从零开始构建自定义数据集训练流程
1. 数据准备构建自定义数据集的完整流程第一次用mmdetection训练自己的数据集时最让我头疼的就是数据格式转换。官方文档虽然提供了COCO和VOC两种标准格式的说明但实际项目中我们拿到的往往是杂乱无章的原始图片。经过三个实际项目的踩坑经验我总结出这套小白也能快速上手的标准化流程。首先需要明确的是mmdetection支持的数据目录结构不是随便创建的。以VOC格式为例正确的目录树应该是这样的mmdetection └── data └── VOCdevkit └── VOC2007 ├── Annotations # 存放XML标注文件 ├── ImageSets │ └── Main # 存放train.txt/val.txt等划分文件 └── JPEGImages # 存放所有原始图片实际操作时最容易出错的是标注文件生成环节。假设你已经有了一批用LabelImg标注的图片建议先用这个Python脚本批量检查XML文件完整性import xml.etree.ElementTree as ET import os def validate_xml(xml_path): try: tree ET.parse(xml_path) root tree.getroot() assert root.tag annotation return True except Exception as e: print(fInvalid XML: {xml_path} - {str(e)}) return False annotations_dir mmdetection/data/VOCdevkit/VOC2007/Annotations for xml_file in os.listdir(annotations_dir): validate_xml(os.path.join(annotations_dir, xml_file))数据集划分同样有讲究。我习惯用sklearn的train_test_split来确保各类别分布均衡from sklearn.model_selection import train_test_split all_images [f.split(.)[0] for f in os.listdir(JPEGImages)] train_val, test train_test_split(all_images, test_size0.1, random_state42) train, val train_test_split(train_val, test_size0.1, random_state42) def write_to_txt(filepath, data): with open(filepath, w) as f: f.write(\n.join(data)) write_to_txt(ImageSets/Main/train.txt, train) write_to_txt(ImageSets/Main/val.txt, val) write_to_txt(ImageSets/Main/test.txt, test)2. 环境配置避坑指南与效能优化很多教程只告诉你要安装mmcv-full但没说明版本匹配的玄学问题。经过多次验证我整理出这个版本对应关系表Torch版本CUDA版本推荐MMCV-full版本1.6.010.21.3.01.7.011.01.3.11.8.011.11.4.0安装时强烈建议使用预编译版本编译过程经常会出现各种神奇报错。这是我验证过的稳定安装命令pip install mmcv-full1.3.0 -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/index.html源码编译环节有个隐藏坑点某些Linux发行版默认的GCC版本过低。这是我总结的解决方案# CentOS系统 sudo yum install centos-release-scl sudo yum install devtoolset-8 scl enable devtoolset-8 bash # Ubuntu系统 sudo apt-get install gcc-5 g-5 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 603. 配置文件修改关键参数详解第一次看到mmdetection的配置文件时我完全被嵌套结构搞晕了。其实核心需要修改的就几个关键位置首先是数据集配置文件voc0712.py这几个参数直接影响训练效果img_norm_cfg dict( mean[123.675, 116.28, 103.53], # 建议改成自己数据集的RGB均值 std[58.395, 57.12, 57.375], # 建议改成自己数据集的RGB标准差 to_rgbTrue) train_pipeline [ dict(typeResize, img_scale(1333, 800), keep_ratioTrue), # 根据GPU显存调整 dict(typeRandomFlip, flip_ratio0.5), # 数据增强概率 ]模型配置文件如faster_rcnn_r50_fpn.py中这两个参数最容易被忽略model dict( roi_headdict( bbox_headdict( num_classes20, # 必须改成自己的类别数 reg_decoded_bboxTrue))) # 使用GIoU时需要设为True学习率设置需要根据batch_size动态调整我的经验公式是基础学习率 0.02 * (实际batch_size / 16)4. 训练与调试实用技巧分享启动训练后90%的问题都出在数据加载阶段。这个调试命令可以提前发现问题python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --validate --work-dir work_dirs/debug训练过程中这几个信号需要特别注意Loss曲线震荡剧烈 → 尝试降低学习率mAP波动大 → 检查数据标注质量GPU利用率低 → 调整workers_per_gpu参数可视化分析推荐使用mmdet自带的日志解析工具python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/xxx/xxx.log --keys loss_cls loss_bbox --out losses.png模型测试时这个技巧可以提升推理速度cfg mmcv.Config.fromfile(config_file) cfg.model.test_cfg.rcnn.score_thr 0.3 # 调高阈值加速推理

更多文章