【OpenMMLab AI训练营第二期】Class5:MMPreTrain代码实践

课程视频MMPreTrain代码课

安装

首先需要配置好cuda、cudnn相关,最好有conda来控制环境。
都完成之后可以进行MMPreTrain的安装

MMPreTrain安装

git clone https://github.com/open-mmlab/mmpretrain.git
cd mmpretrain
pip install -U openmim 
mim install -e .

同时支持多模态模块

mim install -e ".[multimodal]"

验证安装

In [1]: import mmpretrain

In [2]: mmpretrain.__version__
Out[2]: '1.0.0rc8'

In [3]: from mmpretrain import get_model, list_models, inference_model

# 分类任务中名字包含resnet18的模型
In [4]: list_models(task='Image Classification', pattern='resnet18')
Out[4]: ['resnet18_8xb16_cifar10', 'resnet18_8xb32_in1k']

# 图像描述任务中名字包含blip的模型
In [5]: list_models(task='Image Caption', pattern='blip')
Out[5]: ['blip-base_3rdparty_caption', 'blip2-opt2.7b_3rdparty-zeroshot_caption']

# 在cifar上预训练的resnet18
In [6]: model = get_model('resnet18_8xb16_cifar10')

In [7]: type(model)
Out[7]: mmpretrain.models.classifiers.image.ImageClassifier

# 在ImageNet1k上预训练的resnet18
In [11]: model = get_model('resnet18_8xb32_in1k')

In [12]: type(model.backbone)
Out[12]: mmpretrain.models.backbones.resnet.ResNet

如果直接使用get_model()是无法得到结果的,因为没有加载预训练权重。

inference_model(model,'./mmpretrain/demo/bird.JPEG',show=True)

在加载预训练权重之后

In [7]: inference_model('blip-base_3rdparty_caption','./mmpretrain/demo/cat-dog.png',show=True)

是可以显示结果的,因为我是远程所以无法在本地显示图片,这里用的截图
在这里插入图片描述

准备数据集

数据集地址:cats-dogs-dataset

数据集划分

对于训练、验证、测试的划分

./
├── test_set
│   ├── cats [1012 entries exceeds filelimit, not opening dir]
│   └── dogs [1013 entries exceeds filelimit, not opening dir]
├── training_set
│   ├── cats [3201 entries exceeds filelimit, not opening dir]
│   └── dogs [3205 entries exceeds filelimit, not opening dir]
└── val_set
    ├── cats [800 entries exceeds filelimit, not opening dir]
    └── dogs [801 entries exceeds filelimit, not opening dir]

9 directories, 0 files

对于某一个子文件夹的划分是这样的

data_prefix/
├── class_x
│   ├── xxx.png
│   ├── xxy.png
│   └── ...
│       └── xxz.png
└── class_y
    ├── 123.png
    ├── nsdf3.png
    ├── ...
    └── asd932_.png

配置文件

虽然pytorch里面就能直接调用预训练模型,但是之后如果想要有更深层次的自定义操作的话,其实是不太方便的。比如说需要resume这样的操作,这个时候mmpretrain就有了作用。

概览

以resnet18_8xb32_in1k.py为例,里面有四个继承,分别是模型、数据、训练策略、默认运行设置

_base_ = [
    '../_base_/models/resnet18.py',           # 模型配置
    '../_base_/datasets/imagenet_bs32.py',    # 数据配置
    '../_base_/schedules/imagenet_bs256.py',  # 训练策略配置
    '../_base_/default_runtime.py'            # 默认运行设置
]

解析

model是个字典,里面有各种字段
在这里插入图片描述
backbone主要用于特征提取,head具体到各个任务,分类用分类头,检测用检测头

后序的各个base配置文件可以看官方的文档学习配置文件

这里有个需要注意的点
在这里插入图片描述
红圈里的变量type是用了一个中间变量,但在实际使用的时候cfg指向了最终变量。所以在命令行中修改cfg中的dataset_type是没有用的

在这里插入图片描述
如果希望自己的实验能够复现,那么在这里固定随机种子,也可以开启确定性增强的选项,让cuda在训练的时候使用相同的确定性。

微调

在mmpretrain下新建project/cat_dog
将resnet18_8xb32_in1k.py中的四个base文件都复制到resnet18_finetune.py中。

  • 模型部分
    首先要在模型部分加载预训练权重,使用预训练权重能够加速模型的训练速度。在mmpretrain中一般使用配置模型的参数初始化方法来加载预训练权重。然后把head的num改为2。
# model settings
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=2,
        in_channels=512,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, 5),
    ),
    init_cfg=dict(type='Pretrained', checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.pth')
)
  • 数据部分
    分别把train、val、test三个部分的数据集对应上。
  • 训练策略
    把max_epochs改为5就好了

训练

启动训练有两种,一种是在对应文件夹下用tools/train.py。另一种是直接使用mim。

mim train mmpretrain resnet18_finetune.py --work-dir=./exp

训练开始后会有个warning,但是是正常的,因为修改了head的数量。
在这里插入图片描述

测试

mim test mmpretrain resnet18_finetune.py --checkpoint exp/epoch_5.pth

保存每一个样本的测试结果到result.pkl

mim test mmpretrain resnet18_finetune.py --checkpoint exp/epoch_5.pth --out result.pkl

分析

mim run mmpretrain analyze_results resnet18_finetune.py result.pkl --out-dir analyze

以上可以得到得分最高的预测成功和失败的两组图片

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值