본문 바로가기
딥러닝관련/Detection

MMdetection(2) - 표준 Datasets Inference 및 Train

by 머리올리자 2021. 10. 28.

https://mmdetection.readthedocs.io/en/latest/1_exist_data_model.html

 

1: Inference and train with existing models and standard datasets — MMDetection 2.18.0 documentation

1: Inference and train with existing models and standard datasets MMDetection provides hundreds of existing and existing detection models in Model Zoo), and supports multiple standard datasets, including Pascal VOC, COCO, CityScapes, LVIS, etc. This note w

mmdetection.readthedocs.io

위 참고하여 작성.

 

2021.10.19 - [딥러닝관련/Detection] - MMdetection(1) 설치 및 Demo 실행 - (1)

 

MMdetection(1) 설치 및 Demo 실행 - (1)

MMdetection MMdetection은 openMMlab이라고 The CUHK Multimedia Lab에서 제공하는 Open Source Project의 프로젝트 중 하나이다. (https://mmlab.ie.cuhk.edu.hk/) 아래 사이트에 보면 MMDetection 말고도 다른..

better-tomorrow.tistory.com

여기 위에서 demo를 실행했었다.

 

구체적인 실행 방법은 아래와 같다.

# Image Demo

python demo/image_demo.py \
    ${IMAGE_FILE} \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--score-thr ${SCORE_THR}]


python demo/image_demo.py demo/demo.jpg \
    configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    --device cpu
# Webcam Demo

python demo/webcam_demo.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--camera-id ${CAMERA-ID}] \
    [--score-thr ${SCORE_THR}]


python demo/webcam_demo.py \
    configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
# Video demo

python demo/video_demo.py \
    ${VIDEO_FILE} \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--score-thr ${SCORE_THR}] \
    [--out ${OUT_FILE}] \
    [--show] \
    [--wait-time ${WAIT_TIME}]


python demo/video_demo.py demo/demo.mp4 \
    configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    --out result.mp4

 

Standard Datasets에서 test


(CoCo, Pascal VOC, Cityscapes 등..)

 

데이터를 다운 받은 후 아래와 같은 구조로 구성한다.

 

 

# https://mmdetection.readthedocs.io/en/latest/3_exist_data_new_model.html

mmdetection
├── mmdet
├── tools
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   ├── train2017
│   │   ├── val2017
│   │   ├── test2017
│   ├── cityscapes
│   │   ├── annotations
│   │   ├── leftImg8bit
│   │   │   ├── train
│   │   │   ├── val
│   │   ├── gtFine
│   │   │   ├── train
│   │   │   ├── val
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   ├── VOC2012

 

만약 추가로 COCO-stuff datasets가 필요하면 아래와 같이 구성한다.

mmdetection
├── data
│   ├── coco
│   │   ├── annotations
│   │   ├── train2017
│   │   ├── val2017
│   │   ├── test2017
│   │   ├── stuffthingmaps

 

COCO panoptic datasets의 경우 아래와 같이 구성

 

mmdetection
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── panoptic_train2017.json
│   │   │   ├── panoptic_train2017
│   │   │   ├── panoptic_val2017.json
│   │   │   ├── panoptic_val2017
│   │   ├── train2017
│   │   ├── val2017
│   │   ├── test2017

cityscapes annotation의 경우 아래의 코드를 이용하여 변경해줘야 함

pip install cityscapesscripts

python tools/dataset_converters/cityscapes.py \
    ./data/cityscapes \
    --nproc 8 \
    --out-dir ./data/cityscapes/annotations

기존 모델 테스트

 

Single GPU

Single node multiple GPU

Multiple Node

 

(데스크탑에서 진행하는 것이라면 Node는 컴퓨터로 볼 수 있음)

 

지원 가능

 

실행 방법은 아래와 같음

 

# single-gpu testing
python tools/test.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--out ${RESULT_FILE}] \
    [--eval ${EVAL_METRICS}] \
    [--show]

# multi-gpu testing
bash tools/dist_test.sh \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    ${GPU_NUM} \
    [--out ${RESULT_FILE}] \
    [--eval ${EVAL_METRICS}]

 

옵션들은 아래와 같음

RESULT_FILE: Filename of the output results in pickle format. If not specified, the results will not be saved to a file.

EVAL_METRICS: Items to be evaluated on the results. Allowed values depend on the dataset, e.g., proposal_fast, proposal, bbox, segm are available for COCO, mAP, recall for PASCAL VOC. Cityscapes could be evaluated by cityscapes as well as all COCO metrics.

--show: If specified, detection results will be plotted on the images and shown in a new window. It is only applicable to single GPU testing and used for debugging and visualization. Please make sure that GUI is available in your environment. Otherwise, you may encounter an error like cannot connect to X server.

--show-dir: If specified, detection results will be plotted on the images and saved to the specified directory. It is only applicable to single GPU testing and used for debugging and visualization. You do NOT need a GUI available in your environment for using this option.

--show-score-thr: If specified, detections with scores below this threshold will be removed.

--cfg-options: if specified, the key-value pair optional cfg will be merged into config file

--eval-options: if specified, the key-value pair optional eval cfg will be kwargs for dataset.evaluate() function, it’s only for evaluation

실행 예시는 아래와 같음

 

checkpoints/ 에 weight가 있어야 함

 

Faster-RCNN 예시

