Faster R-CNN colab

Choi재혁
|2024. 7. 23. 09:55
반응형

 

  • 데이터는 roboflow 사용
  • 방법1, 방법2 두가지로 구현
  • 최종결과 확인 및 정리

 

작업위치 설정

import os

os.mkdir('fast_rcnn')
os.chdir('fast_rcnn')

 

mmdetection 설치 (colab 기본 pytorch 버전과 맞춘것)

!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11.0/index.html
!git clone https://github.com/open-mmlab/mmdetection.git
%cd mmdetection
!pip install -r requirements/build.txt
!pip install -v -e .
!pip install mmdet

 

데이터셋 다운

  • roboflow 에서는 원하는 데이터셋 코드 다운도 지원

 

  • 폴더 생성및 데이터 다운
os.mkdir('data')
os.chdir('data')
!curl -L "https://public.roboflow.com/ds/NyfU3VG4Vv?key=4el7nxVvoP" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip
os.listdir()

>> ['test', 'valid', 'train', 'README.roboflow.txt', 'README.dataset.txt']

 

Faster R-CNN

  • mmdetection/configs 안에 _ custom _ 폴더 생성
  • mmdetection 밑에 checkpoint 폴더 생성
os.chdir('/content/fast_rcnn/mmdetection/checkpoint/')

from requests import get 

def download(url, file_name):
    with open(file_name, "wb") as file:   
        response = get(url)               
        file.write(response.content)


url = "https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth"
download(url,"faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth")

방법 1. custom.py 사용

image.png

  • faster_rcnn_custom.py

_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'


model = dict(
  roi_head = dict(
    bbox_head = dict(
      num_classes = 3
    )
  )
)


data_root = '/data'
classes = ('People', 'mask', 'no-mask',)


data = dict(
    samples_per_gpu=1,
    workers_per_gpu=0,

    train=dict(
      img_prefix="/train/",
      classes = classes,
      ann_file="/train/_annotations.coco.json"
),

    val=dict(
        img_prefix="/valid/",
        classes = classes,
        ann_file="/valid/_annotations.coco.json"
),

    test=dict(
        img_prefix="/test/",
        classes = classes,
        ann_file="/test/_annotations.coco.json"
)
)


runner = dict(type='EpochBasedRunner', max_epochs=5)
auto_scale_lr = dict(enable=False, base_batch_size=16)
checkpoint_config = dict(interval=1,out_dir='work_dirs/faster_rcnn/')
evaluation = dict(interval=1, metric='bbox')
load_from = 'checkpoint/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
# 100 epoch 수행하는 것
os.chdir('/content/fast_rcnn/mmdetection/')
!python ./tools/train.py configs/_custom_/faster_rcnn_custom.py --work-dir configs/custom/faster_rcnn/
  • 결과 이미지 확인
!python ./tools/test.py configs/_custom_/faster_rcnn_custom.py work_dirs/faster_rcnn/faster_rcnn/latest.pth --show-dir results/mask 
from glob import glob 
import cv2
from google.colab.patches import cv2_imshow

data_list = glob('./results/mask/*.jpg')
for i in data_list[:10]:
  src = cv2.imread(i)

  cv2_imshow(src)

 

방법 2. config 사용

os.chdir('/content/fast_rcnn/mmdetection/')
import mmcv
from mmcv.runner import load_checkpoint
from mmdet.apis import inference_detector, show_result_pyplot
from mmdet.models import build_detector
from mmdet.apis import set_random_seed

# 사용할 모데 초기 py 설정
config = './configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'

# config 불러오기
cfg = mmcv.Config.fromfile(config)

# 데이터셋 지정
cfg.dataset_type = 'CocoDataset'

# data_root는 사용자가 저장한 데이터가 있는 폴더 전까지
data_root = '/content/fast_rcnn/mmdetection/data'

# class 설정
classes = ('People', 'mask', 'no-mask',)

# train, val, test 데이터셋에 대한 type, data_root, ann_file, img_prefix 설정

cfg.data.samples_per_gpu=1
cfg.data.workers_per_gpu=0

cfg.data.train.data_root = data_root 
cfg.data.train.ann_file =  data_root + "/train/_annotations.coco.json"
cfg.data.train.img_prefix = data_root +  '/train/'
cfg.data.train.classes = classes

cfg.data.val.data_root = data_root
cfg.data.val.ann_file =  data_root + "/valid/_annotations.coco.json"
cfg.data.val.img_prefix = data_root +  '/valid/'
cfg.data.val.classes = classes

cfg.data.test.data_root = data_root
cfg.data.test.ann_file =  data_root + "/test/_annotations.coco.json"
cfg.data.test.img_prefix = data_root +  '/test/'
cfg.data.test.classes = classes

# 클래스 수 지정
cfg.model.roi_head.bbox_head.num_classes = 3

# 사전 훈련 모델 지정
cfg.load_from = 'checkpoint/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'

# 가중치 저장 위치
cfg.work_dir = './work_dirs/mask_cfg/'

# learning rate
cfg.optimizer.lr = 0.02 / 8

# 로그 출력 시기 설정
cfg.log_config.interval = 1 
cfg.lr_config.policy = 'step'

# 평가 지표로 설정
cfg.evaluation.metric = 'bbox'

# 평가 구간 설정
cfg.evaluation.interval = 10

# 체크포인트 구간 설정
cfg.checkpoint_config.interval = 10

# epoch 설정
cfg.runner = dict(type='EpochBasedRunner', max_epochs=100)

# 결과 재현을 위한 시드값 설정
cfg.seed = 0
set_random_seed(0, deterministic=False)
cfg.gpu_ids = range(1)
cfg.device='cuda'
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector

# dataset 생성 및 model 설정

datasets = [build_dataset(cfg.data.train)]
model = build_detector(cfg.model)
model.CLASSES = datasets[0].CLASSES

# 훈련
train_detector(model, datasets, cfg, distributed=False, validate=True)
  • 결과 이미지 확인
test_data = glob('/content/fast_rcnn/mmdetection/data/test/*.jpg')

for i in test_data[:10]:
  img = mmcv.imread(i)

  model.cfg = cfg
  result = inference_detector(model, img)
  show_result_pyplot(model, img, result)

적은 epoch만 돌렸을때는 확실히 성능이 좋지 못한 경향을 보임

대부분 잘 잡아내지만 클래스별 데이터가 너무 적고, 전체 데이터 또한 적어서 엄청 큰 성능을 보이지는 않음

반응형

'DeepLearning > OpenMMLab' 카테고리의 다른 글

mmdetection config setting  (0) 2024.07.23
mmdetection 설명 & 설치과정  (1) 2024.07.23