Skip to main content

MMDetection과Weights & Biases를 사용하는 방법

이번 리포트에서는 MMDetection을 이용한 객체 감지 모델을 트레이닝하고MMDetWandbHook을 사용하는 방법에 대해 알아보겠습니다.
Created on June 21|Last edited on June 21
이는 여기에서 볼 수 있는 영어 기사를 번역한 것이다.




목차



서론

오늘의 목표는 단순합니다. MMDetection을 사용하여 객체 감지 모델을 트레이닝하고 Weights & Biases를 사용하여 트레이닝 및 검증 메트릭을 기록하고 모델 예측, 버전 원본 검증 데이터 세트 등을 시각화하는 데 어떻게 도움이 되는지 확인할 것입니다. 보다 구체적으론, 작은Balloon 데이터 세트에서 Mask RCNN 모델을 트레이닝할 것입니다. 본격적으로 시작하기 전에 MMDetection에 대해 조금 알아볼까요?
MMDetectionOpenMMLabs의 PyTorch 기반 객체 탐지 작업에 널리 사용되는 오픈 소스 저장소입니다. 사용자 지정 개체 감지 파이프라인을 쉽게 구축하는 데 사용할 수 있는 구성 가능한 모듈식 API 설계(composable and modular API design)를 제공합니다. 100개 이상의 사전 트레이닝 모델들이 있으며 표준 데이터셋을 즉시 제공합니다. 또한 단일 GPU 및 다중 GPU 트레이닝을 모두 지원합니다. GitHub 저장소는 여기에서 확인할 수 있습니다.
W&B 측에서는 이 게시물을 통해MMDetection을 위한 전용 MMDetWandbHook을 소개합니다.
✅ 트레이닝 및 평가 메트릭 로그
✅ 버전 별 모델 체크포인트 로그
✅ 실측 정보 경계 박스(ground truth bounding box)를 사용하여 버전 검증 데이터 세트 로그.
✅ 모델 예측의 로그와 시각화
이제 한번 알아보시죠.

설정


여기에선 사용자 지정 데이터 세트에서 MMDetection을 사용하여 트레이닝을 시작하는 데 필요한 모든 사항을 신속하게 설정할 것입니다. 실행 코드를 따라 진행하고 싶으시다면 위의 Colab 링크를 통해 시작할 수 있습니다.

MMDetection 설치

MMDetection은MMCV 라이브러리에 크게 의존합니다. 익숙하지 않은 경우 MMCV는 OpenMMLabs의 대부분의 프로젝트(저장소)에서 사용되는 기본 라이브러리입니다. 주어진 PyTorch 버전과 호환되는 올바른 버전의 MMCV를 설치해야 합니다. MMCV 및 MMDetection은 모두 pip 설치 가능합니다. 자세한 내용은 설치 설명서 페이지를 참고해주세요.
설치해야 하는 코드는 다음과 같습니다.
# Install PyTorch.
!pip install -qq torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

# Install mmcv-full.
!pip install -qq mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html

# Install mmdetection
!git clone https://github.com/open-mmlab/mmdetection
%cd mmdetection
!pip install -e .

Weights & Biases 설치

Python용 pip 패키지 설치 프로그램을 사용하여 Weights & Biases를 쉽게 설치할 수 있습니다. 만약 아직 W&B 계정을 만들지 않으셨다면, W&B의 가입 페이지를 방문하여 계정을 만드실 수 있습니다. 비밀 인증 토큰을 사용하여 로그인 후 W&B에 대한 실행(메트릭, 데이터 등)을 시작하도록 시스템을 인증할 수 있습니다.
!pip install -q --upgrade wandb

import wandb
wandb.login()

데이터 세트


