【MMCV】mmpretrain/mmclassification概览、环境安装与验证

概览

MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassificationMMSelfSup,并开发了许多令人兴奋的新功能。 目前,预训练阶段对于视觉识别至关重要,凭借丰富而强大的预训练模型,我们能够改进各种下游视觉任务。

此开源库旨在成为一个易于使用和用户友好的代码库库,并简化学术研究活动和工程任务。

视觉基础模型的探索:MMPreTrain | CVPR 2023 (全英分享)

代码仓库:https://github.com/open-mmlab/mmpretrain

文档教程:https://mmpretrain.readthedocs.io/en/latest/

MMPretrain 实践路线图

MMPreTrain除了有以上丰富的预训练模型、多种数据集,还支持开箱即用的推理API和模型,包含的相关任务有:图像分类、图像描述、视觉问答、视觉定位、检索、多任务和多模态等。

MMPreTrain的代码框架

MMPretrain/
    ├── configs/
    │   ├── _base_/                       # 原始配置文件夹
    │   │   ├── datasets/                      # 原始 datasets
    │   │   ├── models/                        # 原始 models
    │   │   ├── schedules/                     #原始 schedules
    │   │   └── default_runtime.py             # 原始运行时设置
    │   ├── arcface/                      # ArcFace 算法文件夹
    │   ├── barlowtwins/                      # Barlow Twins 算法文件夹
    │   ├── beit/                         # BEiT 算法文件夹
    │   ├── beitv2/                         # BEiTv2 算法文件夹
    │   ├── blip/                         # BLIP 算法文件夹
    │   ├── blip2/                         # BLIP-2 算法文件夹
    │   ├── ...
    └── ...

可以使用 python tools/misc/print_config.py /PATH/TO/CONFIG 命令来查看完整的配置信息,从而方便检查所对应的配置文件。例如,查看ResNet50在数据集ImageNet 1K上的配置。

python tools/misc/print_config.py configs/resnet/resnet50_8xb32_in1k.py

resnet50_8xb32_in1k.py,显示如下:

base = [
‘…/base/models/resnet50.py’,
‘…/base/datasets/imagenet_bs32.py’,
‘…/base/schedules/imagenet_bs256.py’,
‘…/base/default_runtime.py’ ]

基本上将模型组件分为 3 种类型。

  • 主干网络backbone:通常是一个特征提取网络,例如 ResNet、MobileNet。
  • 颈部neck:用于连接主干网络和头部的组件,例如 GlobalAveragePooling。
    • loss: 损失函数设置, 支持 CrossEntropyLoss, LabelSmoothLoss, PixelReconstructionLoss 等。
  • 头部 head:用于执行特定任务的组件,例如分类和回归。

configs/_base_/models/resnest50.py查看文件,具体如下:

# model settings
model = dict(
    type='ImageClassifier',  # 主模型类型,对于图像分类任务,使用 ImageClassifier
    backbone=dict(   # 主干网络:通常是一个特征提取网络
        type='ResNet',  # 主干网络类型
        # 除了 `type` 之外的所有字段都来自 `ResNet` 类的 __init__ 方法
        # 可查阅 https://mmpretrain.readthedocs.io/zh_CN/latest/api/generated/mmpretrain.models.backbones.ResNet.html
        depth=50,  # 网络深度,50层
        num_stages=4,           # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。
        out_indices=(3, ),      # 输出的特征图输出索引。
        style='pytorch'),
    neck=dict(type='GlobalAveragePooling'),  # 颈部网络类型
    head=dict(
        type='LinearClsHead',   # 分类颈网络类型
        num_classes=1000,   # 类别数量
        in_channels=2048,  # 分类颈的输入通道数
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),  # 损失函数配置信息
        topk=(1, 5),   # 评估指标,Top-k 准确率, 这里为 top1 与 top5 准确率,可省略
    ))

topk=(1, 5)可省略,因为在训练模型时,topk=(1, 5)通常用于在训练过程中输出每个批次的top-1和top-5准确率。但在模型的配置中,这些评估指标并不影响模型的结构或训练过程。

../_base_/datasets/imagenet_bs32.py查看文件,具体如下:

