【OpenMMLab】MMPretrain 代码教程

系列文章目录

第一课:【OpenMMLab】OpenMMLab概述
第二课:【OpenMMLab】人体姿态估计、关键点检测与MMPose
第三课:【openMMLab】MMPose 代码教程
第四课:【OpenMMLab】深度学习预训练与 MMPreTrain

前言

MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络,并支持不同的预训练策略。
MMPretrain 源自 MMClassification 和MMSelfSup,并开发了许多新功能。预训练阶段对于视觉识别至关重要,凭借丰富而强大的预训练模型,能够用于改进各种下游视觉任务。 代码库旨在成为一个易于使用和用户友好的代码库,并简化学术研究活动和工程任务。
博客视频:https://www.bilibili.com/video/BV1PN411y7C1
代码仓库:https://github.com/open-mmlab/mmpretrain
文档教程:https://mmpretrain.readthedocs.io/en/latest

一、环境安装

关于创建虚拟环境,安装pyorch,安装mmcv环境可以参考 【openMMLab】MMPose 代码教程。本次代码教程主要基于ipython进行讲解。

安装ipython

ipython 调用的是 虚拟环境中的库,所以要在配置好的虚拟环境中安装ipython

# 激活 conda 虚拟环境
conda activate your_env_name
# 安装
pip install ipython
# 打开 ipython
# 简单验证 ipython 的安装
ipython

In [1]: import torch

In [2]: torch.__version__
Out[2]: '2.0.1+cu118'

In [3]: torch.cuda.is_available()
Out[3]: True

In [4]: exit()

下载和安装mmpretrain

# 下载 mmpretrain
git clone https://github.com/open-mmlab/mmpretrain
# 安装 mmpretrain
cd mmpretrain
pip install -e .

mmpretrain API

详细介绍在代码的注释中

# 打开 ipython
ipython

In [1]: import mmpretrain

# 查看 mmpretrain 的版本
In [2]: mmpretrain.__version__
Out[2]: '1.0.0rc8'

# 从mmpretrain中引入一些高阶的api, 
# 如get_model, list_models, inference_model 分别用于模型的获取,列举和推理
In[3]: from mmpretrain import get_model, list_models, inference_model

# 获取 图像分类 Image Classification 相关的,含有 resnet18 的模型
In [4]: list_models(task='Image Classification', pattern='resnet18')
out[4]: ['resnet18_8xb16_cifar10', 'resnet18_8xb32_in1k']

# 获取 图像描述 Image Caption 相关的,含有clip的模型
In [5]: list_models(task='Image Caption', pattern='blip')
Out[5]: ['blip-base_3rdparty_caption', 'blip2-opt2.7b_3rdparty-zeroshot_caption']

# list_models 返回的名称是 mmpretrain 中统一使用的模型名称标识
# 可以直接使用这些名称获取对应模型
# 如 ‘resnet18_8xb16_cifar10’ 是 resnet18 在 cifar10 上训练好的模型
# !!!!get_model 得到的模型是没有与训练权重的模型!!!!!!
In [6]: model = get_model('resnet18_8xb16_cifar10')

# 模型的类型是 ImageClassifier, 模型主干为 ResNet_CIFAR
In [7]: type(model)
Out[7]: mmpretrain.models.classifiers.image.ImageClassifier

In [8]: type(model.backbone)
Out[8]: mmpretrain.models.backbones.resnet_cifar.ResNet_CIFAR

# 使用 inference_model 进行模型推理
# get_model 获得的模型并没有加载模型权重,得到的结果是混乱的,我们需要加载对应的模型在对应数据集上的权重
# 可以使用统一的名称,直接推理,会自动加载对应的预训练权重
# show=True 会展示推理结果,如下图所示
In [9]: inference('blip-base_3rdparty_caption', 'demo/cat-dog.png', show=True)

In [10]: exit()

在这里插入图片描述

MMPretrain 微调实验

基于MMPretrain,在分类数据集上进行ResNet18的微调实验

准备数据集

这是一个标准的分类数据集,不需要编写额外的数据集加载逻辑;如果需要支持一些特殊格式的数据集,可以在MMPretrain的基础上开发一个新的数据集类。

配置文件

下面介绍 MMPretrain 的配置文件,这也是openmmlab算法库通用的配置文件格式。这是因为MMPretrain中已经集成了很多算法和数据集的支持,对于本次博客使用的微调任务,基本上不需要编写各个组件的代码,直接修改配置文件,配置各个环节的参数即可。
configs文件夹集成了各类算法,包括有监督、无监督及多模态算法的预设。
openmmlab算法库支持进行各种实验,如保存模型参数,分布式训练,训练中断的恢复等等。MMPretrain中已经提供了一整套的训练代码,用户只需修改config文件配置参数,进行各种实验。
本次实验是对ResNet50分类模型进行微调,所以可以参考MMPretrain预设的ResNet50的配置文件

