OpenCV 안에 있는 Detection 모델 사용 꿀팁

OpenCV Detection 모델 openCV를 설치하면 딥러닝 프레임워크가 없어도 사용 가능한 모델을 제공합니다.

OpenCV에서는 Computer Vision 처리 기능과 딥러닝을 쉽게 결합하여 사용할 수 있습니다.

● 단점

  • GPU 지원이 부족합니다.
  • 학습은 불가능하며 오직 inference만 가능합니다.
  • 다른 딥러닝 프레임워크를 사용했을 때보다 처리 속도가 느립니다.

딥러닝 모델 load 하기 자체적으로 가중치 모델을 생성하지 않고 다른 프레임워크에서 생성된 모델을 변환하여 로딩하는 방식입니다.

가중치 모델 파일과 환경 파일이 필요합니다. (각 사이트에서 받을 수 있습니다.)

python

import cv2

# Tensorflow

cvNet = cv2.dnn.readNetFromTensorflow(‘가중치 모델 파일’,‘환경 파일’)

# Darknet (Yolo만 가능)

cvNet = cv2.dnn.readNetFromDarknet(‘가중치 모델 파일’,‘환경 파일’)

# Torch

cvNet = cv2.dnn.readNetFromTorch(‘가중치 모델 파일’,‘환경 파일’)

# Caffe

cvNet = cv2.dnn.readNetFromCaffe(‘가중치 모델 파일’,‘환경 파일’)

● Tensorflow 모델 가중치 및 환경 파일 다운로드

아래 링크에서 그림과 같이 다운로드할 수 있습니다.

링크 : github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

OpenCV DNN을 이용한 Inference 수행 절차

  1. 모델을 load 합니다.

python

import cv2

# 모델 load

cv_net = cv2.dnn.readNetFromTensorflow(‘가중치 모델 파일’,‘환경 파일’)

  1. 이미지를 preprocessing하여 모델에 입력합니다.

python

# 이미지 load

img = cv2.imread(os.path.join(default_dir,‘data/image/beatles01.jpg’))

# 원본 이미지 shape, 시각화 할 때 필요합니다.

rows, cols = img.shape[0], img.shape[1]

draw_img = img.copy() # 원본 이미지는 보존하면서 시각화하기 위해

# 이미지를 모델에 입력합니다.

# 원본 이미지 배열 BGR을 RGB로 변환하여 배열 입력. swapRB

# Tensorflow Faster RCNN은 size를 고정할 필요가 없는 것으로 추정됩니다.

cv_net.setInput(cv2.dnn.blobFromImage(img, swapRB=True, crop=False))

  1. Output을 받습니다.

python

# output

cv_out = cv_net.forward()

# cv_out.shape = [1,1,Detection 된 이미지수, 7] # 이미지를 1개만 넣었기 때문에

# Detection된 이미지별 각 결과 가져오기

for detection in cv_out[0,0,:,:]:

class_id = detection[1]

score = detection[2]

left = detection[3] * cols

top = detection[4] * rows

right = detection[5] * cols

bottom = detection[6] * rows

Output의 형태는 4차원입니다. 이미지 1개만을 넣었기 때문에 [1, 1, Detection 된 이미지수, 7]의 shape를 가지게 됩니다.

각 Detection된 이미지에 대해 7개의 정보를 가지고 있습니다. 0번 Index는 아무 정보가 없고

1번은 분류 class, 2번은 score(01), 36번은 좌표정보(01)를 갖습니다. 좌표 정보는 01 값으로 비율로 나와있기 때문에

입력 이미지의 가로, 세로 값을 곱해주어 이미지 상의 좌표를 얻습니다.

  1. 출력된 결과를 바탕으로 시각화 등에 이용합니다.

labels_to_names = 숫자 라벨과 문자 라벨의 딕셔너리(아래설명)

python

# 라벨 이름과 점수를 caption으로 이미지에 입력합니다.

caption = “{}: {:.4f}”.format(labels_to_names[class_id], score)

# Detection된 이미지에 직사각형 박스를 그려줍니다.

# cv2.rectangle()은 인자로 들어온 draw_img에 사각형을 그립니다. 위치 인자는 반드시 정수형입니다.

green_color = (0, 255, 0) # 박스 초록색

red_color = (0, 0, 255) # caption 빨간색

cv2.rectangle(draw_img, (int(left), int(top)), (int(right), int(bottom)), color=green_color, thickness=2)

cv2.putText(draw_img, caption, (int(left), int(top – 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.4, red_color, 1)

● 모델별 label dictionary

MS-coco 데이터를 기준으로 각 모델들의 label dictionary가 다릅니다.

모델 종류 라벨 종류

OpenCV DNN Tensorflow Faster RCNN 모델 1번

Tensorflow SSD 모델 2번

Tensorflow Mask RCNN 모델 1번

Darknet YOLO 모델 3번

         
X
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Scroll to Top