MMClassification/MMPretrain安装使用

1. 安装及测试

https://mmclassification.readthedocs.io/zh_CN/1.x/get_started.html#id2
版本为1.x版本
从源码安装

git clone -b 1.x https://github.com/open-mmlab/mmclassification.git
cd mmclassification
pip install -U openmim && mim install -e .

验证安装
第 1 步 我们需要下载配置文件和模型权重文件

mim download mmcls --config resnet50_8xb32_in1k --dest .

第 2 步 验证示例的推理流程

python demo/image_demo.py demo/demo.JPEG resnet50_8xb32_in1k.py resnet50_8xb32_in1k_20210831-ea4938fc.pth --device cpu

出现问题多为MMCV的问题,根据提示需要的版本号进行卸载及安装

2. 自定义数据集

1.x版本可以使用文件夹形式更方便的构建自定义数据集,无需准备标注文件
https://mmclassification.readthedocs.io/en/dev-1.x/user_guides/dataset_prepare.html
https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/en/tutorials/MMClassification_tools.ipynb#scrollTo=e4t2P2aTQokX
data/
├── train
│ ├── class1
│ ├── xxx.png
│ ├── xxy.png
│ ├── class2
│ ├── xxx.png
│ ├── xxy.png

├── val
│ ├── class1
│ ├── xxx.png
│ ├── xxy.png
│ ├── class2
│ ├── xxx.png
│ ├── xxy.png

3.自定义配置文件

以现有的配置文件为基础,自己定义一个新的配置文件
https://mmclassification.readthedocs.io/zh_CN/dev-1.x/user_guides/config.html

image.png

一个特定网络的配置文件是继承现有的配置文件,如https://github.com/open-mmlab/mmclassification/blob/1.x/configs/resnet/resnet50_8xb32_in1k.py的配置文件

_base_ = [
    '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs32.py',
    '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py'
]

通过继承并修改配置文件的方式实现快速的自定义配置文件

例如,如果在 ResNet 的基础上做了一些修改,用户首先可以通过指定 base = './resnet50_8xb32_in1k.py'(相对于你的配置文件的路径),来继承基础的 ResNet 结构、数据集以及其他训练配置信息,然后修改配置文件中的必要参数以完成继承。如想在基础 resnet50 的基础上使用 CutMix 训练增强,将训练轮数由 100 改为 300 和修改学习率衰减轮数,同时修改数据集路径,可以建立新的配置文件 configs/resnet/resnet50_8xb32-300e_in1k.py, 文件中写入以下内容:

# 在 'configs/resnet/' 创建此文件
_base_ = './resnet50_8xb32_in1k.py'

# 模型在之前的基础上使用 CutMix 训练增强
model = dict(
    train_cfg=dict(
        augments=dict(type='CutMix', alpha=1.0)
    )
)

# 优化策略在之前基础上训练更多个 epoch
train_cfg = dict(max_epochs=300, val_interval=10)  # 训练300个 epoch,每10个 epoch 评估一次
param_scheduler = dict(step=[150, 200, 250])   # 学习率调整也有所变动

# 使用自己的数据集目录
train_dataloader = dict(
    dataset=dict(data_root='mydata/imagenet/train'),
)
val_dataloader = dict(
    batch_size=64,                  # 验证时没有反向传播,可以使用更大的 batchsize
    dataset=dict(data_root='mydata/imagenet/val'),
)
test_dataloader = dict(
    batch_size=64,                  # 测试时没有反向传播,可以使用更大的 batchsize
    dataset=dict(data_root='mydata/imagenet/val'),
)

基于自定义数据集的配置文件参考如下设置:

# -*- coding: utf-8 -*-
# +
# 鍦?'configs/resnet/' 鍒涘缓姝ゆ枃浠?#_base_ = './resnet50_8xb32_in1k.py'
#数据集配置文件不继承,自己参考写一下,其他可继承做简单修改
_base_ = [
    '../_base_/models/resnet50.py',
    '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.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=2,#注意修改为自己数据集的类别
        in_channels=2048,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, ),
    ))
# -

