# 모듈 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 등
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 |