귀퉁이 서재

컴퓨터 비전 - 11. MMDetection에서 사전 훈련 Faster R-CNN으로 객체 탐지 추론 본문

딥러닝 컴퓨터 비전

컴퓨터 비전 - 11. MMDetection에서 사전 훈련 Faster R-CNN으로 객체 탐지 추론

Baek Kyun Shin 2022. 5. 22. 23:14

※ 이 글은 권철민 님의 딥러닝 컴퓨터 비전 완벽 가이드 강의를 바탕으로 작성했습니다.

이번 시간에는 MMDetection을 활용해 사전 훈련된 Faster R-CNN으로 객체 탐지 추론(inference)을 수행해보겠습니다.  MMDetection 실습 첫 시간이니 간단한 이미지를 활용해보겠습니다. MMDetection 개요가 궁금한 분은 이전 글을 참고해주세요.

이 글에서 사용한 코드: https://github.com/BaekKyunShin/Deep-Learning-Computer-Vision/blob/master/faster_rcnn/mmdetection_faster_rcnn_inference.ipynb


MMDetection에 익숙해지는 첫 시간입니다. MMDetection을 설치해서, 사전 훈련된 Faster R-CNN으로 간단한 이미지를 활용해 객체 탐지 추론을 해보겠습니다. 

실습은 구글 Colab 기반으로 설명합니다.

1. MMDetection 설치

MMDetection은 GPU 환경에서 구동해야 하니 먼저 GPU를 활성화해줍니다. 상단의 '런타임' 메뉴에서 '런타임 유형 변경'을 클릭한 뒤, 하드웨어 가속기를 'GPU'로 선택해서 저장하면 됩니다. 그러면 GPU에서 코드를 돌릴 수 있습니다.

GPU 설정

GPU를 설정했으니, 본격적으로 시작해보죠. MMDetection은 파이토치 기반 패키지이므로, 먼저 파이토치를 임포트합니다.

import torch
print(torch.__version__)

    1.10.0+cu111

이 글을 쓰는 시점에는 구글 Colab이 제공하는 파이토치 버전이 1.10.0입니다. 시간이 지나면서 계속 버전업될 수 있습니다.

다음으로 MMCV를 설치해야 합니다. MMDetection을 사용하려면 MMCV가 설치돼 있어야 하기 때문이죠. MMCV는 컴퓨터 비전 관련 패키지입니다. 

# MMCV 설치
!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.10.0/index.html

참고로, 앞 코드에서 'torch1.10.0'을 넣어줬는데, 파이토치 버전이 바뀌면 바뀐 버전을 넣어줘야 합니다.

MMCV를 설치했으니 이제 MMDetection을 설치해보죠. mmdetection.git을 clone합니다.

# MMDetection git clolne
!git clone https://github.com/open-mmlab/mmdetection.git

clone을 하면, 왼쪽 파일 목록에 mmdetection 디렉터리가 생성됩니다.

mmdetection 디렉터리 생성

이어서 mmdetection 디렉터리에 들어간 뒤, setup 파일을 설치합니다. mmdetection을 설치하는 겁니다. 디렉터리 구조로 보면 다음과 같습니다. mmdetection 아래 여러 하위 디렉터리와 파일들이 있습니다. 그 가운데 setup.py를 설치해 셋업을 해주는 거죠.

setup 파일

# MMDetection 설치
!cd mmdetection; python setup.py install

MMDetection 패키지를 설치했으니 임포트해야겠죠? 그런데 바로 임포트하면 오류가 납니다. 구글 Colab에서는 어떤 패키지를 설치한 뒤 임포트하려면, 임포트하기 전에 '런타임 다시 시작'을 해야 합니다. 상단의 메뉴에서 '런타임'을 클릭한 뒤, '런타임 다시 시작'을 누릅니다. 이때 '런타임 초기화'가 아니라 반드시 '런타임 다시 시작'을 눌러야 합니다. '런타임 초기화'를 하면 아까 설치한 MMDetection이 모두 날아갑니다. '런타임 다시 시작'은 설치한 파일은 그대로 유지한 채로 런타임을 다시 시작합니다.

이제 mmdetection과 mmcv 패키지를 임포트합니다.