# 查看resnet相关的配置文件
ls configs/resnet
metafile.yml                resnet18_8xb16_cifar10.py             resnet50_32xb64-warmup-lbs_in1k.py   resnet50_8xb256-rsb-a2-300e_in1k.py     resnet50_8xb32-fp16_in1k.py   resnetv1c152_8xb32_in1k.py
README.md                   resnet18_8xb32_in1k.py                resnet50_8xb128_coslr-90e_in21k.py   resnet50_8xb256-rsb-a3-100e_in1k.py     resnet50_8xb32_in1k.py        resnetv1c50_8xb32_in1k.py
resnet101_8xb16_cifar10.py  resnet34_8xb16_cifar10.py             resnet50_8xb16_cifar100.py           resnet50_8xb32-coslr_in1k.py            resnet50_8xb32-lbs_in1k.py    resnetv1d101_8xb32_in1k.py
resnet101_8xb32_in1k.py     resnet34_8xb32_in1k.py                resnet50_8xb16_cifar10.py            resnet50_8xb32-coslr-preciseBN_in1k.py  resnet50_8xb32-mixup_in1k.py  resnetv1d152_8xb32_in1k.py
resnet152_8xb16_cifar10.py  resnet50_32xb64-warmup-coslr_in1k.py  resnet50_8xb16-mixup_cifar10.py      resnet50_8xb32-cutmix_in1k.py           resnet50_8xb8_cub.py          resnetv1d50_8xb32_in1k.py
resnet152_8xb32_in1k.py     resnet50_32xb64-warmup_in1k.py        resnet50_8xb256-rsb-a1-600e_in1k.py  resnet50_8xb32-fp16-dynamic_in1k.py     resnetv1c101_8xb32_in1k.py

# 选择在imagenet1k上预训练的resnet50  
# _base_ 中的文件为继承的父文件
cat resnet50_8xb32_in1k.py 
_base_ = [
    '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs32.py',
    '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py'
]

model 配置文件

# 打印 ../_base_/models/resnet50.py
cat ../_base_/models/resnet50.py
# model settings
model = dict(
    type='ImageClassifier',
    backbone=dict(
        type='ResNet',
        depth=50,
        num_stages=4,
        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),
    ))

由于只需要修改分类的数量,我们可以加载现有的ResNet50配置后,再修改字典信息即可。

from mmengine import Config
# 加载配置文件
cfg = Config.fromfile('configs/resnet/resnet50_8xb32_in1k.py')
# 查看模型的当前配置
print(cfg.model)
# 修改字典信息 即分类数量
cfg.model.head.num_classes=2
print(cfg.model)

dataset 配置文件

# dataset settings
dataset_type = 'ImageNet'
data_preprocessor = dict(
    num_classes=1000,
    # RGB format normalization parameters
    mean=[123.675, 116.28, 103.53],
    std=[58.395, 57.12, 57.375],
    # convert image from BGR to RGB
    to_rgb=True,
)

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='RandomResizedCrop', scale=224),
    dict(type='RandomFlip', prob=0.5, direction='horizontal'),
    dict(type='PackInputs'),
]

test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='ResizeEdge', scale=256, edge='short'),
    dict(type='CenterCrop', crop_size=224),
    dict(type='PackInputs'),
]

train_dataloader = dict(
    batch_size=32,
    num_workers=5,
    dataset=dict(
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/train.txt',
        data_prefix='train',
        pipeline=train_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=True),
)

val_dataloader = dict(
    batch_size=32,
    num_workers=5,
    dataset=dict(
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/val.txt',
        data_prefix='val',
        pipeline=test_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=False),
)
val_evaluator = dict(type='Accuracy', topk=(1, 5))

# If you want standard test, please manually configure the test dataset
test_dataloader = val_dataloader
test_evaluator = val_evaluator

~~ 待更新

### 使用 MMPReTrain 进行模型测试 MMPReTrainOpenMMLab 提供的一个用于预训练和微调的工具箱,支持多种视觉任务。以下是关于如何使用 MMPReTrain 进行模型测试的相关说明。 #### 安装 MMPReTrain 为了进行模型测试,首先需要安装 MMPReTrain 工具包。可以通过以下命令完成安装: ```bash pip install openmim mim install mmpretrain ``` 如果需要从源码安装,则可以克隆仓库并运行安装脚本[^2]: ```bash git clone https://github.com/open-mmlab/mmpretrain.git cd mmpretrain pip install -e . ``` #### 准备配置文件和权重 在执行测试之前,需准备好对应的配置文件(`.py` 文件)以及预训练或微调后的模型权重文件(通常是 `.pth` 格式)。这些资源可以从官方文档中的模型库下载[^1],或者通过自定义训练生成。 #### 执行测试命令 MMPReTrain 支持单张图片分类预测或多张图片批量测试。以下是具体操作方法: ##### 单张图像分类预测 要对一张图片进行分类预测,可使用 `tools/deployment/test.py` 脚本。例如: ```bash python tools/deployment/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --img ${IMAGE_PATH} ``` 其中: - `${CONFIG_FILE}` 表示模型的配置文件路径。 - `${CHECKPOINT_FILE}` 表示模型权重文件路径。 - `${IMAGE_PATH}` 表示待测图片的路径。 此命令会返回该图片所属类别的预测结果及其置信度分数[^3]。 ##### 多张图像批量测试 对于多张图片的批量测试,可通过修改上述命令实现自动化处理。例如编写一个简单的 Python 脚本来遍历目录下的所有图片,并逐一调用测试接口。 #### 自定义数据集测试 当使用自己的数据集时,可能需要调整配置文件以适配新的类别数量和其他参数设置。详情参见官方中文教程。 --- ### 示例代码:单图分类预测 下面是一个完整的单图分类预测的例子: ```python from mmpretrain import inference_model, init_model config_file = 'path/to/config.py' checkpoint_file = 'path/to/checkpoint.pth' # 初始化模型 model = init_model(config_file, checkpoint_file) # 加载输入图片 image_path = 'test.jpg' # 推理过程 result = inference_model(model, image_path) print(result) ``` 以上代码展示了如何加载模型并对指定图片进行推理的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值