본문 바로가기
OpenMMLab(미공개)/MMDetection

[MMDetection] Train & Test - Configs

by cogito21_python 2024. 1. 13.
반응형

- MMDetection repositories는 MMEngine's config system을 이용
- Reference: https://mmdetection.readthedocs.io/en/latest/user_guides/config.html

Model Config

- backbone, neck과 같은 neural network 구성요소들과 data_preprocessor, train_cfg, test_cfg들이 요구됨.

- data_preprocessor는 DataLoader에 의한 data output을 처리함.

- train_cfg, test_cfg는 학습과 평가를 하는 hyperparameter를 훈련하고 테스트하기 위한 구성요소

# 모델 설정
model = dict(
  type="detector이름",
  data_preprocessor=dict(
    type="DetDataPreprocessor",
    ...)
  backbone=dict(
    type="모델명",
    depth=50,
    ...
    init_cfg=dict(type="Pretrained", checkpoint="..."))
  neck=dict(
    type="FPN"
    ...)
  rpn_head=dict(
    type="PRNHead",
    ...
    )
  roi_head=dict(
    type="StandardRoIHead",
    ...
    )
  )
  
 # 학습 및 평가 하이퍼 파라미터 설정
  train_cfg=dict(
    rpn=dict()
    rpn_proposal=dict()
    rcnn=dict()
    )
  test_cfg=dict(
    rpn=dict(),
    rcnn=dict()
    )

 

Dataset and evaluator config

- Dataset은 runner의 training, validation과 testing을 위해 필요.

- Evaluator는 학습 모델을 검증 및 평가를 할 때 사용하는 평가 지표.

- test dataset이 annotation file이 없다면 test_dataloader와 test_evaluator config는 val과 동일

dataset_type = "CocoDataset"   # 데이터셋 차입
data_root = "data/coco/"       # root path of data
backend_args = None            # 

# 학습 및 평가시 data 진행 파이프라인
train_pipeline = [
  dict(type="LoadImageFromFile", backend_args=backend_args),
  dict(type="LoadAnnotations", with_bbox=True, with_mask=True, poly2mask=True),
  dict(type='PackDetInputs')
]