# 임포트하기 전에 '런타임 다시 시작'을 해야 함
from mmdet.apis import init_detector, inference_detector
import mmcv

잘 임포트가 됐을 겁니다. 만약 여기서 오류가 생기면 두 가지를 점검해야 합니다. 1) 패키지 설치 후 '런타임 다시 시작'을 했는지, 2) GPU를 활성화했는지를 말이죠. 자, 준비를 마쳤으니 이제 객체 탐지를 해보죠.

2. 사전 훈련된 Faster R-CNN으로 Inference 수행

사전 훈련된 Faster R-CNN 다운로드

mmdetection을 설치했으니 이제 Inference를 수행해보겠습니다. 모델은 MS COCO 데이터셋에서 사전 훈련된 Faster R-CNN을 이용하겠습니다. MS COCO는 80개 클래스로 이루어진 데이터셋입니다.

사전 훈련 모델을 다운로드하기 위해 디렉터리를 하나 만들겠습니다. 'mmdetection' 아래 'checkpoints'라는 이름으로 생성합니다.

# 사전 훈련 모델을 다운로드 받기 위해 mmdetection/checkpoints 디렉터리 생성 
!cd mmdetection; mkdir checkpoints

생성한 'checkpoints' 디렉터리에 사전 훈련된 Faster R-CNN을 다운로드하겠습니다. mmdetection 깃헙에서 Faster R-CNN을 다운로드할 수 있게 해놨습니다. 원하는 모델의 링크 주소를 복사한 뒤, 코드에 붙여넣으시면 됩니다.

사전 훈련 Faster R-CNN 다운로드 링크 복사 방법

다음 코드로 사전 훈련된 Faster R-CNN을 다운로드합니다. 

# 사전 훈련된 Faster R-CNN 다운로드
!wget -O /content/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth

코드의 의미는 '/content/mmdetection/checkpoints/' 디렉터리 아래 faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth라는 이름으로 사전 훈련 모델(https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth)을 다운로드 받는다는 뜻입니다.

다운로드가 잘 됐는지 볼까요?

!ls -lia /content/mmdetection/checkpoints

    total 163376
    4329143 drwxr-xr-x  2 root root      4096 Mar 16 13:47 .
    4325384 drwxr-xr-x 19 root root      4096 Mar 16 13:45 ..
    4329144 -rw-r--r--  1 root root 167287506 Nov  2 16:15 faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth

사전 훈련 Faster R-CNN이 잘 다운로드가 되었네요.

사전 훈련 Faster R-CNN 모델 생성

이제 사전 훈련 Faster R-CNN 모델을 만들어 보겠습니다. 그전에 config 파일 경로를 config_file에 할당하고, 방금 다운로드한 사전 훈련 Faster R-CNN 경로를 checkpoint_file에 할당합니다. 여기서 config 파일은 각종 설정값을 지정해둔 파일입니다.

# config 파일 설정
config_file = '/content/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
# 다운로드 받은 사전 훈련 모델을 checkpoint로 설정
checkpoint_file = '/content/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'

이제 객체 탐지 모델을 만들어 보죠. 모델을 만들려면 mmdetection 패키지가 제공하는 init_detector 메서드를 사용해야 합니다. 파라미터로는 앞서 설정한 config 파일과 사전 훈련 모델을 이용하면 됩니다. init_detector()는 사전 훈련 모델을 가져오는 역할을 하죠. 

# config 파일과 사전 훈련 모델을 기반으로 객체 탐지 모델 생성
model = init_detector(config_file, checkpoint_file, device='cuda:0')

init_detector()의 생성 인자로 config_file과 checkpoint_file을 전달했죠? 다운로드한 사전 훈련 Faster R-CNN을 생성하되 config_file에 있는 설정값으로 초기화 한다는 말입니다. device 인자로는 GPU를 사용하기 때문에 'cuda:0'를 전달했습니다. 참고로 'cuda:0'은 첫 번째 cuda라는 말입니다. 

init_detector()를 사용할 때 주의할 점이 있습니다. config_file과 checkpoint_file 매개변수에 상대 경로를 전달할 경우 무조건 mmdetection 디렉터리를 기준으로 한다는 점입니다. 따라서 상대 경로를 전달하려면 다음 코드처럼 실행해야 합니다. 