위에서 언급했듯이, 작은balloon 데이터 세트를 사용할 것입니다. 아래 표시된 코드 조각을 사용하여 데이터 집합을 다운로드할 수 있습니다.
!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip
!unzip -q balloon_dataset.zip
새 데이터 형식을 지원하려면 주석을 COCO 형식 또는 PASCAL VOC 형식으로 변환하는 것이 좋습니다. 주석을 COCO 형식으로 변환하는 경우 오프라인에서 변환하고CocoDataset 클래스를 사용합니다. PASCAL 형식으로 변환하는 경우VOCDataset 클래스를 사용합니다. 이러한 클래스는 아래에 나와 있는 구성 시스템을 사용하여 할당할 수 있습니다. 저희가 어떻게 Balloon 데이터 세트의 형식을 변환하는지 보시려면 이 보고서와 관련된 colab 노트북을 확인해보세요. 사용자 지정 데이터 세트 사용에 대한 더욱 자세한 내용은 여기에서 확인할 수 있습니다.
MMDetWandbHook은 유효성 검사 데이터를 자동으로 기록합니다. 샘플 수는 num_eval_samples를 사용하여 확인할 수 있습니다. 곧MMDetWandbHook에 대해 자세히 알아보겠지만, 여기 데이터세트에 대한 간단한 미리보기가 있습니다. 아래 표시된 패널은 유효성 검사 데이터가 기록되는 W&B 테이블입니다.

Run set
0


모델


Model Zoo를 통해 MMDetection에 의해 제공되는 사전 트레이닝이 완료된 객체 탐지기는 수백 가지가 넘습니다. 관련 문서 페이지를 확인해보세요.
모델의 백본, 목, 머리, ROI 및 로스(backbone, neck, head, ROI, loss)를 쉽게 사용자 지정할 수 있으며 여기서 모델 사용자 지정에 대해 자세히 알아볼 수 있습니다. 이 튜토리얼에선 사전 트레이닝 된 모델 체크포인트를 사용하여 사용자 지정 데이터 세트에서 미세 조정할 것입니다. checkpoints 디렉토리에서 모델을 한번 다운로드해볼까요?
!mkdir checkpoints
!wget -c https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth \
-O checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth

환경 설정


MMDetection은 구성 시스템에 크게 의존합니다. 구성 시스템은 MMDetection의 모든 구성 요소를 함께 묶습니다. Faster R-CNN, Mask R-CNN, Cascade R-CNN, RPN, SSD, YOLO 등과 같은 모든 객체 감지 프레임워크들은 각 자체 구성 파일을 가지고 있습니다. 원하는 파일을 로드하고 필요에 따라 방법을 수정할 수 있습니다. 여기에서 MMDetection Config 시스템에 대해 자세히 알아보실 수 있습니다.
자, 대부분의config 파일은 네 가지 기본 구성 요소 유형인 config/__base__ - dataset, model, schedule, default_runtime을 사용하여 구성됩니다. 파일에서 필요한 수단을 직접 수정하거나 구성 파일을 로드 한 후 아래와 같이cfg 개체를 사용하여 요구되는 방법에 액세스하여 수정하실 수 있습니다.
config_file = 'mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py'
cfg = Config.fromfile(config_file)
여기에서COCODataset의 사용에 주목해주세요

# Define type and path to the images.
cfg.dataset_type = 'COCODataset'

cfg.data.test.ann_file = 'balloon/val/annotation_coco.json'
cfg.data.test.img_prefix = 'balloon/val/'
cfg.data.test.classes = ('balloon',)

cfg.data.train.ann_file = 'balloon/train/annotation_coco.json'
cfg.data.train.img_prefix = 'balloon/train/'
cfg.data.train.classes = ('balloon',)

cfg.data.val.ann_file = 'balloon/val/annotation_coco.json'
cfg.data.val.img_prefix = 'balloon/val/'
cfg.data.val.classes = ('balloon',)
데이터 세트에는 하나의 클래스(balloon)만 있기 때문에, 그에 따른 경계 상자 헤드와 마스크 헤드를 구축하기 위한 모델을 지정할 것입니다. 또한 이전 섹션에서 다운로드한 모델 체크포인트를 사용에 주목해주세요.
# modify num classes of the model in box head and mask head
cfg.model.roi_head.bbox_head.num_classes = 1
cfg.model.roi_head.mask_head.num_classes = 1

