부스트캠프 AI Tech 2기/2기 CV P-Stage-Objectdetection

MMDetection & Detectron2

2021. 9. 29. 21:12
목차
  1. 1. Object Detection 을 위한 라이브러리
  2. 2. MMDetection
  3. 3. Detectron2
반응형
# 모듈 import

from mmcv import Config
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector
from mmdet.datasets import (build_dataloader, build_dataset,
                            replace_ImageToTensor)
                            
classes = ("General trash", "Paper", "Paper pack", "Metal", "Glass", 
           "Plastic", "Styrofoam", "Plastic bag", "Battery", "Clothing")

# config file 들고오기
cfg = Config.fromfile('./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py')

root='../dataset/'

# dataset config 수정
cfg.data.train.classes = classes
cfg.data.train.img_prefix = root
cfg.data.train.ann_file = root + 'train.json' # train json 정보
cfg.data.train.pipeline[2]['img_scale'] = (512,512) # Resize

cfg.data.test.classes = classes
cfg.data.test.img_prefix = root
cfg.data.test.ann_file = root + 'test.json' # test json 정보
cfg.data.test.pipeline[1]['img_scale'] = (512,512) # Resize

cfg.data.samples_per_gpu = 4

cfg.seed = 2021
cfg.gpu_ids = [0]
cfg.work_dir = './work_dirs/faster_rcnn_r50_fpn_1x_trash'

cfg.model.roi_head.bbox_head.num_classes = 10

cfg.optimizer_config.grad_clip = dict(max_norm=35, norm_type=2)
cfg.checkpoint_config = dict(max_keep_ckpts=3, interval=1)

# build_dataset
datasets = [build_dataset(cfg.data.train)]

# 모델 build 및 pretrained network 불러오기
model = build_detector(cfg.model)
model.init_weights()

# 모델 학습
train_detector(model, datasets[0], cfg, distributed=False, validate=False)

1. Object Detection 을 위한 라이브러리

- 각각 라이브러리의 홈페이지를 들어가서 어떤 모델을 지원하는지 확인해야한다

2. MMDetection

2.1 MMDetection

- Pytorch기반의 Object detection 오픈소스 라이브러리

pipeline

1) input: 우리가 가진 입력 이미지

2) backbone: featuremap을 생성

3) neck: 일단은 featuremap이라고 생각해두자

4) dense prediction: 각 featuremap에서 RPN, RoI에대해 예측

5) prediction: RoI를 box_prediction과 class_prediction_head부분에 넘겨주고 앞에 사용한 featuremap(neck)에 RoI를 적용해서 최종적으로 클래스와 박스를 예측

 

 

2.2 Config file

 

- configs를 통해 데이터셋부터 모델, scheduler, optimizer 정의 가능

- 특히, configs에는 다양한 object detection 모델들의 config 파일들이 정의돼 있음

- 그 중, configs/base/ 폴더에 가장 기본이 되는 config 파일이 존재

    - dataset, model, schedule, default_runtime 4가지 기본 구성요소 존재

- 각각의 base/ 폴더에는 여러 버전의 config들이 담겨있음

    - Dataset – COCO, VOC, Cityscape 등 

    - Model – faster_rcnn, retinanet, rpn 등

github mmedetction

 

GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark

OpenMMLab Detection Toolbox and Benchmark. Contribute to open-mmlab/mmdetection development by creating an account on GitHub.

github.com

1) config 폴더:

- 폴더에 각 paper를 구현한 폴더들이 존재한다

- 파일명은 백본과 scheduler등 여러 조합으로 pretrained를 표기

 

ex) mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py

_base_ = ['./cascade_mask_rcnn_r50_fpn_1x_coco.py']

model = dict(
    backbone=dict(
        norm_cfg=dict(requires_grad=False),
        norm_eval=True,
        style='caffe',
        init_cfg=dict(
            type='Pretrained',
            checkpoint='open-mmlab://detectron2/resnet50_caffe')))

- baseconfig를 상속받아서 사용 (./cascade_mask_rcnn_r50_fpn_1x_coco.py)

- baseconfig의 일부를 사용하고싶은걸로 수정하여 사용

  

2) configs/_base_/datasets 폴더

- 데이터셋의 기본적인 config가 존재

 

3) configs/_base_/models 폴더

- 모델의 base config가 존재

 

 

ex) configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py 파일을 사용한다면

_base_ = [
    '../_base_/models/faster_rcnn_r50_fpn.py',
    '../_base_/datasets/coco_detection.py',
    '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]

datasets/coco_detection.py를 확인해보자

 

2.3 Dataset

 

ex) datasets/coco_detection.py

