课程视频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
以上可以得到得分最高的预测成功和失败的两组图片