# Use the pretrained model.
cfg.load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'
이제 트레이닝 구성을 정의하겠습니다. checkpoint_config.intervalevaluation.interval을 사용에 유의해주세요. 나중에 유용하게 쓰일 것이니까요!
# The original learning rate (LR) is set for 8-GPU training.
# We divide it by 8 since we only use one GPU.
cfg.optimizer.lr = 0.02 / 8
cfg.lr_config.warmup = None
cfg.log_config.interval = 10

# Epochs
cfg.runner.max_epochs = 12

# Set seed thus the results are more reproducible
cfg.seed = 0
set_random_seed(0, deterministic=False)
cfg.gpu_ids = range(1)

# ⭐️ Set the checkpoint interval.
cfg.checkpoint_config.interval = 4

# Set up working dir to save files and logs.
cfg.work_dir = './tutorial_exps'
cfg.device = 'cuda'

# ⭐️ Set the evaluation interval.
cfg.evaluation.interval = 2
ML 실험을 재현할 수 있으려면 환경설정이 제대로 추적되어야 합니다. MMDetWandbHook을 사용하여 W&B에 구성을 기록하는 방법은 뒷부분에 나와 있습니다. MMDetWandbHook에 대해 이야기하기 전에 먼저 MMDetection 후크의 간략한 설명을 하겠습니다.

후크

일반적으로 후크는 특정 이벤트가 발생한 후 자동으로 실행되는 기능입니다. MMDetection은 구성 시스템의default_runtime 구성 요소를 통해 액세스할 수 있는 다양한 표준 후크를 제공합니다. 일부 구성 방법(이 튜토리얼에서 중요)은 아래에 나열되어 있습니다.
  • log_config - 이를 통해TextLoggerHook, MMDetWandbHook와 같은 다양한 로거 후크를 초기화합니다.
  • checkpoint_config - 이를 통해 MMCV의CheckpointHook을 초기화합니다. 이 후크는 위에서 구성 섹션에서 정의한 간격으로 모델 체크포인트를 저장합니다.
  • evaluation - 사용 가능한 GPU 수에 따라 MMCV의EvalHook 또는 DistEvalHook을 초기화합니다. 이 후크는 위에서 구성 섹션에서 정의한 간격으로 유효성 검사 데이터를 기반으로 모델을 평가합니다.
이 경우, log_configVERY_LOW 우선 순위를 가지며, 다른 후크는NORMAL 우선 순위를 가집니다.

Weights & Biases 전용 후크


MMDetection은 이제MMDetWandHook라고 하는 전용 Weights & Biases 후크와 함께 제공됩니다. 이 전용 후크를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
  • 시스템(CPU/GPU) 메트릭과 함께 트레이닝 및 평가 메트릭을 기록합니다.
  • 모델 체크포인트를 W&B 아티팩트로 저장합니다.
  • 검증 데이터 세트를 대화형 W&B 테이블로 시각화 합니다.
  • 모델 예측을 대화형 W&B 표로 시각화 합니다.
MMDetWandbHook는 로거 훅이므로log_config 방법을 사용하여 초기화할 수 있습니다.

사용

cfg.log_config.hooks = [
dict(type='TextLoggerHook'),
dict(type='MMDetWandbHook',
init_kwargs={'project': 'MMDetection-tutorial'},
interval=10,
log_checkpoint=True,
log_checkpoint_metadata=True,
num_eval_images=100)]
MMDetWandbHook에는 MMDetection을 최대한 활용할 수 있는 네 가지 중요한 인자가 있습니다. 바로 알아보도록 하죠.

로그 메트릭

트레이닝 및 평가 메트릭을 시스템 메트릭과 함께 기록하려면init_kwargs 인자를 사용해주세요. 이 인수에는 키-값 페어(key-value pair)의 사전이 사용되며, 이 사전은wandb.init에 전달됩니다. 이를 사용하여 W&B 프로젝트 이름을 설정하고, 팀 계정에 실행을 기록하려는 경우 팀 이름(entity)을 설정하고, 구성을 전달하는 등의 작업을 수행할 수 있습니다. 여기에서 wandb.init에 전달할 수 있는 모든 것엔 어떠한 것들이 있는지 확인해보세요.

