Skip to content
Snippets Groups Projects
Commit 56ff42eb authored by Hwasik Jeong's avatar Hwasik Jeong
Browse files

add 번역페이지.md

parent 94e0e467
No related branches found
No related tags found
No related merge requests found
# 사전 설정(Config) 알아보기
MMDetection 및 기타 OpenMMLab Repository는 MMEngine의 구성 요소 설정(Config) 시스템을 사용한다. 이 시스템은 모듈형 설계와 상속 구조를 가지고 있어 다양한 실험을 수행하는 데 편리하다.
## 구성 요소 설정(Config) 파일 내용
MMDetection은 모듈형 설계 방법론을 사용하며, 다양한 기능을 가진 모든 모듈은 구성 요소 설정(config) 파일을 통해 설계할 수 있다. 이번 문서에서는 Mask R-CNN을 예로 들어, 각기 다른 구성 요소(Model, Optimizer, Data Processor 등)에 따른 설정(config) 파일의 역할 및 기능을 설명한다.
## 모델 설정(config)
MMDetection의 모델 설정(config) 파일에서 `model`이라는 변수는 Detection 알고리즘의 모델 구성 요소(`backbone`, `neck`, `head` 등)를 설정하며, 이 외에도 데이터를 처리하는 `data_preprocessor`, 학습 및 테스트 하이퍼 파라미터(hyperparameter)를 설정하는 `train_cfg`, `test_cfg` 변수들이 사용된다.
```
model = dict(
####################################### 전체 모델 설정 #######################################################
type='MaskRCNN', # 전체 모델의 이름
data_preprocessor=dict( # 데이터 전처리기 설정, 보통 이미지 정규화와 패딩을 포함
type='DetDataPreprocessor', # 데이터 전처리기의 종류
mean=[123.675, 116.28, 103.53], # 백본(backbone) 모델을 사전 학습에 사용한 평균값 (R, G, B 순서)
std=[58.395, 57.12, 57.375], # 백본(backbone) 모델을 사전 학습에 사용한 표준 편차 (R, G, B 순서)
bgr_to_rgb=True, # 이미지를 BGR에서 RGB로 변환할지 여부
pad_mask=True, # 객체 마스크를 패딩할지 여부
pad_size_divisor=32 # 패딩된 이미지 크기는 이 값으로 나누어 떨어져야 함
),
####################################### 백본(Backbone) 설정 #######################################################
backbone=dict( # 백본(backbone) 설정
type='ResNet', # 백본(backbone) 종류
depth=50, # 백본(backbone)의 깊이, 보통 ResNet 계열은 50이나 101
num_stages=4, # 백본(backbone)의 스테이지 수
out_indices=(0, 1, 2, 3), # 각 스테이지에 대응되는 인덱스
frozen_stages=1, # 첫 번째 스테이지의 가중치 고정
norm_cfg=dict( # 정규화 레이어 설정
type='BN', # 정규화 레이어 타입, 보통 BN(Batch 정규화) 또는 GN(Group 정규화)
requires_grad=True # BN의 감마와 베타를 학습할지 여부
),
norm_eval=True, # BN 통계를 고정할지 여부
style='pytorch', # 백본(backbone)의 스타일(e.g. Pytorch, Tensorflow, 등)
init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), # ImageNet으로 사전 학습된 백본(backbone) 모델을 불러옴
####################################### 넥(Neck) 설정 #######################################################
neck=dict( # 넥(neck) 설졍
type='FPN', # 넥(neck)의 종류
in_channels=[256, 512, 1024, 2048], # 입력 채널, 백본 출력 채널과 일치해야 함
out_channels=256, # FPN의 각 레벨에 대한 출력 채널
num_outs=5 # 출력 스케일의 수
),
####################################### RPN 헤드(RPN Head) 설정 #######################################################
rpn_head=dict( # RPN 헤드(head) 설정
type='RPNHead', # RPN 헤드(head)의 종류
in_channels=256, # 각 입력 피처 맵의 채널
feat_channels=256, # 헤드(head)의 컨볼루션 레이어에서 사용되는 피처 채널
anchor_generator=dict( # 앵커 생성기 설정
type='AnchorGenerator', # 대부분 AnchorGenerator를 사용
scales=[8], # 앵커의 기본 스케일
ratios=[0.5, 1.0, 2.0], # 높이와 너비의 비율
strides=[4, 8, 16, 32, 64] # 앵커 생성기의 스트라이드
),
bbox_coder=dict( # 예측을 위한 박스 설정
type='DeltaXYWHBBoxCoder', # 박스 형식 타입
target_means=[0.0, 0.0, 0.0, 0.0], # 박스를 인코딩 및 디코딩할 때 사용되는 평균값
target_stds=[1.0, 1.0, 1.0, 1.0] # 박스를 인코딩 및 디코딩할 때 사용되는 표준 편차
),
loss_cls=dict( # Classification의 손실 함수 설정
type='CrossEntropyLoss', # Classification 손실 함수 종류
use_sigmoid=True, # 보통 두 가지 클래스 분류에 sigmoid 함수 사용
loss_weight=1.0 # Classifcation 손실 가중치
),
loss_bbox=dict( # 박스 회귀 손실 함수 설정
type='L1Loss', # 손실 종류
loss_weight=1.0 # 박스 회귀 브랜치 손실 가중치
)
),
####################################### ROI 헤드(ROI Head) 설정 #######################################################
roi_head=dict( # RoIHead는 두 번째 스테이지
type='StandardRoIHead', # RoIHead의 종류
bbox_roi_extractor=dict( # 박스 회귀를 위한 RoI 피처 추출기
type='SingleRoIExtractor', # RoI 피처 추출기의 종류
roi_layer=dict( # RoI 레이어 설정
type='RoIAlign', # RoI Layer 타입
output_size=7, # 출력 피처 맵의 크기
sampling_ratio=0 # RoI 피처를 추출할 때 샘플링 비율
),
out_channels=256, # 추출된 피처의 출력 채널
featmap_strides=[4, 8, 16, 32] # 멀티스케일 피처 맵의 스트라이드
),
bbox_head=dict( # RoIHead의 박스 헤드 설정
type='Shared2FCBBoxHead', # 박스 헤드 종류
in_channels=256, # 박스 헤드의 입력 채널
fc_out_channels=1024, # FC 레이어의 출력 피처 채널
roi_feat_size=7, # RoI 피처의 크기
num_classes=80, # 클래스 수
bbox_coder=dict( # 2단계의 박스 코더 설정
type='DeltaXYWHBBoxCoder', # 박스 코더 종류
target_means=[0.0, 0.0, 0.0, 0.0], # 박스 인코딩 및 디코딩에 사용되는 평균값
target_stds=[0.1, 0.1, 0.2, 0.2] # 박스 인코딩 및 디코딩에 사용되는 표준 편차
),
reg_class_agnostic=False, # 회귀가 클래스와 무관한지 여부
loss_cls=dict( # Classification 손실 함수 설정
type='CrossEntropyLoss', # Classification 손실 타입
use_sigmoid=False, # sigmoid 사용 여부
loss_weight=1.0 # Classification 손실 가중치
),
loss_bbox=dict( # 회귀 브랜치 손실 함수 설정
type='L1Loss', # 손실 종류
loss_weight=1.0) # 회귀 손실 가중치
),
mask_roi_extractor=dict( # 마스크 생성용 RoI 피처 추출기
type='SingleRoIExtractor', # RoI 피처 추출기의 종류
roi_layer=dict( # 객체 segmentation을 위한 RoI 레이어 설정
type='RoIAlign', # RoI 레이어의 종류
output_size=14, # 출력 피처 맵의 크기
sampling_ratio=0 # RoI 피처 추출 샘플링 비율
),
out_channels=256, # 추출된 피처의 출력 채널
featmap_strides=[4, 8, 16, 32] # 멀티스케일 피처 맵의 스트라이드
),
mask_head=dict( # 마스크 예측 헤드
type='FCNMaskHead', # 마스크 헤드 종류
num_convs=4, # 마스크 헤드의 컨볼루션 레이어 수
in_channels=256, # 입력 채널
conv_out_channels=256, # 컨볼루션 레이어의 출력 채널
num_classes=80, # Segmentation의 클래스 수
loss_mask=dict( # 마스크 부분 손실 함수 설정
type='CrossEntropyLoss', # Segmentation에 사용되는 손실 종류
use_mask=True, # 올바른 클래스에서만 마스크 학습 여부
loss_weight=1.0 # 마스크 부분 손실 가중치
)
)
),
####################################### 훈련(train) 설정 #######################################################
train_cfg = dict( # RPN과 RCNN의 훈련 하이퍼파라미터 설정
rpn=dict( # RPN의 훈련 설정
assigner=dict( # Assigner의 설정
type='MaxIoUAssigner', # Assigner의 종류, MaxIoUAssigner는 많은 공통된 Detector에서 사용됨. 자세한 내용은 https://github.com/open-mmlab/mmdetection/blob/main/mmdet/models/task_modules/assigners/max_iou_assigner.py#L14 참조.
pos_iou_thr=0.7, # IoU >= 0.7을 양성(+)으로 간주
neg_iou_thr=0.3, # IoU < 0.3을 음성(-)으로 간주
min_pos_iou=0.3, # 양성으로 간주할 최소 IoU 임계값
match_low_quality=True, # 낮은 품질의 박스를 일치시킬지 여부 (API 문서에서 더 많은 세부 정보를 확인)
ignore_iof_thr=-1 # 낮은 품질의 박스를 무시하기 위한 IoF 임계값
),
sampler=dict( # 양성 혹은 음성 샘플러의 설정
type='RandomSampler', # 샘플러의 종류, PseudoSampler와 다른 샘플러들도 지원됨. 구현 세부 사항은 https://github.com/open-mmlab/mmdetection/blob/main/mmdet/models/task_modules/samplers/random_sampler.py#L14 참조.
num=256, # 샘플의 수
pos_fraction=0.5, # 총 샘플 중 양성의 비율
neg_pos_ub=-1, # 양성 샘플 수에 기반한 음성의 상한선
add_gt_as_proposals=False), # 샘플링 후 정답을 후보군으로 추가할지 여부
allowed_border=-1, # 유효한 앵커에 대해 패딩 후 허용되는 경계
pos_weight=-1, # 훈련 중 양성 샘플의 가중치
debug=False # 오류 분석 설정 여부
),
rpn_proposal=dict( # 훈련 중 후보군을 생성하기 위한 설정
nms_across_levels=False, # 레벨 간에 NMS를 수행할지 여부. 'GARPNHead'에서만 작동하며, 기본 RPN에서는 레벨 간 NMS를 지원하지 않음.
nms_pre=2000, # NMS 이전에 박스의 수
nms_post=1000, # NMS 후 남길 박스의 수. 'GARPNHead'에서만 작동
max_per_img=1000, # NMS 후 각 이미지에서 남길 박스의 수
nms=dict( # NMS 설정
type='nms', # NMS 종류
iou_threshold=0.7 # NMS 임계값
),
min_bbox_size=0 # 허용된 최소 박스 크기
),
rcnn=dict( # ROI 헤드의 설정
assigner=dict( # 두 번째 단계의 Assigner 설정, RPN과 다름
type='MaxIoUAssigner', # Assigner의 종류, MaxIoUAssigner는 모든 roi_heads에서 사용됨. 자세한 내용은 https://github.com/open-mmlab/mmdetection/blob/main/mmdet/models/task_modules/assigners/max_iou_assigner.py#L14 참조.
pos_iou_thr=0.5, # IoU >= 0.5를 양성(+)으로 간주
neg_iou_thr=0.5, # IoU < 0.5를 음성(-)으로 간주
min_pos_iou=0.5, # 양성으로 간주할 최소 IoU 임계값
match_low_quality=False, # 낮은 품질의 박스를 일치시킬지 여부 (API 문서에서 더 많은 세부 정보를 확인)
ignore_iof_thr=-1 # 낮은 품질의 박스를 무시하기 위한 IoF 임계값
),
sampler=dict(
type='RandomSampler', # 샘플러의 종류, PseudoSampler와 다른 샘플러들도 지원됨. 구현 세부 사항은 https://github.com/open-mmlab/mmdetection/blob/main/mmdet/models/task_modules/samplers/random_sampler.py#L14 참조.
num=512, # 샘플의 수
pos_fraction=0.25, # 총 샘플 중 양성 샘플의 비율
neg_pos_ub=-1, # 양성 샘플 수에 기반한 음성 샘플의 상한선
add_gt_as_proposals=True # 샘플링 후 정답을 후보군으로 추가할지 여부
),
mask_size=28, # 마스크 크기
pos_weight=-1, # 훈련 중 양성 샘플의 가중치
debug=False) # 오류 분석 설정 여부
),
####################################### 테스트(test) 설정 #######################################################
test_cfg = dict( # RPN과 RCN의 테스트(test) 하이퍼파라미터(hyperparameter) 설정
rpn=dict( # 테스트 중 후보군을 생성하기 위한 설정
nms_across_levels=False, # 레벨 간에 NMS를 수행할지 여부. 'GARPNHead'에서만 작동하며, 기본 RPN에서는 레벨 간 NMS를 지원하지 않음.
nms_pre=1000, # NMS 이전에 박스의 수
nms_post=1000, # NMS 후 남길 박스의 수. 'GARPNHead'에서만 작동
max_per_img=1000, # NMS 후 각 이미지에서 남길 박스의 수
nms=dict( # NMS 설정
type='nms', # NMS 종류
iou_threshold=0.7 # NMS 임계값
),
min_bbox_size=0 # 허용된 최소 박스 크기
),
rcnn=dict( # ROI 헤드의 설정
score_thr=0.05, # 박스를 거르기 위한 임계값
nms=dict( # 두 번째 단계에서 NMS의 설정
type='nms', # NMS 종류
iou_thr=0.5 # NMS 임계값
),
max_per_img=100, # 각 이미지에서 최대 예측 수
mask_thr_binary=0.5 # 마스크 예측의 임계값
)
)
)
```
## 데이터셋(Dataset) 및 평가에 대한 설정
Runner는 MMDetection 프레임워크에서 모델을 훈련(train), 검증(validation), 테스트(test)를 하기 위한 기본적이고 필수적인 모듈이다. 이런 Runner를 사용하기 위해서는 데이터로더(DataLoader)가 필요하다. 데이터로더를 구축하려면 데이터셋과 데이터 파이프라인(이미지 크기 재설정 등과 같은 데이터 전처리 과정)을 설정해야 하며 이 부분의 복잡성을 줄이기 위해 데이터로더의 다양한 변수들이 사용된다.
```
dataset_type = 'CocoDataset' # 데이터셋의 유형 (예를 들어 CocoDataset, VOCDataset, 등)
data_root = 'data/coco/' # 데이터의 루트 경로
backend_args = None # 해당 파일 백엔드를 객체화하기 위한 인자들
####################################### 데이터 파이프라인 ###################################################
train_pipeline = [ # 훈련(train) 데이터 처리 파이프라인
dict(type='LoadImageFromFile', backend_args=backend_args), # 파일 경로에서 이미지를 불러오는 첫 번째 파이프라인
dict(
type='LoadAnnotations', # 현재 이미지에 대한 주석을 가져오는 두 번째 파이프라인
with_bbox=True, # 박스를 사용할지 여부, Detection이면 True로 설정
with_mask=True, # Segmentation을 위한 마스크를 사용할지 여부, Segmentation이면 True
poly2mask=True # 다각형 마스크를 객체 마스크로 변환할지 여부, 가속화 및 메모리 절약을 위해 False로 설정
),
dict(
type='Resize', # 이미지 크기 및 속성들(예를 들어 객체 마스크나 박스)을 변경하는 파이프라인
scale=(1333, 800), # 이미지의 최대 크기
keep_ratio=True # 높이와 너비 비율을 유지할지 여부
),
dict(
type='RandomFlip', # 이미지를 뒤집는 데이터 증강 파이프라인
prob=0.5 # 뒤집을 확률
),
dict(type='PackDetInputs') # 속성 데이터를 포맷하고 데이터를 샘플로 묶는 키를 결정하는 파이프라인
]
test_pipeline = [ # 테스트(test) 데이터 처리 파이프라인
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')
)
]
####################################### 데이터로더(DataLoader) ###################################################
train_dataloader = dict( # 훈련(train) 데이터로더 설정
batch_size=2, # 단일 GPU의 배치 크기
num_workers=2, # 각 GPU에서 데이터를 미리 가져오는 워커 프로세스 수
persistent_workers=True, # True로 설정하면 한 에폭 종료 후 데이터로더가 워커 프로세스를 종료하지 않으며 훈련 속도가 가속화됨
sampler=dict( # 훈련 데이터 샘플러
type='DefaultSampler', # DefaultSampler는 분산 훈련과 비분산 훈련 모두 지원함. 자세한 내용은 https://mmengine.readthedocs.io/en/latest/api/generated/mmengine.dataset.DefaultSampler.html#mmengine.dataset.DefaultSampler 참고
shuffle=True # 매 에폭마다 훈련 데이터를 무작위로 섞음
),
batch_sampler=dict(type='AspectRatioBatchSampler'), # 비슷한 가로세로 비율을 가진 이미지를 같은 배치에 묶는 배치 샘플러. GPU 메모리 비용을 줄일 수 있음.
dataset=dict( # 훈련 데이터셋 설정
type=dataset_type,
data_root=data_root,
ann_file='annotations/instances_train2017.json', # 이미지 속성 파일 경로
data_prefix=dict(img='train2017/'), # 이미지 경로의 접두어
filter_cfg=dict(filter_empty_gt=True, min_size=32), # 제한되는 이미지 및 속성을 걸러내는 설정
pipeline=train_pipeline,
backend_args=backend_args
)
)
val_dataloader = dict( # 검증(validation) 데이터로더 설정
batch_size=1, # 단일 GPU의 배치 크기. 배치 크기가 1보다 크면 여분의 패딩 영역이 성능에 영향을 줄 수 있음.
num_workers=2, # 각 GPU에서 데이터를 미리 가져오는 워커 프로세스 수
persistent_workers=True, # True로 설정하면 한 에폭 종료 후 데이터로더가 워커 프로세스를 종료하지 않으며 훈련 속도가 가속화됨.
drop_last=False, # 마지막 불완전한 배치를 버릴지 여부 (불완전한 배치: 데이터셋 크기가 배치 크기로 나누어지지 않는 경우)
sampler=dict(
type='DefaultSampler',
shuffle=False # 검증 및 테스트 시 섞지 않음
),
dataset=dict(
type=dataset_type,
data_root=data_root,
ann_file='annotations/instances_val2017.json',
data_prefix=dict(img='val2017/'),
test_mode=True, # 데이터셋의 테스트 모드를 활성화하여 이미지나 그에 대한 속성 정보를 걸러내지 않음
pipeline=test_pipeline,
backend_args=backend_args))
test_dataloader = val_dataloader # 테스트 데이터로더 설정 (검증 데이터로더와 동일하게 설정 가능)
```
Evaluator는 MMDetection 프레임워크에서 모델을 평가하는데 사용되는 모듈이다. Evaluator는 검증(validation) 및 테스트(test) 데이터셋에서 훈련된 모델의 평가 지표를 계산하는 데 사용된다. Evaluator는 하나 이상의 평가 지표를 구성하여 설정할 수 있다.
```
val_evaluator = dict( # Evaluator 설정
type='CocoMetric', # AR, AP 및 mAP를 평가하는 데 사용되는 coco 평가 지표
ann_file=data_root + 'annotations/instances_val2017.json', # 이미지 속성 정보 파일 경로
metric=['bbox', 'segm'], # 사용할 평가 지표 , 'bbox'는 detection을 할 때, 'segm'은 segmentation을 할 때 사용됨
format_only=False,
backend_args=backend_args)
test_evaluator = val_evaluator # 테스트 Evaulator 설정
```
테스트 데이터셋에는 이미지 속성 파일이 없기 때문에, MMDetection에서 `test_dataloader``test_evaluator` 설정은 일반적으로 검증(validation)에서의 설정과 동일하다. 테스트 데이터셋에서 detection 결과를 저장하려면, 아래와 같이 설정을 작성할 수 있다.
```
# 테스트(test) 데이터셋에서 추론하고 출력 결과를 정리함.
test_dataloader = dict(
batch_size=1,
num_workers=2,
persistent_workers=True,
drop_last=False,
sampler=dict(type='DefaultSampler', shuffle=False),
dataset=dict(
type=dataset_type,
data_root=data_root,
ann_file=data_root + 'annotations/image_info_test-dev2017.json',
data_prefix=dict(img='test2017/'),
test_mode=True,
pipeline=test_pipeline
)
)
test_evaluator = dict(
type='CocoMetric',
ann_file=data_root + 'annotations/image_info_test-dev2017.json',
metric=['bbox', 'segm'], # 사용할 평가 지표
format_only=True, # 결과를 정리하고 coco json 파일에 저장만 수행함
outfile_prefix='./work_dirs/coco_detection/test' # 출력 json 파일의 접두어
)
```
......@@ -250,7 +250,7 @@ val_evaluator = dict( # Validation evaluator config
test_evaluator = val_evaluator # Testing evaluator config
```
Since the test dataset has no annotation files, the test_dataloader and test_evaluator config in MMDetection are generally equal to the val’s. If you want to save the detection results on the test dataset, you can write the config like this:
Since the test dataset has no annotation files, the `test_dataloader` and `test_evaluator` config in MMDetection are generally equal to the val’s. If you want to save the detection results on the test dataset, you can write the config like this:
```
# inference on test dataset and
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment