【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示

文件配置说明

如果没有自己数据集练习的小伙伴,可以通过下面方式获取我用于训练测试的数据集,跟着本文一起练习一下整个流程,这个数据集是用于训练102种花朵分类识别的数据集。

关注GZH:阿旭算法与机器学习,回复:【mmlab实战1】即可获取已经下载好的mmlabclassification源码与demo训练用的数据:数据在mmcls/data目录中,已经放置好了

下载源码

先下载mmlabclassification源码到本地:

下载链接:https://github.com/open-mmlab/mmclassification

目录如下:

配置文件

在config里面选择想要使用的模型,并打开相应配置文件,比如使用resnet模型中的resnet18_8xb32_in1k.py这个模型:

打开resnet18_8xb32_in1k.py这个文件,显示如下:

上面几个配置文件都在config / _ base _ 目录下,

上面4个文件,可分别按需求进行配置,但是一个个配置很麻烦,有一个简单的方法可以生成一个总的配置文件,方法如下。

直接将上面选的resnet18_8xb32_in1k.py作为配置参数,运行一遍tools/train.py,因为很多参数没配置,故肯定报错,但是会得到一个完整版的配置文件存放在tools\work_dirs中,如下图:(生成的配置文件名字与你运行的配置文件名称默认是相同的)

新的完整配置文件resnet18_8xb32_in1k.py内容如下:(注:这个与之前那个resnet18_8xb32_in1k.py文件不是同一个,只是名字一样)

需要修改的内容如下:
1.修改分类数目:num_classes
2.修改数据集配置路径

基于预训练模型微调或者续训练自己模型的方式

resnet18_8xb32_in1k.py配置文件中:

load_from = None:load_from 可以用于指定别人预训练好的基模型,在此基础上进行参数微调训练

resume_from = None:resume_from 参数,可以指定之前训练过的模型,在此基础上接着训练。

model = dict(
    type='ImageClassifier',
    backbone=dict(
        type='ResNet',
        depth=18,
        num_stages=4,
        out_indices=(3, ),
        style='pytorch'),
    neck=dict(type='GlobalAveragePooling'),
    head=dict(
        type='LinearClsHead',
        num_classes=1000,
        in_channels=512,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, 5)))
dataset_type = 'ImageNet'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='RandomResizedCrop', size=224),
    dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),
    dict(
        type='Normalize',
        mean=[123.675, 116.28, 103.53],
        std=[58.395, 57.12, 57.375],
        to_rgb=True),
    dict(type='ImageToTensor', keys=['img']),
    dict(type='ToTensor', keys=['gt_label']),
    dict(type='Collect', keys=['img', 'gt_label'])
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='Resize', size=(256, -1)),
    dict(type='CenterCrop', crop_size=224),
    dict(
        type='Normalize',
        mean=[123.675, 116.28, 103.53],
        std=[58.395, 57.12, 57.375],
        to_rgb=True),
    dict(type='ImageToTensor', keys=['img']),
    dict(type='Collect', keys=['img'])
]
data = dict(
    samples_per_gpu=32,
    workers_per_gpu=2,
    train=dict(
        type='ImageNet',
        data_prefix='data/imagenet/train',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='RandomResizedCrop', size=224),
            dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='ToTensor', keys=['gt_label']),
            dict(type='Collect', keys=['img', 'gt_label'])
        ]),
    val=dict(
        type='ImageNet',
        data_prefix='data/imagenet/val',
        ann_file='data/imagenet/meta/val.txt',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='Resize', size=(256, -1)),
            dict(type='CenterCrop', crop_size=224),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img'])
        ]),
    test=dict(
        type='ImageNet',
        data_prefix='data/imagenet/val',
        ann_file='data/imagenet/meta/val.txt',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='Resize', size=(256, -1)),
            dict(type='CenterCrop', crop_size=224),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img'])
        ]))
evaluation = dict(interval=1, metric='accuracy')
optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
lr_config = dict(policy='step', step=[30, 60, 90])
runner = dict(type='EpochBasedRunner', max_epochs=100)
checkpoint_config = dict(interval=1)
log_config = dict(interval=100, hooks=[dict(type='TextLoggerHook')])
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None
resume_from = None
workflow = [('train', 1)]
work_dir = './work_dirs\\resnet18_8xb32_in1k'
gpu_ids = [0]

配置文件说明