%cd mmdetection

# mmdetection은 상대 경로를 인자로 주면 무조건 mmdetection 디렉터리를 기준으로 함
model = init_detector(config='configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', checkpoint='checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth')

%cd /content

앞서 절대 경로를 전달한 코드와 비교해보세요. 상대 경로를 전달하려면 현재 디렉터리를 mmdetection으로 바꾼 뒤, 객체 탐지 모델을 생성하고 다시 content 디렉터리로 기준 디렉터리를 바꿔야 합니다. 

객체 탐지 Inference 수행

객체 탐지 모델까지 만들었으니 Inference를 수행해보죠. mmdetection 디렉터리에 연습용 이미지가 담겼는데, 이 이미지로 Inference를 해보겠습니다. 먼저 어떤 이미지인지 출력해보죠.

import cv2
import matplotlib.pyplot as plt

img_path = '/content/mmdetection/demo/demo.jpg' # 이미지 경로

img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 12))
plt.imshow(img);

샘플 이미지

이 샘플 이미지를 활용해 inference를 수행하겠습니다. inference_detector() 메서드로 inference를 수행합니다(inference_detector는 앞서 임포트했습니다). 인자로 모델과 이미지를 전달합니다. 이때 이미지를 전달하는 매개변수에는 string(이미지 경로인 경우), 또는 ndarray(단일 또는 list 형태)를 전달할 수 있습니다. 여기서는 이미지 경로를 string 형태로 전달했죠.

results = inference_detector(model, img_path) # inference 수행

inference 결과를 results 변수에 담았습니다. results의 타입과 개수를 출력해보죠.

type(results), len(results)

    (list, 80)

results는 리스트 타입이며, 원소 개수가 80개네요. 리스트 안에는 array 80개가 들어 있습니다. 80개인 이유는 MS COCO 데이터셋 클래스가 80개라서 그렇습니다. 클래스 ID가 0부터 79까지입니다. array는 2차원 데이터로, 여기에는 해당 클래스에 속하는 모든 객체의 정보가 담겨있습니다. 가령 클래스 ID가 0인 객체가 사람을 뜻한다면, 첫 번째 array에는 이미지 안에 있는 모든 사람에 대한 정보가 들어 있습니다. 사람이 10명이라면 array의 형상은 (10, 5)입니다. 10은 해당 클래스 객체의 개수를, 5는 좌표값(=4개)과 클래스별 신뢰도 점수(=1개)를 나타냅니다. 좌표는 좌상단 x좌표, 좌상단 y좌표, 우하단 x좌표, 우하단 y좌표로 총 4개 값을 갖죠. 따라서 개별 array의 형상은 (탐지된 객체 수, 5)입니다.

results를 한번 출력해보죠.

