mmdetection

本文详细介绍了如何在MMDetection3.3.0中安装环境,以及如何按照步骤训练VOC和COCO数据集,包括配置修改、解决batchsize、学习率、GPU内存溢出和数据格式问题。还提供了常见问题的解答,如训练loss为nan的处理方法。
摘要由CSDN通过智能技术生成

安装和测试:

GET STARTED — MMDetection 3.3.0 documentation

mmdetection从配置到训练_openmim-CSDN博客

训练voc数据集:

mmdetection训练自己的VOC数据集及常见问题_mmdetection训练voc数据集-CSDN博客

训练自己的COCO数据集及常见问题见下文:

mmdetection训练自己的COCO数据集及常见问题_不瘦8斤的妥球球饼的博客-CSDN博客

目录

一、环境安装

二、训练测试步骤

三、常见问题

batch size设置

学习率和epoch的修改

训练过程loss为nan的问题

GPU out of memory

如果自己的voc数据集图片是 png/tif 文件

训练生成的.pth文件占用较大内存

一、环境安装
代码:GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark

官方安装教程:Prerequisites — MMDetection 2.23.0 documentation

或者mmdetection/get_started.md at master · open-mmlab/mmdetection · GitHub

二、训练测试步骤
步骤一:准备数据。首先根据规范的VOC数据集导入到项目目录下,如下所示:

 VOC数据集格式介绍_不瘦8斤的妥球球饼的博客-CSDN博客_voc格式

mmdetection
├── mmdet
├── tools
├── configs
├── data
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   │   ├── Annotations
│   │   │   ├── JPEGImages
│   │   │   ├── ImageSets
│   │   │   │   ├── Main
│   │   │   │   │   ├── test.txt
│   │   │   │   │   ├── trainval.txt
推荐以软连接的方式创建:

cd mmdetection
mkdir data
ln -s $VOC2007_ROOT data/VOCdevkit
其中,$VOC2007_ROOT需改为你的VOC2007数据集根目录。

步骤二:修改config.py

在configs文件夹中选择自己要训练的config文件,例如:faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py

选好后,打开可以看到faster_rcnn_r50_fpn_1x_coco.py的基础配置如下:

下需要修改前两个文件(如红框所示):

1. 退到上级目录找到_base_,找到faster_rcnn_r50_fpn.py,修改原VOC类的数目:

2. (1)把‘../_base_/datasets/coco_detection.py’修改为‘../_base_/datasets/voc0712.py’

(2)datesets中VOC0712.py,修改成你的数据源:

 步骤三:修改mmdetection/mmdet/datasets目录下voc.py

修改CLASSES成自己的类别数,如果是一个类别,需要写成CLASSES = ('person',)【需要加一个逗号】,否则会出现 “AssertionError: CLASSES in RepeatDatasetshould be a tuple of str.Add comma if number of classes is 1 as CLASSES = (person,)” 的错误。

步骤四:修改mmdetection/mmdet/core/evaluation目录下class_names.py

步骤五:运行python setup.py install,重新编译

步骤六:运行训练代码

1. 使用单个GPU进行训练

python ./tools/train.py ${CONFIG_FILE} [optional arguments]
python ./tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn.py  --work_dir models
2.使用多个GPU进行训练

./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]
./tools/dist_train.sh  configs/faster_rcnn/faster_rcnn_r50_fpn.py
[optional arguments]  可选参数

--no-validate  : 不建议使用,代码中每隔K(默认为1)执行评估,可以在configs/_base_/datasets/voc0712.py 修改evaluation = dict(interval=1, metric='mAP')

--work-dir ${WORK_DIR}   覆盖配置文件中指定的工作目录

--resume-from ${CHECKPOINT_FILE}   程序中断后继续训练,从先前的检查点文件恢复

--options 'Key=value'   :  在使用的配置中覆盖一些设置。

步骤七:测试:

# single-gpu testing
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] [--show]
三、常见问题
batch size设置


学习率和epoch的修改


重要:配置文件中的默认学习率(lr=0.02)是8个GPU和samples_per_gpu=2(批大小= 8 * 2 = 16)。根据线性缩放规则,如果您使用不同的GPU或每个GPU的有多少张图像,则需要按批大小设置学习率,例如,对于4GPU* 2 img / gpu=8,lr =8/16 * 0.02 = 0.01 ;对于16GPU* 4 img / gpu=64,lr =64/16 *0.02 = 0.08 。

计算公式:lr = (gpu_num * samples_per_gpu) / 16 * 0.02

训练过程loss为nan的问题
常见问题解答 — MMDetection 2.23.0 文档

