MMClassification安裝使用 1. 安裝及測試 2. 自定義數據集 3.自定義配置文件 4.單節點訓練

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


一個特定網絡的配置文件是繼承現有的配置文件,如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/下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章