results

   [array([[3.75348572e+02, 1.19171005e+02, 3.81950867e+02, 1.34460617e+02, 1.35454327e-01],
                  [5.32362000e+02, 1.09554726e+02, 5.40526550e+02, 1.25222633e+02, 8.88783410e-02],
                  [3.61124298e+02, 1.09049202e+02, 3.68625610e+02, 1.22483063e+02, 7.20723420e-02]], dtype=float32),
    array([], shape=(0, 5), dtype=float32),
    array([[6.09650024e+02, 1.13805893e+02, 6.34511658e+02, 1.36951904e+02, 9.88766134e-01],
                  [4.81773712e+02, 1.10480980e+02, 5.22459717e+02, 1.30407104e+02, 9.87157285e-01],
                  [1.01822114e+00, 1.12144730e+02, 6.04374733e+01, 1.44173752e+02, 9.83206093e-01],
   ...이후 생략...

지면 관계상 array 세 개만 표시했습니다. 실제로는 array가 80개 출력됩니다. MS COCO에서 첫 번째 클래스 id는 사람을 나타냅니다. 그러므로 첫 번째 array도 사람에 관한 정보를 포함합니다. 첫 번째 array는 세 개의 리스트를 갖죠? 이미지 안에서 사람을 세 명 탐지했다는 말입니다. 0~3열까지가 경계 박스 좌표값이고, 4열이 신뢰도 점수입니다. 맨 처음 행을 보면 신뢰도 점수가 0.135입니다. 탐지한 객체가 사람일 확률이 13.5%라는 뜻입니다.

두 번째 클래스 id는 자전거를 뜻합니다. 자전거는 하나도 탐지하지 못해 빈 array를 출력했네요. 세 번째 클래스 id는 차입니다. 이미지 안에 차가 워낙 많아서, 세 번째 array에는 많은 리스트가 담겨 있습니다.

각 세 번째 array까지 형상을 출력해볼까요?

results[0].shape, results[1].shape, results[2].shape

    ((3, 5), (0, 5), (46, 5))

사람 3명을 탐지했고, 자전거는 탐지하지 못했고, 차를 46대 탐지했다는 뜻입니다.

이제, 탐지 결과를 활용해 경계 박스와 신뢰도 점수를 표시해 이미지를 출력해보겠습니다. show_result_pyplot() 메서드로 구현할 수 있습니다. 모델과, 이미지, 탐지 결과를 전달하면 되며, 기본값으로 신뢰도 점수가 0.3 이상인 객체만 보여줍니다. 

from mmdet.apis import show_result_pyplot

show_result_pyplot(model, img_path, results)

객체 탐지 결과 시각화

앞서 객체 탐지 inference를 수행할 때 이미지 파일 경로를 전달했습니다. 파일 경로가 아니라 이미지 배열(array)을 inference_detector()에 입력할 경우에는 원본 array를 BGR 형태로 그대로 입력해야 합니다. RGB 변환은 내부에서 수행하기 때문이죠. cv2.imread()로 이미지를 불러오면 BRG 형태로 이미지 array를 반환합니다. RGB로 바꾸지 않고 BGR 형태를 바로 inference_detector()에 전달해야 정상적으로 동작합니다.

img_bgr = cv2.imread('/content/mmdetection/demo/demo.jpg')
results = inference_detector(model, img_bgr) # RGB가 아닌 BGR로 입력

show_result_pyplot(model, img_bgr, results)

객체 탐지 결과 시각화(이미지 배열 사용 시)

막간을 이용해 모델 파라미터와 config를 살펴볼까요? 다음 코드로 모델의 여러 파라미터를 확인할 수 있습니다.

# 모델 안에 있는 다양한 파라미터 확인
model.__dict__

model.cfg로 모델의 config 설정 정보를 확인할 수 있습니다. 그런데 model.cfg로만 실행하면 한 줄로 결과가 나옵니다. 보기에 불편하죠. 다음과 같이 pretty_text를 호출하면 인덴테이션이 적용되어 보기에 좋습니다.

print(model.cfg.pretty_text)

출력 결과는 생략하겠습니다.

show_result_pyplot()을 사용하지 않고, inference 결과 시각화하기

앞서 show_result_pyplot()으로 inference 결과를 시각화했습니다. 이번에는 코드로 직접 시각화를 해볼 겁니다.

그전에 np.where 용법을 먼저 설명하고 가겠습니다. 특정 신뢰도 점수 이상인 결과만 추출하는 데 필요한 코드입니다. 다음은 arr_sample에서 4번째 열이 0.1보다 큰 행만 추출하는 코드입니다.

import numpy as np

# 샘플 array
arr_sample = np.array([[3.75348572e+02, 1.19171005e+02, 3.81950867e+02, 1.34460617e+02, 1.35454759e-01],
                       [5.32362000e+02, 1.09554726e+02, 5.40526550e+02, 1.25222633e+02, 8.88786465e-01],
                       [3.61124298e+02, 1.09049202e+02, 3.68625610e+02, 1.22483063e+02, 7.20717013e-02]], dtype=np.float32)

# np.where 사용법 예시
arr_filtered = arr_sample[np.where(arr_sample[:, 4] > 0.1)]
print('arr_filtered:', arr_filtered)

    arr_filtered: [[3.75348572e+02 1.19171005e+02 3.81950867e+02 1.34460617e+02, 1.35454759e-01]
                              [5.32362000e+02 1.09554726e+02 5.40526550e+02 1.25222633e+02 8.88786495e-01]]

간단하죠? np.where 용법을 알아봤으니 이제 show_result_pyplot()를 이용하지 않고, 직접 inference 결과를 시각화해보겠습니다. 먼저 클래스 매핑을 위한 딕셔너리를 정의하겠습니다. 0부터 차례로 클래스를 매핑했습니다. 다음에 정의할 get_detected_img() 함수에 사용하기 위해서 만들었습니다.

# 0부터 차례로 클래스 매핑 
labels_to_names = {0:'person',1:'bicycle',2:'car',3:'motorbike',4:'aeroplane',5:'bus',6:'train',7:'truck',8:'boat',9:'traffic light',10:'fire hydrant',
                   11:'stop sign',12:'parking meter',13:'bench',14:'bird',15:'cat',16:'dog',17:'horse',18:'sheep',19:'cow',20:'elephant',
                   21:'bear',22:'zebra',23:'giraffe',24:'backpack',25:'umbrella',26:'handbag',27:'tie',28:'suitcase',29:'frisbee',30:'skis',
                   31:'snowboard',32:'sports ball',33:'kite',34:'baseball bat',35:'baseball glove',36:'skateboard',37:'surfboard',38:'tennis racket',39:'bottle',40:'wine glass',
                   41:'cup',42:'fork',43:'knife',44:'spoon',45:'bowl',46:'banana',47:'apple',48:'sandwich',49:'orange',50:'broccoli',
                   51:'carrot',52:'hot dog',53:'pizza',54:'donut',55:'cake',56:'chair',57:'sofa',58:'pottedplant',59:'bed',60:'diningtable',
                   61:'toilet',62:'tvmonitor',63:'laptop',64:'mouse',65:'remote',66:'keyboard',67:'cell phone',68:'microwave',69:'oven',70:'toaster',
                   71:'sink',72:'refrigerator',73:'book',74:'clock',75:'vase',76:'scissors',77:'teddy bear',78:'hair drier',79:'toothbrush' }

이어서 inference 결과 이미지를 반환하는 함수를 만들어 봅시다. 모델과 원본 이미지, 클래스 신뢰도 점수 기준을 인자로 입력받습니다. 

def get_detected_img(model, img_arr, score_threshold=0.3):
  '''모델과 원본 이미지, 필터링할 클래스 신뢰도 점수 기준을 입력받아 객체 탐지 inference 결과 이미지 반환'''
  img_arr_copy = img_arr.copy() # img_arr 복사 ---①

  bbox_color=(0, 255, 0) # 초록색
  text_color=(0, 0, 255) # 빨간색

  results = inference_detector(model, img_arr) # 객체 탐지 ineference 수행 ---②

  # 80개의 array를 갖는 results를 순회하며, 
  # 개별 2차원 array를 추출하고 이를 바탕으로 이미지에 경계 박스와 신뢰도 점수 표시 ---③
  for class_id, result in enumerate(results):
    if len(result) == 0: # 개별 array가 비었다면 해당 class id로 탐지된 값이 없음 ---④
      continue
    
    # 신뢰도 점수가 score_threshold보다 큰 값만 추출 ---⑤
    result_filtered = result[np.where(result[:, 4] > score_threshold)]
    
    for i in range(len(result_filtered)): # result_filtered를 순회 ---⑥
      # 객체 좌표값(경계 박스 좌표값) 추출 ---⑦
      x_min = int(result_filtered[i, 0]) # 좌상단 x좌표
      y_min = int(result_filtered[i, 1]) # 좌상단 y좌표
      x_max = int(result_filtered[i, 2]) # 우상단 x좌표
      y_max = int(result_filtered[i, 3]) # 우상단 y좌표
      # 경계 박스 그리기 ---⑧
      cv2.rectangle(img_arr_copy, (x_min, y_min), (x_max, y_max), color=bbox_color, thickness=2)

      class_name = labels_to_names[class_id] # 클래스명 ---⑨
      confidence_score = result_filtered[i, 4] # 신뢰도 점수 ---⑩
      caption = f'{class_name}: {confidence_score:.4f}' # 캡션
      # 캡션 달기 ---⑪
      cv2.putText(img_arr_copy, caption, (int(x_min), int(y_min - 7)), cv2.FONT_HERSHEY_SIMPLEX, 0.37, text_color, 1)

  return img_arr_copy # 경계 박스와 캡션이 달린 이미지 반환

① 먼저 원본 이미지를 복사해 img_arr_copy 변수에 저장합니다. 원본 이미지를 수정하면 안 되니까 복사본을 만든 겁니다. bbox_color와 text_color는 경계 박스와 텍스트 색상을 뜻합니다. 이어서 ② inference_detector() 메서드를 실행해 객체 탐지 inference를 수행합니다. inference 결과를 results 변수에 저장합니다. 이미 설명했듯이 results는 2차원 array(형상=(탐지된 객체 개수, 5)) 80개를 갖는 리스트입니다.

③ results를 순회하면서 이미지에 경계 박스와 신뢰도 점수를 표시합니다. 이때 enumerate()를 호출했는데, 인덱스가 클래스 id와 같습니다. 그래서 idx라는 변수명 대신 class_id라고 했습니다. ④ 만약 개별 array가 비었다면 해당 클래스로 탐지된 객체가 없다는 뜻입니다. 그러므로 continue를 실행해 다음 array로 넘어갑니다. 다음으로 ⑤ 신뢰도 점수가 score_threshold보다 큰 값만 추출합니다. 신뢰도가 높은 탐지 결과만 출력하기 위해서죠. 방금 전에 알아본 np.whrere 용법을 이용해 추출했습니다.

⑥ 이제는 result_filtered를 순회하며 ⑦ 경계 박스 좌표값을 구한 뒤, ⑧ 이미지에 경계 박스를 그립니다. 또한 ⑨ 클래스명과 ⑩ 신뢰도 점수도 ⑪ 이미지에 같이 표시합니다. ⑦ 경계 박스 좌표값을 구할 때 int()로 정수형으로 변환했죠? inference 결과 실수형이 반환되는데, 이미지 위에 경계 박스를 표시하려면 (픽셀) 정수값이 필요하기 때문입니다. 아울러, 신뢰도 점수를 구할 때 result_filtered[i, 4]로 4번째 열의 값을 가져왔네요. 0~3번째 값은 좌표값을, 4번째 값은 신뢰도 점수를 뜻하기 때문입니다.

최종적으로 경계 박스와 캡션(클래스명과 신뢰도 점수)이 달린 이미지를 반환합니다.

get_detected_img() 함수를 활용해서 inference 결과를 시각화해보죠. 아래 코드에서 ①로 inference 결과를 detected_img에 저장했습니다.

img_arr = cv2.imread('/content/mmdetection/demo/demo.jpg') # 원본 이미지

# inference 결과, 곧 경계 박스와 클래스명, 신뢰도 점수를 표시한 이미지 ---①
detected_img = get_detected_img(model, img_arr, score_threshold=0.3)

detected_img = cv2.cvtColor(detected_img, cv2.COLOR_BGR2RGB) # BGR을 RGB로 변환

plt.figure(figsize=(12, 12))
plt.imshow(detected_img)

직접 시각화한 객체 탐지 결과

이번에는 새로운 이미지를 활용해 inference를 해보겠습니다. 유명한 비틀즈 이미지를 사용해보죠. 먼저 비틀즈 이미지를 다운로드합니다.

!mkdir data # data 디렉터리 생성

# 비틀즈 이미지 다운로드
!wget -O /content/data/beatles01.jpg https://raw.githubusercontent.com/chulminkw/DLCV/master/data/image/beatles01.jpg

이어서 같은 방식으로 inference를 수행하고, 결과를 시각화해보죠.

img_arr = cv2.imread('/content/data/beatles01.jpg')
detected_img = get_detected_img(model, img_arr,  score_threshold=0.5)
detected_img = cv2.cvtColor(detected_img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 12))
plt.imshow(detected_img)

비틀즈 이미지 객체 탐지 시각화

사람과 차, 넥타이까지 잘 탐지했습니다.

지금까지 MMDetection 패키지를 활용해 MS COCO에서 사전 훈련된 Faster R-CNN으로 객체 탐지를 수행해봤습니다.

0 Comments
댓글쓰기 폼