MMDetection | 如何在自定义数据集上进行训练

MMDetection

1. 配置文件

1.1 查看配置文件

python tools/misc/print_config.py PATHTOCONFIG

1.2 配置文件结构

​ 在config/_base_文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。许多方法,例如 Faster R-CNN、Mask R-CNN、Cascade R-CNN、RPN、SSD 能够很容易地构建出来。由 _base_ 下的组件组成的配置,被我们称为 原始配置(primitive)

​ 对于同一文件夹下的所有配置,推荐只有一个对应的原始配置文件。所有其他的配置文件都应该继承自这个原始配置文件。这样就能保证配置文件的最大继承深度为 3。

​ 为了便于理解,建议大家继承现有方法。例如,如果在 Faster R-CNN 的基础上做了一些修改,用户首先可以通过指定 _base_ = ../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py 来继承基础的 Faster R-CNN 结构,然后修改配置文件中的必要参数以完成继承。

2. 自定义数据集

将给大家的猫狗数据集(可联系博主无偿提供数据集)导入到根目录下的新建文件夹data下,注意要保持该COCO文件格式,否则会导致错误。

COCO 格式的 json 标注文件有三个必要的键:

  • images: 包含多个图片以及它们的信息的数组,例如 file_nameheightwidthid

  • annotations: 包含多个实例标注信息的数组。

  • categories: 包含多个类别名字和 ID 的数组。

2.1 为自定义数据集修改配置文件

​ 配置文件的修改涉及两个方面:

  • data 部分。需要在 data.traindata.valdata.test 中添加 classes
  • model 部分中的 num_classes。需要将默认值(COCO 数据集中为 80)修改为自定义数据集中的类别数(2)。

configs/my_custom_config.py 内容如下:

# 新的配置来自基础的配置以更好地说明需要修改的地方
_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py'

# 1. 数据集设定
dataset_type = 'CocoDataset'
classes = ('a', 'b', 'c', 'd', 'e')
data = dict(
    samples_per_gpu=2,
    workers_per_gpu=2,
    train=dict(
        type=dataset_type,
        # 将类别名字添加至 `classes` 字段中
        classes=classes,
        ann_file='path/to/your/train/annotation_data',
        img_prefix='path/to/your/train/image_data'),
    val=dict(
        type=dataset_type,
        # 将类别名字添加至 `classes` 字段中
        classes=classes,
        ann_file='path/to/your/val/annotation_data',
        img_prefix='path/to/your/val/image_data'),
    test=dict(
        type=dataset_type,
        # 将类别名字添加至 `classes` 字段中
        classes=classes,
        ann_file='path/to/your/test/annotation_data',
        img_prefix='path/to/your/test/image_data'))

# 2. 模型设置

# 将所有的 `num_classes` 默认值修改为5(原来为80)
model = dict(
    roi_head=dict(
        bbox_head=[
            dict(
                type='Shared2FCBBoxHead',
                # 将所有的 `num_classes` 默认值修改为 5(原来为 80)
                num_classes=5),
            dict(
                type='Shared2FCBBoxHead',
                # 将所有的 `num_classes` 默认值修改为 5(原来为 80)
                num_classes=5),
            dict(
                type='Shared2FCBBoxHead',
                # 将所有的 `num_classes` 默认值修改为 5(原来为 80)
                num_classes=5)],
    # 将所有的 `num_classes` 默认值修改为 5(原来为 80)
    mask_head=dict(num_classes=5)))

2.2 检查自定义数据集的标注

​ 我们的数据集是 COCO 格式,也可以通过以下方式检查数据的标注没有问题:

  • 标注文件中 categories 的长度要与配置中的 classes 元组长度相匹配,它们都表示有几类。(如例子中有 2个类别)
  • 配置文件中 classes 字段应与标注文件里 categories 下的 name 有相同的元素且顺序一致。MMDetection 会自动将 categories 中不连续的 id 映射成连续的索引,因此 categories 下的 name的字符串顺序会影响标签的索引。同时,配置文件中的 classes 的字符串顺序也会影响到预测框可视化时的标签。
  • annotations 中的 category_id 必须是有效的值。比如所有 category_id 的值都应该属于 categories 中的 id

3. 训练策略的修改

​ 微调超参数与默认的训练策略不同,它通产需要更小的学习率和更少的训练回合。

configs/_base_/schedules/schedule_1x.py内容如下:

# 优化器
# 配置文件中的 lr 配置
optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
# learning policy
lr_config = dict(
    policy='step',
    warmup='linear',
    warmup_iters=500,
    warmup_ratio=0.001,
    step=[8, 11])
runner = dict(type='EpochBasedRunner', max_epochs=12)

​ 在配置文件中的学习率是在8块GPU,每块GPU有2张图像(批大小为8*2=16)的情况下设置的。其已经设置在config/_base_/default_runtime.py 中的 auto_scale_lr.base_batch_size。当配置文件的批次大小为16时,学习率会基于该值进行自动缩放。同时,为了不影响其他基于 mmdet 的 codebase,启用自动缩放标志 auto_scale_lr.enable 默认设置为 False。如果要启用此功能,需在命令添加参数 --auto-scale-lr。并且在启动命令之前,请检查下即将使用的配置文件的名称,因为配置名称指示默认的批处理大小。 在默认情况下,批次大小是 8 x 2 = 16,例如:faster_rcnn_r50_caffe_fpn_90k_coco.py 。执行学习率自动缩放命令后,会根据机器的GPU数量和训练的批次大小对学习率进行自动缩放,比如:在 4 块 GPU 并且每张 GPU 上有 2 张图片的情况下 lr=0.01,那么在 16 块 GPU 并且每张 GPU 上有 4 张图片的情况下, LR 会自动缩放至lr=0.08

​ 如果不启用该功能,则需要根据 学习率缩放规则来手动计算并修改配置文件里面 optimizer.lr 的值。(配置文件中batch_size为16时lr为0.02,按照缩放规则batch_size为8时lr为0.01,以此类推)

4. 训练

​ 为了使用新的配置方法来对模型进行训练,你只需要运行如下命令(单GPU训练):

python tools/train.py configs/faster_rcnn/my_custom_config.py --work-dir work_dirs

5. 测试

​ 为了测试训练完毕的模型,你只需要运行如下命令:

python tools/test.py configs/faster_rcnn/my_custom_config.py work_dirs2/latest.pth --eval bbox

6. 结果可视化

6.1 绘制loss曲线

python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/20220810_135019.log.json --keys loss --out work_dirs/train_loss.jpg

6.2 模型测试评估

先使用 test.py生成 results.pkl 文件, 加入--out指令并指定输出文件目录

  1. 评估指标

    tools/analysis_tools/eval_metric.py根据配置文件评估 pkl 结果文件的某些指标:

python tools/analysis_tools/eval_metric.py configs/faster_rcnn/my_custom_config.py work_dirs/results.pkl --eval bbox
  1. 混淆矩阵

    混淆矩阵是预测结果的摘要。

    tools/analysis_tools/confusion_matrix.py可以分析预测结果并绘制混淆矩阵表:

python tools/analysis_tools/confusion_matrix.py configs/faster_rcnn/my_custom_config.py work_dirs/results.pkl work_dirs

你可能感兴趣的:(深度学习,python,计算机视觉)