model = dict(
    type='ImageClassifier',     # 分类器类型
    backbone=dict(
        type='ResNet',          # 主干网络类型
        depth=50,               # 主干网网络深度, ResNet 一般有18, 34, 50, 101, 152 可以选择
        num_stages=4,           # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。
        out_indices=(3, ),      # 输出的特征图输出索引。越远离输入图像,索引越大
        frozen_stages=-1,       # 网络微调时,冻结网络的stage(训练时不执行反相传播算法),若num_stages=4,backbone包含stem 与 4 个 stages。frozen_stages为-1时,不冻结网络; 为0时,冻结 stem; 为1时,冻结 stem 和 stage1; 为4时,冻结整个backbone
        style='pytorch'),       # 主干网络的风格,'pytorch' 意思是步长为2的层为 3x3 卷积, 'caffe' 意思是步长为2的层为 1x1 卷积。
    neck=dict(type='GlobalAveragePooling'),    # 颈网络类型
    head=dict(
        type='LinearClsHead',     # 线性分类头,
        num_classes=1000,         # 输出类别数,这与数据集的类别数一致
        in_channels=2048,         # 输入通道数,这与 neck 的输出通道一致
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # 损失函数配置信息
        topk=(1, 5),))              # 评估指标,Top-k 准确率, 这里为 top1 与 top5 准确率

通常可设置参数内容:num-classes必须依据自己的实际分类数修改,其他可以不动。

可以调试out_indices,(0 1 2 3),4层可调试,这里取得是最深层3,特征金字塔输出多个;

num_classes: 设置自己数据集的类别个数;(必须修改)

neck颈部网络也可调试;

损失函数可以调试。

# dataset settings
dataset_type = 'ImageNet'  # 数据集名称,
img_norm_cfg = dict(       #图像归一化配置,用来归一化输入的图像。
    mean=[123.675, 116.28, 103.53],  # 预训练里用于预训练主干网络模型的平均值。
    std=[58.395, 57.12, 57.375],     # 预训练里用于预训练主干网络模型的标准差。
    to_rgb=True)                     # 是否反转通道,使用 cv2, mmcv 读取图片默认为 BGR 通道顺序,这里 Normalize 均值方差数组的数值是以 RGB 通道顺序, 因此需要反转通道顺序。
# 训练数据流水线
train_pipeline = [
    dict(type='LoadImageFromFile'),                # 读取图片
    dict(type='RandomResizedCrop', size=224),      # 随机缩放抠图
    dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),  # 以概率为0.5随机水平翻转图片
    dict(type='Normalize', **img_norm_cfg),        # 归一化
    dict(type='ImageToTensor', keys=['img']),      # image 转为 torch.Tensor
    dict(type='ToTensor', keys=['gt_label']),      # gt_label 转为 torch.Tensor
    dict(type='Collect', keys=['img', 'gt_label']) # 决定数据中哪些键应该传递给检测器的流程
]
# 测试数据流水线
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='Resize', size=(256, -1)),
    dict(type='CenterCrop', crop_size=224),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='ImageToTensor', keys=['img']),
    dict(type='Collect', keys=['img'])             # test 时不传递 gt_label
]
data = dict(
    samples_per_gpu=32,    # 单个 GPU 的 Batch size
    workers_per_gpu=2,     # 单个 GPU 的 线程数
    train=dict(            # 训练数据信息
        type=dataset_type,                  # 数据集名称
        data_prefix='data/imagenet/train',  # 数据集目录,当不存在 ann_file 时,类别信息从文件夹自动获取
        pipeline=train_pipeline),           # 数据集需要经过的 数据流水线
val=dict(              # 验证数据集信息
        type=dataset_type,
        data_prefix='data/imagenet/val',
        ann_file='data/imagenet/meta/val.txt',   # 标注文件路径,存在 ann_file 时,不通过文件夹自动获取类别信息
        pipeline=test_pipeline),
test=dict(             # 测试数据集信息
        type=dataset_type,
        data_prefix='data/imagenet/val',
        ann_file='data/imagenet/meta/val.txt',
        pipeline=test_pipeline))
evaluation = dict(       # evaluation hook 的配置
    interval=1,          # 验证期间的间隔,单位为 epoch 或者 iter, 取决于 runner 类型。
    metric='accuracy')   # 验证期间使用的指标。