(checkpoint와 config파일 : https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn)

 

# show image

python tools/test.py \
    configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    --show

결과

 

# save image

python tools/test.py \
    configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    --show-dir faster_rcnn_r50_fpn_1x_results

결과

 

COCO dataset은 mmdetection에서 mAP metric을 지원하지 않아 VOC로 테스트

 

checkpoint는 아래 링크 참조하여 다운

https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc

# eval mAP

python tools/test.py \
    configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py \
    checkpoints/faster_rcnn_r50_fpn_1x_voc0712_20200624-c9895d40.pth \
    --eval mAP

결과는 위와 같다


Ground Truth Annotation 없이 test


(MMdetection은 이 경우 COCO 포맷에 맞춰 바꿔줘야 함, 이 경우 아래 링크 참조)

https://mmdetection.readthedocs.io/en/latest/1_exist_data_model.html#test-without-ground-truth-annotations

 

1: Inference and train with existing models and standard datasets — MMDetection 2.18.0 documentation

1: Inference and train with existing models and standard datasets MMDetection provides hundreds of existing and existing detection models in Model Zoo), and supports multiple standard datasets, including Pascal VOC, COCO, CityScapes, LVIS, etc. This note w

mmdetection.readthedocs.io

# 예시

python tools/dataset_converters/images2coco.py \
    ${IMG_PATH} \
    ${CLASSES} \
    ${OUT} \
    [--exclude-extensions]

변환 후 아래의 명령어를 이용해 test 가능

# single-gpu testing
python tools/test.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    --format-only \
    --options ${JSONFILE_PREFIX} \
    [--show]

# multi-gpu testing
bash tools/dist_test.sh \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    ${GPU_NUM} \
    --format-only \
    --options ${JSONFILE_PREFIX} \
    [--show]

Mask RCNN을 이용하여 test

python ./tools/test.py  \
	configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py   \
    checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth   \
    --options "jsonfile_prefix=./mask_rcnn_test-dev_results" \
    --eval bbox

 

 


Batch Inference


테스트 모드에서 single image 또는 batched image로 inference 가능

 

기본적으로는 single image inference 사용

 

test data의 config에서 samples_per_gpu로 batch inference 가능

 

아래와 같이 config 수정하여 실행 가능

 

data = dict(train=dict(...), val=dict(...), test=dict(samples_per_gpu=2, ...))

아니면 --cfg-option를 수정하여 실행 가능

 

--cfg-options data.test.samples_per_gpu=2

 


Deprecated ImageToTensor


# use ImageToTensor (deprecated)
pipelines = [
   dict(type='LoadImageFromFile'),
   dict(
       type='MultiScaleFlipAug',
       img_scale=(1333, 800),
       flip=False,
       transforms=[
           dict(type='Resize', keep_ratio=True),
           dict(type='RandomFlip'),
           dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]),
           dict(type='Pad', size_divisor=32),
           dict(type='ImageToTensor', keys=['img']),
           dict(type='Collect', keys=['img']),
       ])
   ]

위 코드가 사라질 예정이니 아래 사용

 

# manually replace ImageToTensor to DefaultFormatBundle (recommended)
pipelines = [
   dict(type='LoadImageFromFile'),
   dict(
       type='MultiScaleFlipAug',
       img_scale=(1333, 800),
       flip=False,
       transforms=[
           dict(type='Resize', keep_ratio=True),
           dict(type='RandomFlip'),
           dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]),
           dict(type='Pad', size_divisor=32),
           dict(type='DefaultFormatBundle'),
           dict(type='Collect', keys=['img']),
       ])
   ]

Train predefined models on standard datasets


COCO datasets과 같은 standard datasets에서 미리 정의된 모델(config) 에서 학습하는 방법을 보여 줌

 

config 파일의 기본 learning rate는 GPU 8개와 2 img/gpu (batch size = 8 * 2 = 16)

 

Linear scaling 규칙에 따라 GPU당 다른 GPU 또는 이미지를 사용하는 경우 

배치 크기에 비례하여 학습률을 설정.

 

lr=0.01 for   4 GPUs * 2 imgs/gpu
lr=0.08 for 16 GPUs * 4 imgs/gpu

 


Single GPU에서의 학습

python tools/train.py \
    ${CONFIG_FILE} \
    [optional arguments]
# options

--no-validate (not suggested): Disable evaluation during training.
--work-dir ${WORK_DIR}: Override the working directory.
--resume-from ${CHECKPOINT_FILE}: Resume from a previous checkpoint file.
--options 'Key=value': Overrides other settings in the used config.

resume-from 과 load-from의 차이

resume-from : weight와 optimizer 상태 모두 로드 및 epoch도 지정된 checkpoint에서 상속

(일반적으로 학습하다가 중단되었을  때)

 

load-from : weight만 load 하고 training epoch는 0부터 시작

(일반적으로 fine-tuning 할 때)

 

위를 참고하여 아래의 명령어를 실행하여 faster rcnn COCO dataset 학습을 진행하였다.

 

python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --work-dir log/2021-10-29-faster_rcnn_r50_fpn_1x_coco_log

학습도 잘 시작하고 log파일도 잘 생기는 걸 아래와 같이 확인할 수 있다.

궁금해서 보니까 pre-trained weight는 아래와 같은 경로에 저장되어 있음을 알 수 있다.

~/.cache/torch/hub/checkpoints