본문 바로가기

카테고리 없음

MM classification configuration file

오픈소스 이미지 classification 라이브러리인 MM classification의 기본적인 개념과 사용법을 정리해놓은 글입니다.

 

mm classification은 _base_ 폴더의  configs 폴더 안에 존재하는 config 파일로 모델을 구성하고, dataloader를 정의하고 학습 파라미터를 정의한다. 

config file은 다음과 같은 naming convention을 따른다. 

{algorithm info}_{module info}_{training info}_{data info}.py

algorithm info: 모델 학습에 사용한 알고리즘 ex) resnet50

module info: 주로 pretrain 정보 ex) in21k-pre: 21k imageNet data로 pretained

training info

  •  training type, batch size, lr, data augment, special loss functions 등 학습 정보
  • ex) 4xb64-ft:  GPU4개, batch_size = 64로 학습 진행, fine-tuning

data info: input으로 넣어줄 데이터에 대한 정보 ex) in1k: ImageNet1k

 

check point naming convention은 다음과 같다.

{config_name}_{date}-{hash}.pth

config file은 크게 model, dataset, schedules, runtime 네가지 dictonary로 된  parameter를 필요로 한다. 

 

먼저 model에서는 backbone으로 기본적인 모델의 구조를 골라준다. 

data에서는 img_norm_cfg로 데이터를 normalization하는데 필요한 parameter를 세팅해준다. trian_pipeline에서는 train 데이터를 읽어오고, flip, crop 등의 방법으로 데이터를 증강하고, 텐서로 바꾸는 과정 등을 모두 간단하게 지정할 수 있다. 또한 Collect를 통해서 이미지 데이터와 label 데이터를 지정한다.

train_pipeline = [
    dict(type='LoadImageFromFile'),                
    dict(type='RandomResizedCrop', size=224),      
    dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), 
    dict(type='Normalize', **img_norm_cfg),        
    dict(type='ImageToTensor', keys=['img']),      
    dict(type='ToTensor', keys=['gt_label']),     
    dict(type='Collect', keys=['img', 'gt_label']) 
]

test 데이터에 대해서도 파이프라인을 지정한다. 그리고 실제로 학습에 사용할 데이터를 지정해준다. 만약 학습에 사용할 데이터가 class별로 다른 폴더에 들어있다면 다음과 같이 data를 설정해주면 된다. 마지막으로 evaluation을 설정해주고, 평가를 진행할 interval을 설정해주고 평가에 사용할 metric을 지정한다.

dataset_type = 'CustomDataset'
classes = ['cat', 'bird', 'dog']  # The category names of your dataset

data = dict(
    train=dict(
        type=dataset_type,
        data_prefix='data/my_dataset/train',
        ann_file='data/my_dataset/meta/train.txt',
        classes=classes,
        pipeline=train_pipeline
    ),
    val=dict(
        type=dataset_type,
        data_prefix='data/my_dataset/val',
        ann_file='data/my_dataset/meta/val.txt',
        classes=classes,
        pipeline=test_pipeline
    ),
    test=dict(
        type=dataset_type,
        data_prefix='data/my_dataset/test',
        ann_file='data/my_dataset/meta/test.txt',
        classes=classes,
        pipeline=test_pipeline
    )
)

evaluation = dict(       # The config to build the evaluation hook, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/evaluation/eval_hooks.py#L7 for more details.
    interval=1,          # Evaluation interval
    metric='accuracy')   # Metrics used during evaluation

다음으로  optimizer를 세팅해주고 learing rate, runner를 설정해주는 training shedule을 세팅해준다. runner는 epoch을 기준으로 학습을 진행하는 EpochBaseRunner, iteration을 기준으로 학습을 진행하는 IterBasedRunner가 있다. 

optimizer = dict(type='SGD',         
                lr=0.1,              
                momentum=0.9,        
                weight_decay=0.0001) 
optimizer_config = dict(grad_clip=None)  # Most of the methods do not use gradient clip
lr_config = dict(policy='step',         
                 step=[30, 60, 90])      # Steps to decay the learning rate
runner = dict(type='IterBasedRunner', max_iters=100)

마지막으로 checkpoint와, logger, 학습 진행 횟수 등을 runtime setting을 통해서 설정해준다.

# Config to set the checkpoint hook, Refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py for implementation.
checkpoint_config = dict(interval=1)    # The save interval is 1
# config to register logger hook
log_config = dict(
    interval=100,                       # Interval to print the log
    hooks=[
        dict(type='TextLoggerHook'),           # The Tensorboard logger is also supported
        # dict(type='TensorboardLoggerHook')
    ])

dist_params = dict(backend='nccl')   # Parameters to setup distributed training, the port can also be set.
log_level = 'INFO'             # The output level of the log.
resume_from = None             # Resume checkpoints from a given path, the training will be resumed from the epoch when the checkpoint's is saved.
workflow = [('train', 1)]      # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once.
work_dir = 'work_dir'          # Directory to save the model checkpoints and logs for the current experiments.

이렇게 구체적인 config 설정을 만들지 않고 간단하게 기본 config file을 상속받아 config file을 build할 수 있다. 

_base_ = [
    '../_base_/models/resnet50.py',           # model
    '../_base_/datasets/imagenet_bs32.py',    # data
    '../_base_/schedules/imagenet_bs256.py',  # training schedule
    '../_base_/default_runtime.py'            # runtime setting
]

또는 다음과 같이 config를 불러오면서 몇가지 설정만 변경할 수 있다.