data = dict(
    samples_per_gpu=2,
    workers_per_gpu=2,
    train=dict(
        type=dataset_type,
        ann_file=data_root + 'annotations/instances_train2017.json',
        img_prefix=data_root + 'train2017/',
        pipeline=train_pipeline),
    val=dict(
        type=dataset_type,
        ann_file=data_root + 'annotations/instances_val2017.json',
        img_prefix=data_root + 'val2017/',
        pipeline=test_pipeline),
    test=dict(
        type=dataset_type,
        ann_file=data_root + 'annotations/instances_val2017.json',
        img_prefix=data_root + 'val2017/',
        pipeline=test_pipeline))
evaluation = dict(interval=1, metric='bbox')

- samples_per_gpu가 2면 한번에 4천개정도의 RoI가 올라간다

- 내가 원하는 값으로 overriding 할 수 있다

- pipeline: train_pipeline에 근거해서 하드디스크에 있는 low level format으로부터 torch format으로 transform한다

Data Pipeline

실제 train_pipeline

 

 

 

2.4 Model

 

ex) 위에서 상속받은 base중에 모델부분 '../_base_/models/faster_rcnn_r50_fpn.py'

    type='FasterRCNN',
    backbone=dict(
        type='ResNet',
        depth=50,
        num_stages=4,
        out_indices=(0, 1, 2, 3),
        frozen_stages=1,
        norm_cfg=dict(type='BN', requires_grad=True),
        norm_eval=True,
        style='pytorch',
        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),
    neck=dict(
        type='FPN',
        in_channels=[256, 512, 1024, 2048],
        out_channels=256,
        num_outs=5),
    rpn_head=dict(
        type='RPNHead',
        in_channels=256,
        feat_channels=256,
        anchor_generator=dict(
            type='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],
            target_stds=[1.0, 1.0, 1.0, 1.0]),
        loss_cls=dict(
            type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
        loss_bbox=dict(type='L1Loss', loss_weight=1.0)),
    roi_head=dict(
        type='StandardRoIHead',
        bbox_roi_extractor=dict(
            type='SingleRoIExtractor',
            roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0),
            out_channels=256,
            featmap_strides=[4, 8, 16, 32]),
        bbox_head=dict(
            type='Shared2FCBBoxHead',
            in_channels=256,
            fc_out_channels=1024,
            roi_feat_size=7,
            num_classes=80,
            bbox_coder=dict(
                type='DeltaXYWHBBoxCoder',
                target_means=[0., 0., 0., 0.],
                target_stds=[0.1, 0.1, 0.2, 0.2]),
            reg_class_agnostic=False,
            loss_cls=dict(
                type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),
            loss_bbox=dict(type='L1Loss', loss_weight=1.0))),

2Stage model hyper parameter

- type: 모델의 유형

- backbone: 인풋 이미지를 feature map으로 변형해주는 네트워크 

- neck: featuremap을 풍부하게 재구성, Backbone과 heda를 연결

- rpn_head: anchorbox의 ratios 등

- roi_head: RoI가 classification head와 regression head를 통과한다

- bbox_head 

- train_cfg 

- test_cfg

 

사용가능한 모델

 

위에없는 backbone은 custome으로 만들어 줄 수 있다.

 

2.5 Runtime settings

- 스케쥴러, 옵티마이저, save 주기등 학습적인부분

ex) configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py

 

Optimizer

 

Training schedules

- lr

- runner

 

 

2.6 전체 파이프라인

# 모듈 import

from mmcv import Config
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector
from mmdet.datasets import (build_dataloader, build_dataset,
                            replace_ImageToTensor)
                            
classes = ("General trash", "Paper", "Paper pack", "Metal", "Glass", 
           "Plastic", "Styrofoam", "Plastic bag", "Battery", "Clothing")

# config file 들고오기
cfg = Config.fromfile('./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py')

root='../dataset/'

# dataset config 수정
cfg.data.train.classes = classes
cfg.data.train.img_prefix = root
cfg.data.train.ann_file = root + 'train.json' # train json 정보
cfg.data.train.pipeline[2]['img_scale'] = (512,512) # Resize

cfg.data.test.classes = classes
cfg.data.test.img_prefix = root
cfg.data.test.ann_file = root + 'test.json' # test json 정보
cfg.data.test.pipeline[1]['img_scale'] = (512,512) # Resize

cfg.data.samples_per_gpu = 4

cfg.seed = 2021
cfg.gpu_ids = [0]
cfg.work_dir = './work_dirs/faster_rcnn_r50_fpn_1x_trash'

cfg.model.roi_head.bbox_head.num_classes = 10

cfg.optimizer_config.grad_clip = dict(max_norm=35, norm_type=2)
cfg.checkpoint_config = dict(max_keep_ckpts=3, interval=1)

# build_dataset
datasets = [build_dataset(cfg.data.train)]