# 浼樺寲绛栫暐鍦ㄤ箣鍓嶅熀纭€涓婅缁冩洿澶氫釜 epoch
train_cfg = dict(max_epochs=100, val_interval=1)  # 璁粌300涓?epoch锛屾瘡10涓?epoch 璇勪及涓€娆?#param_scheduler = dict(step=[30, 60, 90])   # 瀛︿範鐜囪皟鏁翠篃鏈夋墍鍙樺姩

# 数据集配置,自定义数据集类型为CustomDataset,修改类别数量

dataset_type = 'CustomDataset'
data_preprocessor = dict(
    num_classes=2,
    # 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='PackClsInputs'),
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='ResizeEdge', scale=256, edge='short'),
    dict(type='CenterCrop', crop_size=224),
    dict(type='PackClsInputs'),
]
train_dataloader = dict(
    batch_size=64,
    num_workers=5,
    dataset=dict(
        type='CustomDataset',
        data_prefix='xxx/train',#修改为训练集的路径
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='RandomResizedCrop', scale=168, backend='pillow'),
            dict(type='RandomFlip', prob=0.5, direction='horizontal'),
            dict(type='PackClsInputs')
        ]),
    sampler=dict(type='DefaultSampler', shuffle=True))

val_dataloader = dict(
    batch_size=64,
    num_workers=5,
    dataset=dict(
        type='CustomDataset',
        data_prefix='xxx/val',#修改为验证集的
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='ResizeEdge', scale=224, edge='short', backend='pillow'),
            dict(type='CenterCrop', crop_size=168),
            dict(type='PackClsInputs')
        ]),
    sampler=dict(type='DefaultSampler', shuffle=False))
val_evaluator = dict(type='Accuracy', topk=(1, ))

test_dataloader = val_dataloader
test_evaluator = val_evaluator

4.单节点训练

python tool/tools/train.py  configs/resnet/resnet50_8xb32_medical.py

后面脚本为3中的配置文件
训练过程中权重文件保存在work_dirs/下

1.MMpretrain安装

mmclassification升级为了MMpretrain,其安装流程如下
https://mmpretrain.readthedocs.io/zh_CN/latest/get_started.html

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

验证安装

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

安装成功会输出了结果字典,包括 pred_label,pred_score 和 pred_class 三个字段
遇到报错

LayerId = cv2.dnn.DictValue
AttributeError: module 'cv2.dnn' has no attribute 'DictValue'```

结局方法为替换opencv-python版本

pip install opencv-python==4.8.0.74 -i https://pypi.tuna.tsinghua.edu.cn/simple/

在新的docker里使用源码安装运行训练出现如下问题,一般是mmcv与cuda不匹配导致,解决方案为卸载mmcv,从源码编译mmcv

ImportError: libtorch_cuda_cu.so: cannot open shared object file

从源码编码mmcv参考
https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html#
主要步骤:

git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
pip install -r requirements/optional.txt
pip install -e . -v
python .dev_scripts/check_installation.py

在自己数据集上进行微调,比如使用resnet50,在/mmpretrain/configs/resnet/下新建一个配置文件,内容如下:
官网教程有问题,建议做如下修改
models/schedules/runtimes可以复用,dataset重写,主要是需要将train_dataloader 和test_dataloader里面的split需要删掉

_base_ = [
    '../_base_/models/resnet50.py',
    '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py'
]

# model设置
model = dict(
    backbone=dict(
        frozen_stages=2,
        init_cfg=dict(
            type='Pretrained',
            checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth',
            prefix='backbone',
        )),
    head=dict(num_classes=3),
)
'''
# 官网推荐修改策略,有问题
data_root = '/workspace/mmpretrain/BUSI_nomask'
train_dataloader = dict(
    batch_size=256,
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',
        data_prefix='train',
    ))
val_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',
        data_prefix='test',
    ))
test_dataloader = val_dataloader
'''
# runtimes设置
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[15], gamma=0.1)



# dataset settings
dataset_type = 'CustomDataset'
data_preprocessor = dict(
    num_classes=3,
    # 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='/workspace/mmpretrain/BUSI_nomask/train',
        #split='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='/workspace/mmpretrain/BUSI_nomask/test',
       # split='val',
        pipeline=test_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=False),
)
val_evaluator = dict(type='Accuracy', topk=(1,))

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

单卡运行方式
CUDA_VISIBLE_DEVICES=1 python tools/train.py configs/resnet/resnet50_8xb32_in1k_zb.py

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容