트레이닝 메트릭:




검사 메트릭:




시스템 메트릭 + 기타:




체크포인트

MMDetection은 MMCV의CheckpointHook를 사용하여 정기적으로 모델 체크포인트를 저장합니다. 기간은checkpoint_config.interval에 의해 결정됩니다. 그러나 이러한 체크포인트는 로컬 파일에 저장되므로 새 실험에 의해 덮어 씌어질 수 있습니다.
log_checkpoint=True를 사용하여 이러한 체크포인트를 W&B 아티팩트로 안정적으로 저장할 수 있습니다. 체크포인트를 W&B 아티팩트로 저장하면 머신 간에 체크포인트를 쉽게 전송하고, 다른 모델 아이디어를 별도로 보관하고, 변형 간에 비교할 수 있습니다.
그림 1: W&B 아티팩트 UI. 체크포인트가 왼쪽에서 보시는 것과 같이 여러 버전으로 표시됩니다. 모델을 파일 탭에서 다운로드하거나 API를 사용하여 프로그래밍 방식으로 다운로드 하실 수 있습니다.
다음은 주목할 만한 몇 가지 사항입니다.
  • UI에는 위와 같이 3가지 버전의 체크포인트가 있습니다. 이는 모델이checkpoint_config.interval=4.로 12에폭(Epoch) 동안 트레이닝 되었기 때문입니다.
  • 각 버전에는epoch_x라는 별칭이 있습니다. 여기서x는 현재 에폭입니다.
  • 마지막 체크포인트는latest 별칭으로 표시됩니다.
로컬 및 W&B 저장 공간을 모두 저장할 수 있도록 체크포인트 간격을 주의하여 설정하시는 것을 추천합니다.

메타데이터를 사용한 체크포인트

체크포인트는 관련된 유용한 메타데이터가 있으면 훨씬 더 의미가 있을 수 있습니다. log_checkpoint_metadataTrue일 경우, 모든 체크포인트 버전에 메타데이터가 연결될 것입니다.
메타데이터는 현재 에폭과 함께 체크포인트를 사용하여 유효성 검사 데이터에 대해 계산된 평가 메트릭을 포함하는 키-값 페어의 사전입니다.

이 기능은CheckpointHookEvalHook 혹은 DistEvalHook에 따라 달라집니다. 메타데이터는 체크포인트 간격이 평가 간격(즉, ckpt_interval % eval_interval == 0)으로 분할될 경우에만 기록됩니다.

데이터 세트 및 모델 예측 시각화

데이터 세트와 특히 모델 예측을 대화형으로 시각화 하는 기능은 더 나은 모델을 구축하고 디버깅하는 데 도움이 될 수 있습니다. MMDetection은 GPU를 하나만 사용할 수 있는 경우EvalHook을 사용하고 여러 GPU를 사용할 수 있는 경우DistEvalHook을 사용하여 검증 데이터에 대해 정기적으로 모델을 평가합니다. 기간은evaluation.interval에 의해 관리됩니다 (위에 표시됨).
MMDetWandbHook을 사용하여 이제 검증 데이터를 W&B 테이블로 기록하고 모델 예측을 위한 버전W&B 테이블을 생성하실 수 있습니다. W&B 테이블은 각 열에 이미지, 텍스트, 스칼라 등의 단일 유형의 데이터가 있는 2차원 데이터 그리드입니다.
MMDetWandbHooknum_eval_images 인자는 W&B 테이블로 기록되는 유효성 검사 샘플 수를 제어합니다.
다음은 몇 가지 주의 사항입니다:
  • num_eval_images=0인 경우 검증 데이터와 모델 예측이 기록되지 않습니다.
  • mmdet.core.train_detector API에 대해validate=False인 경우 유효성 검사 데이터와 모델 예측이 기록되지 않습니다.
  • num_eval_images 숫자가 총 유효성 검사 샘플 수보다 높을 경우, 전체 유효성 검사 데이터 세트가 기록됩니다.