# dataset settings
dataset_type = 'ImageNet'
data_preprocessor = dict(  # 预处理配置
    num_classes=1000,  # 类别数量
    # 输入的图片数据通道以 'RGB' 顺序
	mean=[123.675, 116.28, 103.53],    # 输入图像归一化的 RGB 通道均值
    std=[58.395, 57.12, 57.375],       # 输入图像归一化的 RGB 通道标准差
    to_rgb=True,                       # 是否将通道翻转,从 BGR 转为 RGB 或者 RGB 转为 BGR
)
# train_pipeline中的数据增强
train_pipeline = [
    dict(type='LoadImageFromFile'),     # 读取图像
    dict(type='RandomResizedCrop', scale=224),     # 随机放缩裁剪。首先,图像的短边将被调整到224像素大小,然后随机选择一部分区域并裁剪为224x224像素大小的图像
    dict(type='RandomFlip', prob=0.5, direction='horizontal'),   # 随机水平翻转。以50%的概率水平翻转图像,增加图像的变换视角
    dict(type='PackInputs'),         # 准备图像以及标签,将图像以及对应的标签打包,准备为模型输入
]
# test_pipeline中的数据增强
test_pipeline = [
    dict(type='LoadImageFromFile'),     # 读取图像
    dict(type='ResizeEdge', scale=256, edge='short'),  # 缩放短边尺寸至256像素。保持图像的长宽比,并将短边调整到256像素大小
    dict(type='CenterCrop', crop_size=224),     # 中心裁剪。将图像从中心位置裁剪为224x224像素大小
    dict(type='PackInputs'),                 # 准备图像以及标签
]
# 构造训练集数据加载器(DataLoader)的配置
train_dataloader = dict(
    batch_size=32,                     # 每张 GPU 的 batchsize
    num_workers=5,                     # 每个 GPU 的线程数
    dataset=dict(                      # 训练数据集
        type=dataset_type,
        data_root='data/imagenet',  # 训练数据集的根目录路径
        split='train',  # 使用数据集中的训练集部分
        pipeline=train_pipeline),  # 指定了数据预处理的管道
    sampler=dict(type='DefaultSampler', shuffle=True), # 默认采样器
)
# 构造验证集数据加载器(DataLoader)的配置
val_dataloader = dict(
    batch_size=32,                     # 每张 GPU 的 batchsize
    num_workers=5,                     # 每个 GPU 的线程数
    dataset=dict(                      # 验证数据集
        type=dataset_type,
        data_root='data/imagenet',  # 验证数据集的根目录路径
        split='val',  #  验证数据集的根目录路径,即数据集所在的文件夹
        pipeline=test_pipeline),  # 指定了数据预处理的管道
    sampler=dict(type='DefaultSampler', shuffle=False),
)
# 验证集评估设置,使用准确率为指标, 这里使用 topk1 以及 top5 准确率
val_evaluator = dict(type='Accuracy', topk=(1, 5))

test_dataloader = val_dataloader  # test dataloader 配置,这里直接与 val_dataloader 相同
test_evaluator = val_evaluator    # 测试集的评估配置,这里直接与 val_evaluator 相同

../_base_/schedules/imagenet_bs256.py查看文件,具体如下:

optim_wrapper = dict(
    # 使用 SGD 优化器来优化参数
    optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001))

# 学习率参数的调整策略
# 'MultiStepLR' 表示使用多步策略来调度学习率(LR)。
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1)

# 训练的配置,迭代 100 个 epoch,每一个训练 epoch 后都做验证集评估
# 'by_epoch=True' 默认使用 `EpochBaseLoop`,  'by_epoch=False' 默认使用 `IterBaseLoop`
train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1)
# 使用默认的验证循环控制器
val_cfg = dict()
# 使用默认的测试循环控制器
test_cfg = dict()

# 通过默认策略自动缩放学习率,此策略适用于总批次大小 256
# 如果你使用不同的总批量大小,比如 512 并启用自动学习率缩放
# 我们将学习率扩大到 2 倍
auto_scale_lr = dict(base_batch_size=256)

以下是几乎所有算法都使用的运行配置../_base_/default_runtime.py查看文件,具体如下:

# 默认所有注册器使用的域
default_scope = 'mmpretrain'

# 配置默认的 hook
default_hooks = dict(
    # 记录每次迭代的时间
    timer=dict(type='IterTimerHook'),

    # 每 100 次迭代打印日志
    logger=dict(type='LoggerHook', interval=100),

    # 启用参数调度程序
    param_scheduler=dict(type='ParamSchedulerHook'),

    # 每个epoch保存检查点
    checkpoint=dict(type='CheckpointHook', interval=1),

    # 在分布式环境中设置采样器种子
    sampler_seed=dict(type='DistSamplerSeedHook'),

    # 验证结果可视化,设置 True 启用它。
    visualization=dict(type='VisualizationHook', enable=False),
)

# 配置环境
env_cfg = dict(
    # 是否启用cudnn基准测试
    cudnn_benchmark=False,

    # 设置多进程参数
    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),

    # 设置分布式参数
    dist_cfg=dict(backend='nccl'),
)

