• MMDetection(四):在自己的数据集上训练模型


    1. 数据集准备

    本文所使用的数据集为口腔数据集,共有5个类别,分别为:mouth,teeth,tongue,uvula,和oropharynx。
    在mmdetection/data文件夹下新建文件夹,将数据集放到这里。

    需要将数据集格式转化为VOC或COCO数据集的格式,因为configs里提供的依赖coco的模型较多,因此,我们建议将数据集转化成coco格式。

    转化方法参考博客:
    Labelme标注的json数据转化为coco格式的数据

    2. 修改参数

    • 说明:(1)数据类别有5类:mouth,teeth,tongue,uvula,和oropharynx。
      (2)使用的训练模型是configs/ssd/ssd300_coco.py

    2.1 修改数据集的相关参数

    官方建议直接修改coco数据集定义文件

    • 修改数据集路径文件: configs/base/datasets/coco_detection.py
      (1)修改data_root为自己数据集的路径;
      (2)修改data字典中train、val、teat相关路径。

    • 修改模型配置文件:configs/base/models/ssd300.py
      (1)修改bbox_head字典中的num_classes为3。

    • 修改coco数据集定义文件:mmdet/datasets/coco.py
      (1)将CLASSES那里的参数修改为:CLASSES = (‘mouth’, ‘teeth’, ‘tongue’, ‘uvula’, ‘oropharynx’)
      (2)将PALETTE参数随意选5个留下即可,例如:PALETTE = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228)],这个参数用来指定每个类别框的显示颜色。

    • 修改class_name:mmdet/core/evaluation/class_names.py
      (1)定位到coco_classes函数,修改return中的参数为:‘mouth’, ‘teeth’, ‘tongue’, ‘uvula’, ‘oropharynx’

    2.2 修改训练相关参数

    • 修改学习率、优化器相关参数:configs/base/schedules/schedule_1x.py
      (1)主要修改学习率lr的值,一般按照线性计算,官方8张GPU设置为0.02,则4张为0.01,2张为0.005
    • 修改其他参数:configs/base/default_runtime.py,例如:
    # 保存checkpoints的间隔 默认每次都保存
    checkpoint_config = dict(interval=1)
    # yapf:disable
    # # yapf:disable 打印log的间隔(每个epoch中) 默认迭代50次打印一次(datasets的大小除以batchsize)
    log_config = dict(
        interval=50,
        hooks=[
            dict(type='TextLoggerHook'),
            # dict(type='TensorboardLoggerHook')
        ])
    # yapf:enable
    custom_hooks = [dict(type='NumClassCheckHook')]
    
    dist_params = dict(backend='nccl')
    log_level = 'INFO'
    load_from = None    # 加载参数
    resume_from = None  # 断点续训 重新加载已训练好的checkpoints 包含epoch等信息 会覆盖load_form
    workflow = [('train', 1)]  # 工作流
    
    # disable opencv multithreading to avoid system being overloaded
    opencv_num_threads = 0
    # set multi-process start method as `fork` to speed up the training
    mp_start_method = 'fork'
    
    # Default setting for scaling LR automatically
    #   - `enable` means enable scaling LR automatically
    #       or not by default.
    #   - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
    auto_scale_lr = dict(enable=False, base_batch_size=16)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3. 训练网络

    3.1 单GPU训练

    python tools/train.py configs/ssd/ssd300_coco.py  --gpus 1 
    
    • 1

    3.2 多GPU训练

    CUDA_VISIBLE_DEVICES=2,3 bash tools/dist_train.sh configs/ssd/ssd300_coco.py  2
    
    • 1

    训练完之后work_dirs文件夹中会保存下训练过程中的log日志文件、每个epoch的pth文件(因为在default_runtime.py设置了checkpoint_config = dict(interval=1)),这个文件将会用于后面的test测试。
    在这里插入图片描述

    4. 使用训练结果进行测试并可视化

    4.1 验证集图片测试

    pythonpython tools/test.py configs/ssd/ssd300_coco.py work_dirs/ssd300_coco/latest.pth --eval bbox --out work_dirs/ssd300_coco/result.pkl  --show
    
    • 1
    • 参数说明:
      config:模型训练的配置文件
      checkpoint:训练结果的权重文件
      –eval:验证指标,一般使用bbox
      –out:测试结果文件保存的路径及名称
      –show:展示每一张验证集图片的测试结果
    • 显示结果如下:
      在这里插入图片描述在这里插入图片描述并在work_dirs/ssd300_coco文件夹内生成result.pkl 文件

    4.2 训练日志可视化

    python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/ssd300_coco/20220823_210651.log.json --keys loss_cls loss_bbox
    
    • 1

    将训练结果20220312_094204.log.json中的参数acc、loss_cls和loss_bbox进行可视化,结果如下
    在这里插入图片描述

    5. 计算模型复杂度

    • 计算复杂度:FLOPs(注意s是小写)
      floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量,和软硬件的配置没有关系,可以公平地用来衡量算法/模型的复杂度。
      计算公式:
      在这里插入图片描述
    • FLOPS(floating point operations per second)
      意指每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标。

    在MMDetection中可以使用tools/analysis_tools/get_flops.py命令来获取模型的复杂度:

    python tools/analysis_tools/get_flops.py work_dirs/ssd300_coco/ssd300_coco.py 
    
    • 1

    输出结果显示:
    在这里插入图片描述

    6. 计算推理速度

    使用tools/analysis_tools/benchmark.py函数来输出模型的推理速度,注意,mmdet只支持分布式版本,并且它测试的是2000张图片(前500忽略)的平均值。每50张图片显示一次结果

    python -m torch.distributed.launch --nproc_per_node=1 --master_port=12345 tools/analysis_tools/benchmark.py work_dirs/ssd300_coco/ssd300_coco.py work_dirs/ssd300_coco/latest.pth --launcher pytorch
    
    • 1

    运行结果:
    在这里插入图片描述

  • 相关阅读:
    文件批量下载
    集成学习思想
    数据库常见面试题 —— 13. char 和 varchar 的区别
    数字图像处理——引言
    引入代码来源:深入分析markdown-it-quote插件的魔法
    准备pmp考试第13天
    17.复制字符串 ,包括\0
    数字图像处理实验记录一(图像基本灰度变换)
    OKCC要多大空间的硬盘才够用?
    医院信息化的三种演进建设模式
  • 原文地址:https://blog.csdn.net/gaoqing_dream163/article/details/126501622