config/base/datasets
config/base/models
config/base/schedules
config/{사용할 모델들}/{사용할 모델.py}

dataset_type = 'CLP'
data_root = '/root/dataset_clp/'
내용은 coco.py를 복사한다
@DATASETS.register_module()
class CLP(BaseDetDataset):
"""Dataset for COCO."""
METAINFO = {
'classes':
('License Plate'),
# palette is a list of color tuples, which is used for visualization.
'palette':
[(220, 20, 60)]
}
COCOAPI = COCO
# ann_id is unique in coco dataset.
...
...
클래스 명을 변경, METAINFO의 내용을 변경한다.
num_classes : 기본적으로 coco에 맞춰 80으로 되어있기에 데이터 셋에 맞는 클래스 수로 모두 변경한다. 나는 clp 한 개의 클래스이므로 1로 변경하였음
mask 부분 : 만약 segmenation 목적이 아닌 데이터 셋이라면 mask 정보가 없어야 하므로 이를 주석처리한다. (모두)
아래의 블로그에서 참조하였음
#
# bash ./tools/dist_train.sh \
# /root/mmdetection/configs/clp/mask-rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py \
# 2 \
# 각 모델의 base가 되는(참조하는) py들 (각 py에 들어가서 수정해줄 필요가 있다)
_base_ = [
'../_base_/models/mask-rcnn_r50_fpn_clp.py',
'../_base_/datasets/clp_detection.py',
'../_base_/schedules/schedule_clp.py', '../_base_/default_runtime.py'
]
pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa
model = dict(
# type='MaskRCNN',
backbone=dict(
_delete_=True,
type='SwinTransformer',
embed_dims=96,
depths=[2, 2, 6, 2],
num_heads=[3, 6, 12, 24],
window_size=7,
mlp_ratio=4,
qkv_bias=True,
qk_scale=None,
drop_rate=0.,
attn_drop_rate=0.,
drop_path_rate=0.2,
patch_norm=True,
out_indices=(0, 1, 2, 3),
with_cp=False,
convert_weights=True,
init_cfg=dict(type='Pretrained', checkpoint=pretrained)),
neck=dict(in_channels=[96, 192, 384, 768]))
# augmentation strategy originates from DETR / Sparse RCNN
train_pipeline = [
dict(type='LoadImageFromFile', backend_args={{_base_.backend_args}}),
# dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
dict(type='LoadAnnotations', with_bbox=True, with_mask=False),
dict(type='RandomFlip', prob=0.5),
dict(
type='RandomChoice',
transforms=[[
dict(
type='RandomChoiceResize',
scales=[(480, 1333), (512, 1333), (544, 1333), (576, 1333),
(608, 1333), (640, 1333), (672, 1333), (704, 1333),
(736, 1333), (768, 1333), (800, 1333)],
keep_ratio=True)
],
[
dict(
type='RandomChoiceResize',
scales=[(400, 1333), (500, 1333), (600, 1333)],
keep_ratio=True),
dict(
type='RandomCrop',
crop_type='absolute_range',
crop_size=(384, 600),
allow_negative_crop=True),
dict(
type='RandomChoiceResize',
scales=[(480, 1333), (512, 1333), (544, 1333),
(576, 1333), (608, 1333), (640, 1333),
(672, 1333), (704, 1333), (736, 1333),
(768, 1333), (800, 1333)],
keep_ratio=True)
]]),
dict(type='PackDetInputs')
]
train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
max_epochs = 36
train_cfg = dict(max_epochs=max_epochs)
# learning rate
param_scheduler = [
dict(
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0,
end=1000),
dict(
type='MultiStepLR',
begin=0,
end=max_epochs,
by_epoch=True,
milestones=[27, 33],
gamma=0.1)
]
# optimizer
optim_wrapper = dict(
type='OptimWrapper',
paramwise_cfg=dict(
custom_keys={
'absolute_pos_embed': dict(decay_mult=0.),
'relative_position_bias_table': dict(decay_mult=0.),
'norm': dict(decay_mult=0.)
}),
optimizer=dict(
_delete_=True,
type='AdamW',
lr=0.0001,
betas=(0.9, 0.999),
weight_decay=0.05))
python tools/analysis_tools/analyze_logs.py plot_curve log.json --keys loss_cls --legend loss_cls
log_config = dict(
interval=100,
hooks=[
dict(type='TextLoggetHook'),
# dict(type='TensorboardLoggerHook')
])
log_level = 'INFO'
dist_params = dict(backend='nccl')