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 步 我們需要下載配置文件和模型權(quán)重文件

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

出現(xiàn)問題多為MMCV的問題,根據(jù)提示需要的版本號進(jìn)行卸載及安裝

2. 自定義數(shù)據(jù)集

1.x版本可以使用文件夾形式更方便的構(gòu)建自定義數(shù)據(jù)集究孕,無需準(zhǔn)備標(biāo)注文件
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.自定義配置文件

以現(xiàn)有的配置文件為基礎(chǔ),自己定義一個新的配置文件
https://mmclassification.readthedocs.io/zh_CN/dev-1.x/user_guides/config.html

image.png

一個特定網(wǎng)絡(luò)的配置文件是繼承現(xiàn)有的配置文件,如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'
]

通過繼承并修改配置文件的方式實現(xiàn)快速的自定義配置文件

例如,如果在 ResNet 的基礎(chǔ)上做了一些修改,用戶首先可以通過指定 base = './resnet50_8xb32_in1k.py'(相對于你的配置文件的路徑)布近,來繼承基礎(chǔ)的 ResNet 結(jié)構(gòu)拟淮、數(shù)據(jù)集以及其他訓(xùn)練配置信息,然后修改配置文件中的必要參數(shù)以完成繼承论颅。如想在基礎(chǔ) resnet50 的基礎(chǔ)上使用 CutMix 訓(xùn)練增強,將訓(xùn)練輪數(shù)由 100 改為 300 和修改學(xué)習(xí)率衰減輪數(shù)喝检,同時修改數(shù)據(jù)集路徑嗅辣,可以建立新的配置文件 configs/resnet/resnet50_8xb32-300e_in1k.py, 文件中寫入以下內(nèi)容:

# 在 'configs/resnet/' 創(chuàng)建此文件
_base_ = './resnet50_8xb32_in1k.py'

# 模型在之前的基礎(chǔ)上使用 CutMix 訓(xùn)練增強
model = dict(
    train_cfg=dict(
        augments=dict(type='CutMix', alpha=1.0)
    )
)

# 優(yōu)化策略在之前基礎(chǔ)上訓(xùn)練更多個 epoch
train_cfg = dict(max_epochs=300, val_interval=10)  # 訓(xùn)練300個 epoch挠说,每10個 epoch 評估一次
param_scheduler = dict(step=[150, 200, 250])   # 學(xué)習(xí)率調(diào)整也有所變動

# 使用自己的數(shù)據(jù)集目錄
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'),
)

基于自定義數(shù)據(jù)集的配置文件參考如下設(shè)置:

# -*- coding: utf-8 -*-
# +
# 鍦?'configs/resnet/' 鍒涘緩姝ゆ枃浠?#_base_ = './resnet50_8xb32_in1k.py'
#數(shù)據(jù)集配置文件不繼承损俭,自己參考寫一下蛙奖,其他可繼承做簡單修改
_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,#注意修改為自己數(shù)據(jù)集的類別
        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])   # 瀛︿範(fàn)鐜囪皟鏁翠篃鏈夋墍鍙樺姩

# 數(shù)據(jù)集配置,自定義數(shù)據(jù)集類型為CustomDataset杆兵,修改類別數(shù)量

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',#修改為訓(xùn)練集的路徑
        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.單節(jié)點訓(xùn)練

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

后面腳本為3中的配置文件
訓(xùn)練過程中權(quán)重文件保存在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

安裝成功會輸出了結(jié)果字典,包括 pred_label琐脏,pred_score 和 pred_class 三個字段
遇到報錯

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

結(jié)局方法為替換opencv-python版本

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

在新的docker里使用源碼安裝運行訓(xùn)練出現(xiàn)如下問題攒砖,一般是mmcv與cuda不匹配導(dǎo)致缸兔,解決方案為卸載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

在自己數(shù)據(jù)集上進(jìn)行微調(diào),比如使用resnet50,在/mmpretrain/configs/resnet/下新建一個配置文件吹艇,內(nèi)容如下:
官網(wǎng)教程有問題惰蜜,建議做如下修改
models/schedules/runtimes可以復(fù)用,dataset重寫受神,主要是需要將train_dataloader 和test_dataloader里面的split需要刪掉

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

# model設(shè)置
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),
)
'''
# 官網(wǎng)推薦修改策略抛猖,有問題
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設(shè)置
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鼻听,隨后出現(xiàn)的幾起案子财著,更是在濱河造成了極大的恐慌,老刑警劉巖撑碴,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑教,死亡現(xiàn)場離奇詭異,居然都是意外死亡醉拓,警方通過查閱死者的電腦和手機驮履,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉嚼,“玉大人,你說我怎么就攤上這事倒戏〉≡耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵杜跷,是天一觀的道長傍念。 經(jīng)常有香客問我,道長葛闷,這世上最難降的妖魔是什么憋槐? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮淑趾,結(jié)果婚禮上阳仔,老公的妹妹穿的比我還像新娘。我一直安慰自己扣泊,他們只是感情好近范,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著延蟹,像睡著了一般评矩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阱飘,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天斥杜,我揣著相機與錄音虱颗,去河邊找鬼。 笑死蔗喂,一個胖子當(dāng)著我的面吹牛忘渔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弱恒,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辨萍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了返弹?” 一聲冷哼從身側(cè)響起锈玉,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎义起,沒想到半個月后拉背,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡默终,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年椅棺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐蔽。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡两疚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出含滴,到底是詐尸還是另有隱情诱渤,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布谈况,位于F島的核電站勺美,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碑韵。R本人自食惡果不足惜赡茸,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祝闻。 院中可真熱鬧占卧,春花似錦、人聲如沸治筒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耸袜。三九已至友多,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堤框,已是汗流浹背域滥。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工纵柿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人启绰。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓昂儒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親委可。 傳聞我的和親對象是個殘疾皇子渊跋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容