# 모델 build 및 pretrained network 불러오기
model = build_detector(cfg.model)
model.init_weights()

# 모델 학습
train_detector(model, datasets[0], cfg, distributed=False, validate=False)

 

3. Detectron2

3.1 Detectron2

Object detection외에 Segmentation, pse prediction등 다양한것도 제공하지만 segmentation은 pytorch segmentation이 더 강력해서 detectron2는 objectdetection에서 주로사용됨

 

 

1) setup config

2) setup trainer

- build_model

- build_detection_train/test_loader

- build_optimizer

- build_lr_scheduler

 

 

3) start training

 

 

 

3.2 Config file

- MMDetection과 유사하게 config 파일을 수정, 이를 바탕으로 파이프라인을 build하고 학습함 

- 틀이 갖춰진 기본 config를 상속 받고, 필요한 부분만 수정해 사용함

- 디폴트 컨피그를 불러온 후, 기본적인 내용이 채워진 yaml 형식의 config 파일로 채움

3.3 Dataset

1) Config

- 데이터셋, 데이터로더와 관련된 config 

- TRAIN, TEST에 각각 등록한 train 데이터셋과 test 데이터셋의 이름을 입력함

 

2) Dataset 등록

- 커스텀 데이터셋을 사용하고자 할 때는 데이터셋을 등록해야함

- (옵션) 전체 데이터셋이 공유하는 정보 (ex. class명, 파일 디렉토리 등)을 메타 데이터로 등록할 수 있음

- config 파일에 train 데이터셋과 test(val) 데이터셋을 명시해 사용할 수 있도록 함

 

3) DataAugmentation 정의

- augmentation 정보가 담긴 mapper 정의

- Dataloader에 mapper를 input으로 넣어줌

 

3.4 Model

1) BACKBONE 

- 인풋 이미지를 특징맵으로 변형해주는 네트워크

- Ex. ResNet, RegNet…

 

2) FPN 

- Backbone과 head를 연결, Feature map을 재구성

 

3) ANCHOR_GENERATOR

 

4) RPN

- threshold

 

5) ROI_HEADS

 

6) ROI_BOX_HEAD

 

 

3.5 Solver

 

Config

1) LR_SCHEDULER

2) WEIGHT_DECAY

3) CLIP_GRADIENTS

 

3.6 전체 파이프라인

 

반응형

'부스트캠프 AI Tech 2기 > 2기 CV P-Stage-Objectdetection' 카테고리의 다른 글

EfficientDet  (0) 2021.10.02
1 stage Detectors  (0) 2021.10.01
Neck  (0) 2021.09.30
2-Stage Detectors  (0) 2021.09.28
Object Detection Overview  (0) 2021.09.28
  1. 1. Object Detection 을 위한 라이브러리
  2. 2. MMDetection
  3. 3. Detectron2
'부스트캠프 AI Tech 2기/2기 CV P-Stage-Objectdetection' 카테고리의 다른 글
  • 1 stage Detectors
  • Neck
  • 2-Stage Detectors
  • Object Detection Overview
모플로
모플로
현재 진행하는 개발 과정을 자주 기록하는 곳
반응형
모플로
모던플로우
모플로
전체
오늘
어제
  • 분류 전체보기 (143)
    • 개발 (41)
      • Python (5)
      • Docker (3)
      • Shell (3)
      • Airflow (0)
      • Elasticsearch (0)
      • AWS (4)
      • DataAnalysis (2)
      • Tensorflow (9)
      • NLP (4)
      • ML,DL 나중에 카테고리분류 (1)
      • Nestjs (1)
      • Git (4)
      • Algorithm (0)
      • 설계 (2)
      • Database (1)
    • 부스트캠프 AI Tech 2기 (97)
      • Precourse (27)
      • 2기 U-Stage (20)
      • 2기 P-Stage (2)
      • 2기 CV U-Stage (12)
      • 2기 CV P-Stage-Objectdetecti.. (10)
      • 2기 CV P-Stage-Semantic Segm.. (8)
      • 2기 CV 데이터제작 (7)
      • 2기 모델 최적화 (0)
      • 2기 Product Serving (10)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • Semantic Segmentation
  • Python
  • 알고리즘
  • Transformer
  • aws
  • Docker
  • 프로그래머스
  • detection
  • Node
  • codepipeline
  • fcn
  • tensorflow
  • nlp
  • efficientnet
  • MLOps
  • ubuntu20.04
  • NestJS
  • yolo
  • MLE
  • transfer learning
  • Object Detection
  • Example
  • 경사하강법
  • ubuntu
  • CICD
  • Object
  • CV
  • ElasticBeansTalk
  • gradient descent
  • pytorch

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.1.4
모플로
MMDetection & Detectron2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.