- 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 |