上面主要需要修改:训练数据data,验证集val,测试集test这几个数据集的路径。(数据集路径配置方式见下文)

# Checkpoint hook 的配置文件。
checkpoint_config = dict(interval=1)   # 保存的间隔是 1,单位会根据 runner 不同变动,可以为 epoch 或者 iter。
# 日志配置信息。
log_config = dict(
    interval=100,                      # 打印日志的间隔, 单位 iters
    hooks=[
        dict(type='TextLoggerHook'),          # 用于记录训练过程的文本记录器(logger)。
        # dict(type='TensorboardLoggerHook')  # 同样支持 Tensorboard 日志
    ])
 
dist_params = dict(backend='nccl')   # 用于设置分布式训练的参数,端口也同样可被设置。
log_level = 'INFO'             # 日志的输出级别。
resume_from = None             # 从给定路径里恢复检查点(checkpoints),训练模式将从检查点保存的轮次开始恢复训练。
workflow = [('train', 1)]      # runner 的工作流程,[('train', 1)] 表示只有一个工作流且工作流仅执行一次。
work_dir = 'work_dir'          # 用于保存当前实验的模型检查点和日志的目录文件地址。
# 用于构建优化器的配置文件。支持 PyTorch 中的所有优化器,同时它们的参数与 PyTorch 里的优化器参数一致。
optimizer = dict(type='SGD',         # 优化器类型
                lr=0.1,              # 优化器的学习率,参数的使用细节请参照对应的 PyTorch 文档。
                momentum=0.9,        # 动量(Momentum)
                weight_decay=0.0001) # 权重衰减系数(weight decay)。
 # optimizer hook 的配置文件
optimizer_config = dict(grad_clip=None)  # 大多数方法不使用梯度限制(grad_clip)。
# 学习率调整配置,用于注册 LrUpdater hook。
lr_config = dict(policy='step',          # 调度流程(scheduler)的策略,也支持 CosineAnnealing, Cyclic, 等。
                 step=[30, 60, 90])      # 在 epoch 为 30, 60, 90 时, lr 进行衰减
runner = dict(type='EpochBasedRunner',   # 将使用的 runner 的类别,如 IterBasedRunner 或 EpochBasedRunner。
            max_epochs=100)              # runner 总回合数, 对于 IterBasedRunner 使用 `max_iters`


【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示(2)https://developer.aliyun.com/article/1536294

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
6月前
|
机器学习/深度学习 JSON 数据格式
CatBoost模型部署与在线预测教程
CatBoost模型部署与在线预测教程【2月更文挑战第16天】
132 2
|
6月前
|
机器学习/深度学习 Python
垃圾分类模型训练部署教程,基于MaixHub和MaixPy-k210(2)
至此,我们就已经成功上传了其中一个类别的图片啦!按照上面的方式,我们可以继续上传其余每个类别的图片。 上传完所有类别的图片后,来到总览,可以大致浏览我们刚刚上传的图片。 接下来,就要用这些图片来训练用于垃圾分类的模型了!
306 0
|
6月前
|
IDE 数据处理 开发工具
垃圾分类模型训练部署教程,基于MaixHub和MaixPy-k210(1)
我的准备 Maix duino开发板一块(含摄像头配件) Type-c数据集一根
289 0
|
6月前
|
IDE 开发工具
垃圾分类模型训练部署教程,基于MaixHub和MaixPy-k210(3)
在开发板上运行模型 1、烧录模型文件到板子 使用kflash_gui工具,可以完成这个任务。
381 0
|
18天前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
34 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
5月前
|
机器学习/深度学习 监控 数据可视化
【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示(3)
【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示
点分类模型实战
点分类模型实战
|
4月前
|
数据采集 机器学习/深度学习 数据可视化
关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理,进行数据探索,选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。
【7月更文挑战第5天】这是一个关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理(填充缺失值,处理异常值),进行数据探索(可视化和统计分析),选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。此案例展示了数据科学的典型流程。
71 2
|
5月前
|
数据可视化 计算机视觉 Python
【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示(2)
【超详细】MMLab分类任务mmclassification:环境配置说明、训练、预测及模型结果可视化展示
|
6月前
|
数据可视化
R语言KNN模型分类信贷用户信用等级数据参数调优和预测可视化|数据分享
R语言KNN模型分类信贷用户信用等级数据参数调优和预测可视化|数据分享