1.检查数据的标注是否正常

长或宽为 0 的框可能会导致回归 loss 变为 nan,一些小尺寸(宽度或高度小于 1)的框在数据增强(例如,instaboost)后也会导致此问题。 因此,可以检查标注并过滤掉那些特别小甚至面积为 0 的框,并关闭一些可能会导致 0 面积框出现数据增强。

2.降低学习率

一般出现loss nan,无非是网络传输的梯度过大导致的,所以首先考虑在模型配置schedule_1x.py里减小模型的学习率。可是学习率调小100倍甚至10000倍,还出现nan的情况,所以考虑其他原因导致。先排除学习率的影响,将学习率设为0,loss依旧nan,然后就可以尝试下一个了。

3.延长 warm up 的时间

一些模型在训练初始时对学习率很敏感,可以在模型配置schedule_1x.py里把 warmup_iters 从 500 更改为 1000 或 2000。

4.梯度裁剪

一些模型需要梯度裁剪来稳定训练过程。 默认的 grad_clip 是 None, 你可以在模型配置schedule_1x.py里设置 optimizer_config=dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) 如果你的 config 没有继承任何包含 optimizer_config=dict(grad_clip=None), 你可以直接设置optimizer_config=dict(grad_clip=dict(max_norm=35, norm_type=2))。

5.不使用fp16训练

如果用了fp16训练,可尝试将其注释掉。

# fp16 = dict(loss_scale=512.)
GPU out of memory
常见问题解答 — MMDetection 2.23.0 文档

存在大量 ground truth boxes 或者大量 anchor 的场景,可能在 assigner 会 OOM。 您可以在 assigner 的配置中设置 gpu_assign_thr=N,这样当超过 N 个 GT boxes 时,assigner 会通过 CPU 计算 IOU。

在 backbone 中设置 with_cp=True。 这使用 PyTorch 中的 sublinear strategy 来降低 backbone 占用的 GPU 显存。

使用 config/fp16 中的示例尝试混合精度训练。loss_scale 可能需要针对不同模型进行调整。

如果自己的voc数据集图片是 png/tif 文件
在/mmdet/datasets/xml_style.py 51行.jpg 可以改为.png/.tif。

训练生成的.pth文件占用较大内存

#保存模型
可修改configs/base/default_runtime.py文件中:

checkpoint_config = dict(interval=10) # interval=10 表示10个epoch保存一次
 

# 保存最优模型:

checkpoint=dict(
    type="CheckpointHook",
    interval=50,
    #save_best="coco/bbox_mAP",#行不通
    save_best="auto",
    rule="greater"
),

train:

python ./tools/train.py /home/xumin/mmdetection/configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py  --work-dir models

Test:

python ./tools/test.py /home/xumin/mmdetection/configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py /home/xumin/mmdetection/models/faster-rcnn/best_pascal_voc_mAP_epoch_73.pth --out=eval/result.pkl

Sing image test:

python demo/image_demo.py /home/xumin/mmdetection/data/VOCdevkit/VOC2007/JPEGImages/IMG_36_3.jpg /home/xumin/mmdetection/configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py --weights /home/xumin/mmdetection/models/faster-rcnn/best_pascal_voc_mAP_epoch_73.pth

mmdetction-cascade_rcnn

参考:使用mmdetction-cascade_rcnn用自己数据训练并测试_data_time: 0.011, loss_rpn_cls: 0.0139, loss_rpn_b-CSDN博客

python ./tools/train.py /home/xumin/mmdetection/configs/cascade_rcnn/cascade-rcnn_r50_fpn_1x_coco.py  --work-dir models

mmdetction-RetinaNet

训练出现nan
在使用MMDetection训练模型时,发现打印信息中出现了很多nan。现象是,loss在正常训练下降的过程中,突然变为nan。

梯度裁减
在模型配置中加上grad_clip:

optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
 

/home/xumin/mmdetection/configs/_base_/schedules/schedule_1x.py

# optimizer
#optim_wrapper = dict(
    #type='OptimWrapper',
    #optimizer=dict(type='SGD', lr=0.01, momentum=0.937, weight_decay=0.0005))

#For RetinaNet(prevent loss=nan)
optim_wrapper = dict(
    type='OptimWrapper',
    optimizer=dict(type='SGD', lr=0.01, momentum=0.937, weight_decay=0.0005),clip_grad=dict(max_norm=35, norm_type=2))

降低学习率
如果添加了梯度裁剪依旧出现梯度爆炸的问题。那么可以考虑降低学习率,大约降低为原来的0.1即可。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值