mmDetection 实战:Faster R-CNN 自定义数据集训练全流程解析
1. 环境准备与问题排查
在开始使用mmDetection训练Faster R-CNN之前,我们需要先解决一些环境配置的常见问题。很多新手在第一次运行时都会遇到OMP报错,这个问题其实和你的操作系统环境变量有关。我自己的Windows电脑就经常出现这个情况,解决方法很简单:
import os os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"把这行代码加在train.py和test.py文件的开头就能解决问题。不过要注意,这不是mmDetection的问题,而是OpenMP库在Windows下的特殊表现。如果你用的是Linux系统,可能完全不会遇到这个报错。
关于mmDetection的安装,官方文档已经写得很清楚了,但有几个容易踩坑的地方:
- PyTorch版本要严格匹配CUDA版本
- mmcv-full必须安装与mmdetection兼容的版本
- 建议使用conda创建虚拟环境
我建议先用以下命令检查基础环境:
nvidia-smi # 查看GPU状态 python -c "import torch; print(torch.__version__)" # 检查PyTorch版本 python -c "import mmcv; print(mmcv.__version__)" # 检查mmcv版本2. 配置文件生成与管理
2.1 配置文件的选择策略
mmDetection的配置文件都在configs目录下,对于Faster R-CNN,我们通常会选择faster-rcnn_r50_fpn_1x_coco.py作为基础配置。这里有个重要建议:永远不要直接修改原始配置文件!我见过太多人直接在原文件上修改,结果把项目搞得一团糟。
正确的做法是通过运行生成新的配置文件。虽然第一次运行会因为缺少数据集而报错,但会在work_dirs下生成完整的配置文件副本。这样做有两个好处:
- 保留原始配置作为参考
- 方便版本控制和管理
2.2 两种运行方式详解
终端运行方式最灵活,适合需要频繁调整参数的情况:
python ./tools/train.py ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.pyIDE运行配置更适合调试阶段。以PyCharm为例:
- 右键train.py选择"修改运行配置"
- 在"形参"中输入配置文件路径
- 设置"运行目录"为mmDetection根目录
- 点击应用后即可通过运行按钮启动
无论哪种方式,运行后都会在work_dirs下生成类似faster-rcnn_r50_fpn_1x_coco/20240621_115125这样的目录,里面包含新的配置文件和日志。
3. 自定义数据集处理
3.1 数据集目录结构规范
为了最小化配置修改,建议完全遵循COCO数据集的目录结构:
mmdetection/ ├── data/ │ ├── coco/ │ │ ├── annotations/ │ │ │ ├── instances_train2017.json │ │ │ ├── instances_val2017.json │ │ │ └── instances_test2017.json │ │ ├── train2017/ # 训练集图片 │ │ ├── val2017/ # 验证集图片 │ │ └── test2017/ # 测试集图片这种结构可以避免修改配置文件中的数据集路径。我建议使用软链接(ln -s)来映射实际数据位置,而不是复制文件。
3.2 标注文件转换技巧
如果你的数据不是COCO格式,可以使用以下Python代码进行转换:
from pycocotools.coco import COCO import json # 自定义格式转COCO格式的示例 def convert_to_coco(original_anns): coco_anns = { "info": {...}, "licenses": [...], "categories": [...], "images": [...], "annotations": [...] } # 具体转换逻辑根据原始格式实现 return coco_anns对于小规模数据集,也可以使用labelme2coco.py这样的现成工具。
4. 关键配置修改
4.1 类别定义修改
需要修改两个关键文件:
mmdet/datasets/coco.py:替换默认的COCO类别和调色板mmdet/evaluation/functional/class_names.py:修改评估时使用的类别名称
建议使用IDE的全局搜索功能,确保所有出现COCO类别的地方都被替换。我曾经因为漏改一处导致评估结果完全错误。
4.2 配置文件调整
在新生成的配置文件中,主要修改三个地方:
num_classes:改为你的实际类别数data字典中的img_scale:根据你的图片尺寸调整optimizer配置:学习率等超参数
对于显存小的设备,可以这样调整:
# 减小batch_size data = dict( samples_per_gpu=1, # 原值通常是2或4 workers_per_gpu=1 ) # 减少训练轮次 runner = dict(max_epochs=3) # 原值可能是12或205. 训练与测试实战
5.1 训练过程监控
启动训练的命令很简单:
python tools/train.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py训练过程中可以:
- 使用
tail -f work_dirs/*/202*/log.txt实时查看日志 - 通过TensorBoard监控损失曲线
- 观察GPU使用情况(nvidia-smi -l 1)
如果遇到显存不足,可以尝试:
- 减小
img_scale - 使用梯度累积
- 启用AMP自动混合精度
5.2 模型测试与可视化
测试命令示例:
python tools/test.py \ work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py \ work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_3.pth \ --show-dir results \ --eval bbox关键参数说明:
--show-dir:指定可视化结果保存目录--eval:指定评估指标(bbox, segm等)--options:可以覆盖配置中的参数
测试完成后,建议使用mmdet/utils/analysis_tools/analyze_results.py对预测结果进行详细分析。
6. 常见问题排查
在实际项目中,我遇到过各种奇怪的问题,这里分享几个典型案例:
问题1:训练时loss不下降
- 检查学习率是否合理
- 确认数据标注是否正确加载
- 验证数据增强是否过度
问题2:测试时AP为0
- 检查类别名称是否完全匹配
- 确认测试集标注路径正确
- 验证模型是否真的学到了特征
问题3:CUDA out of memory
- 减小batch_size
- 降低输入图像分辨率
- 尝试使用--auto-scale-lr自动调整学习率
对于更复杂的问题,建议查阅mmDetection的issue区,很多问题都有现成的解决方案。记住,深度学习训练就是个不断试错的过程,重要的是保持耐心,系统性地排查问题。