위에서 이미 W&B 테이블로 기록된 검증 데이터를 확인했습니다. 모든 평가 간격마다 예측 경계 상자와 실측 사실이 W&B 테이블로 기록됩니다. 아래 표에서 모델 예측을 확인해보세요.

Run set
0


스토리지에 대한 참고사항

각 평가 간격에 대한 예측 테이블은 고유한 버전으로 기록됩니다. media/ 디렉토리의 스토리지 설치 공간은 몇 KB에 불과합니다. 이 조금의 KB는 예측된 분할 마스크의 로깅으로 인해 발생합니다. 따라서 유효성 검사 데이터는 W&B 테이블 및 후속 테이블이 해당 데이터에 대한 참조를 사용할 때 단 한 번만 기록됩니다.


Weights & Biases로 트레이닝


이 섹션에서는 MMDetection에서 제공하는 모듈형 API를 사용하여 트레이닝 파이프라인을 구축할 것입니다. 다른 트레이닝 파이프라인과 마찬가지로 데이터 로더, 모델 및 트레이닝 루프가 필요합니다. 모델을 트레이닝하기 전에, 먼저 구성을 어떻게 기록할 수 있는지 살펴보겠습니다.

로깅 구성

tools/train.py를 사용하여 모델을 트레이닝 시키면 구성이 자동으로 기록됩니다. 그러나 자체 트레이닝 파이프라인을 사용하는 경우 다음 단계를 따라주세요:
  • 구성 파일의 이름을 값으로 하는 키로써의exp_name을dict, meta로 생성해주세요.

meta = dict()
meta['exp_name'] = os.path.basename(config_file)
  • work_dir/meta['exp_name'] dir에서 구성을 버려주세요. MMDetWandbHook는 저장된 구성 파일을 자동으로 읽고 기록합니다.

트레이닝

아래 코드 스니펫에서 볼 수 있듯이 MMDetection은 트레이닝 파이프라인의 필수 구성 요소를 구축하기 위한 기본 제공 API를 제공합니다.
def train(cfg, meta):
# Build dataset
datasets = [mmdet.datasets.build_dataset(cfg.data.train)]

# Build the detector
model = mmdet.models.build_detector(
cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))
model.CLASSES = datasets[0].CLASSES

# Dump config for logging
mmcv.mkdir_or_exist(os.path.abspath(cfg.work_dir))
cfg.dump(os.patg.join(cfg.work_dir, meta['exp_name']))

# Train the model.
mmdet.apis.train_detector(model, datasets, cfg, distributed=False, validate=True, meta=meta)
train_detector API를 사용하여distributed=True로 전환하여 다중 GPU 설정에서 모델을 트레이닝 할 수 있습니다. 검증 데이터 세트에서 모델을 평가하지 않으려면validate=False을 클릭해주세요. validateFalse인 경우EvalHook 또는DistEvalHook은 초기화되지 않습니다. 트레이닝을 실행하시려면 간단하게 다음과 같이 하시면 됩니다:
train(cfg, meta)
위에서 이미 기록된 메트릭, 데이터 및 모델 예측을 확인해봤으니 아래에서 기록된 구성을 살펴보겠습니다.



요약

MMDetection은 객체 탐지 및 분할 작업에 널리 사용되는 프레임워크입니다. 이제 전용MMDetWandbHook이 이 프레임워크의 일부이므로 워크플로우를 더욱 활용할 수 있습니다. 위에서 보시듯이 구성 파일의log_config 메서드를 업데이트하는 것처럼 간단하게 사용하세요.



저는 이 기능이 여러분의 일 능률에 가���를 더해주기를 바랍니다. 질문이 있는 경우 아래에 댓글을 남겨주시거나 여기 혹은 여기에 새로운 문제/문의를 생성해주세요. 저희는 또한 YOLOv5 및 PaddleDetection과 같은 다른 인기 있는 객체 감지 프레임 워크의 인터그레이션 또한 가지고 있답니다. 아래에서 확인해보세요:

Iterate on AI agents and models faster. Try Weights & Biases today.