# 设置可视化工具
vis_backends = [dict(type='LocalVisBackend')]  # 使用磁盘(HDD)后端
visualizer = dict(type='UniversalVisualizer', vis_backends=vis_backends)

# 设置日志级别
log_level = 'INFO'

# 从哪个检查点加载
load_from = None

# 是否从加载的检查点恢复训练
resume = False

# 默认使用随机种子并禁用
randomness = dict(seed=None, deterministic=False)

这部分主要包括保存权重策略、日志配置、训练参数、断点权重路径和工作目录等等。

环境安装

MMPretrain 适用于 Linux、Windows 和 macOS。它需要 Python 3.7+、CUDA 10.2+ 和 PyTorch 1.8+。

第 1 步 从官网下载并安装 anaconda。

根据自己的系统,选择下载安装包。图形安装包安装方式就像安装软件那样根据提示下一步就可以了。

第 2 步 创建一个 conda 虚拟环境并激活它。env_name为虚拟环境名字,版本号为虚拟环境python版本号

conda create --name env_name python=版本号 -y
conda activate env_name

conda create --name openmmlab_test python=3.8 -y
conda activate openmmlab_test

第 3 步 按照官方指南安装 PyTorch。

在这里插入图片描述
复制Run this Command:中得语句到Terminal
在这里插入图片描述

安装mmpretrain

从源码按如下方式安装 mmpretrain:

git clone https://github.com/open-mmlab/mmpretrain.git


进入mmpretrain根目录,安装openmim

cd mmpretrain
pip install -U openmim
mim install -e .

通过Docker使用 MMPretrain

# 构建默认的 PyTorch 1.12.1,CUDA 11.3 版本镜像
# 如果你希望使用其他版本,请修改 Dockerfile
docker build -t mmpretrain docker/

Docker命令安装。

docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmpretrain/data mmpretrain

验证

为了验证 MMPretrain 的安装是否正确,我们提供了一些示例代码来执行模型推理。

直接运行以下命令进行验证:

python demo/image_demo.py demo/demo.JPEG resnet18_8xb32_in1k --device cpu

MMPretrain 可以仅在 CPU 环境中安装,在 CPU 模式下,你可以完成训练、测试和模型推理等所有操作。

在给定图像上进行推理

from mmpretrain import inference_model
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
# 如果你没有图形界面,请设置 `show=False`
result = inference_model('resnet50_8xb32_in1k', image, show=True)
print(result['pred_class'])

上述 inference_model接口可以快速进行模型推理,但它每次调用都需要重新初始化模型,也无法进行多个样本的推理。 因此我们需要使用推理器来进行多次调用。

from mmpretrain import ImageClassificationInferencer
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
inferencer = ImageClassificationInferencer('resnet50_8xb32_in1k')
# 注意推理器的输出始终为一个结果列表,即使输入只有一个样本
result = inferencer('https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG')[0]
print(result['pred_class'])
# 你可以对多张图像进行批量推理
image_list = ['demo/demo.JPEG', 'demo/bird.JPEG'] * 16
results = inferencer(image_list, batch_size=8)
print(len(results))
print(results[1]['pred_class'])

在 CUDA 上进行推理

from mmpretrain import ImageClassificationInferencer
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
config = 'configs/resnet/resnet50_8xb32_in1k.py'
checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth'
inferencer = ImageClassificationInferencer(model=config, pretrained=checkpoint, device='cuda')
result = inferencer(image)[0]
print(result['pred_class'])

训练

python tools/train.py ${CONFIG_FILE} [ARGS]

使用推理器的 list_models方法获取对应任务可用的所有模型

from mmpretrain import ImageCaptionInferencer
ImageCaptionInferencer.list_models()

list_models支持 Unix 文件名风格的模式匹配,你可以使用** * **匹配任意字符。

from mmpretrain import list_models
list_models("*next*0")

测试

python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [ARGS]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MMPretrain是一个基于pytorch的开源深度学习预训练工具箱,它是OenMMLab的项目成员之一开发的。它提供了各种强大的预训练主干网络,并支持不同的预训练策略。MMPretrain源自著名的开源项目MMClassificationMMSelfSup,并开发了许多新功能。预训练阶段对于视觉识别非常重要,而MMPretrain通过提供丰富而强大的预训练模型,使我们能够改进各种下游视觉任务。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [计算机视觉 | 深度学习预训练与MMPretrain](https://blog.csdn.net/qq_37902216/article/details/131076259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [开源预训练框架 MMPRETRAIN官方文档(概览环境安装验证、基础用户指南)](https://blog.csdn.net/qq_41627642/article/details/131561433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [深度学习预训练与MMPreTrain](https://blog.csdn.net/travel_66/article/details/131073132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶媛小吴

规则简单易懂,粗暴却完美!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值