test_pipeline = [
  dict(type='LoadImageFromFile', backend_args=backend_args),
  dict(type='Resize', scale=(1333, 800), keep_ratio=True), 
  dict(type='PackDetInputs', meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape','scale_factor'))
]

# 학습, 검증 및 평가 datloader config
train_dataloader=dict()
val_dataloader=dict()
test_dataloader=dict()

# 평가를 위한 지표
val_evaluator=dict()
test_evaluator=dict()

 

Training and test config

- MMEngine's runner는 학습, 검증 및 평가를 조절하기 위해 Loop를 이용. epoch, validataion invervals을 설정 가능.

train_cfg=dict(type='EpochBasedTrainLoop', max_epoch=12, val_interval=1)
val_cfg=dict(type='ValLoop')
test_cfg=dict(type='TestLoop')

 

Optimization Config

- optim_wrapper는 최적화 설정을 구성하는 영역. optimizer외에도 gradient clipping, mixed precision training등을 지원.

- optimizer wrapper: https://mmengine.readthedocs.io/en/latest/tutorials/optim_wrapper.html

optim_wrapper = dict(
  type="OptimWrapper",
  optimizer=dict(
    type='SGD',
    lr=0.02,
    momentum=0.9,
    weight_decay=0.0001),
  clip_grad=None,
)

 

- param_scheduler는 learning rate나 momentum 같은 optimization hyperparameters을 조정하는 방식을 설정하는 영역

param_scheduler = [
    dict(type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
    dict(type='MultiStepLR', by_epoch=True, begin=0, end=12, milestones=[8, 11], gamma=0.1)
]

 

Hook config

- 학습, 검증 및 평가시 Hook을 이용하여 여러 연산들을 삽입 가능.  default_hooks, custom_hooks 두 가지 hook이 존재

- default_hooks: dict형태의 hook configs. 수정해서는 안되는 우선 순위가 존재. 미설정시 runner는 기본값을 설정

- custom_hooks은 모든 다른 hook configs의 리스트. 사용자가 정의 hook.

default_hooks = dict(
    timer=dict(type='IterTimerHook'),  # Update the time spent during iteration into message hub
    logger=dict(type='LoggerHook', interval=50),  # Collect logs from different components of Runner and write them to terminal, JSON file, tensorboard and wandb .etc
    param_scheduler=dict(type='ParamSchedulerHook'), # update some hyper-parameters of optimizer
    checkpoint=dict(type='CheckpointHook', interval=1), # Save checkpoints periodically
    sampler_seed=dict(type='DistSamplerSeedHook'),  # Ensure distributed Sampler shuffle is active
    visualization=dict(type='DetVisualizationHook'))  # Detection Visualization Hook. Used to visualize validation and testing process prediction results

 

Runtime config

default_scope = 'mmdet' 

env_cfg = dict(...)

vis_backends = [dict(type='LocalVisBackend')]  
visualizer = dict(type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer')

log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True)  
log_level = 'INFO'  
load_from = None  
resume = False

 

Iter-based config

- train_cfg, param_scheduler, train_dataloader, default_hooks, log_processro를 수정.

# Iter-based training config
train_cfg = dict(_delete_=True, type='IterBasedTrainLoop', max_iters=90000, val_interval=10000)  

# Change the scheduler to iter-based
param_scheduler = [
    dict(type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
    dict(type='MultiStepLR', begin=0, end=90000, by_epoch=False, milestones=[60000, 80000], gamma=0.1)
]

# Switch to InfiniteSampler to avoid dataloader restart
train_dataloader = dict(sampler=dict(type='InfiniteSampler'))

# Change the checkpoint saving interval to iter-based
default_hooks = dict(checkpoint=dict(by_epoch=False, interval=10000))

# Change the log format to iter-based
log_processor = dict(by_epoch=False)

 

Config file Inheritance

- config/_base_아래에 4개의 기본 구성요소 dataset, model, schedule, default_runtime이 존재.

- 동일한 폴더 아래에 한가지 primitive cofnig만 갖는 것을 추천. 모든 config는 primitive config를 상속. 최대 상속 level은 3단계.

- 기존에 존재하지 않는 구조를 빌드할 경우 configs 폴더 아래에 xxx_rcnn과 같은 형태로 폴더 생성하여 구성.

- _base_ 필드를 설정해서 현재 config 파일이 상속되는 파일을 설정. 파일 경로의 문자열인 경우 하나의 config 파일에서 내용을 상속 받음.

- config 파일을 검사하려면 (python tools/misc/print_config.py config파일경로) 실행

_base_ = './mask_rcnn_..._coco.py'
_base_ = ['./_base_/models/models.py',
          './_base_/datasets/dataset.py',
          './_base_/schedules/schedule.py',
          './_base_/runtime.py']

 

Ignore some fields in the base configs

- _delete_=True로 설정하게 되면 base config읠 일부 field를 무시할 수 있음. 

_base_ = '../mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py'
model = dict(
    backbone=dict(
        _delete_=True,   # backbone 상속하지 않음
        type='HRNet',
        extra=dict(
            stage1=dict(
                num_modules=1,
                num_branches=1,
                block='BOTTLENECK',
                num_blocks=(4, ),
                num_channels=(64, )),
            stage2=dict(
                num_modules=1,
                num_branches=2,
                block='BASIC',
                num_blocks=(4, 4),
                num_channels=(32, 64)),
            stage3=dict(
                num_modules=4,
                num_branches=3,
                block='BASIC',
                num_blocks=(4, 4, 4),
                num_channels=(32, 64, 128)),
            stage4=dict(
                num_modules=3,
                num_branches=4,
                block='BASIC',
                num_blocks=(4, 4, 4, 4),
                num_channels=(32, 64, 128, 256))),
        init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')),
    neck=dict(...))

 

Use intermediate variables in configs

- 중간 변수를 수정하는 경우 train_pipeline/test_pipeline을 새로 정의

- SyncBN이나 BN, MMSyncBN을 변경할 경우 norm_cfg를 수정.

_base_ = './mask-rcnn_r50_fpn_1x_coco.py'

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
    dict(
        type='RandomResize', scale=[(1333, 640), (1333, 800)],
        keep_ratio=True),
    dict(type='RandomFlip', prob=0.5),
    dict(type='PackDetInputs')
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='Resize', scale=(1333, 800), keep_ratio=True),
    dict(
        type='PackDetInputs',
        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                   'scale_factor'))
]
train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
test_dataloader = dict(dataset=dict(pipeline=test_pipeline))


norm_cfg = dict(type='BN', requires_grad=True)
model = dict(
    backbone=dict(norm_cfg=norm_cfg),
    neck=dict(norm_cfg=norm_cfg),
    ...)

 

Reuse variables in _base_ file

- {{_base_.xxx}}로 변수 재사용

 

Modify config through script arguments

- tools/train.py나 tools/test.py를 사용할 경우, --cfg-options 지정하여 구성을 수정.

 

반응형

'OpenMMLab(미공개) > MMDetection' 카테고리의 다른 글

[MMDetection] Customization - Models  (0) 2024.01.13
[MMDetection] 기본 개념  (0) 2024.01.13
[MMDetection] 환경설정  (0) 2024.01.13
[MMDetection] 개요  (0) 2024.01.13