반응형
- 데이터는 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 사용
- 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 |