[CV] OpenCV, Object Detection 구현하기 (준비)

박경민·2023년 9월 9일
0

[Computer Vision]

목록 보기
10/25

OpenCV 이용한 DNN 개요

기존 딥러닝 프레임과의 연동과정을 알아보자.

OpenCV 의 경우 자체적으로 딥러닝 가중치 모델을 생성하지 않고 타 Framework 에서 생성된 모델을 변환하여 로딩한다. 이때는 DNN 패키지가 사용되는데, 이 dnn 패키지는 파일로 생성된 타 프레임웍 모델을 로딩할 수 있도록 readNetFromXXX API를 제공하는 역할을 한다.

  • FrameWork: Tensorflow -> cvNet = Cv2.dnn.readNetfromTensorflow(가중치모델파일, 환경파일)
  • FrameWork: Darknet -> cvNet = Cv2.dnn.readNetfromDarknet(가중치모델파일, 환경파일) (YOLO 모델 로딩)
  • FrameWork: Torch -> cvNet = Cv2.dnn.readNetfromTorch(가중치모델파일, 환경파일)
  • FrameWork: Caffe -> cvNet = Cv2.dnn.readNetfromCaffe(가중치모델파일, 환경파일)

가중치모델파일이란 타 프레임워크의 모델 파일을 의미하며, 환경파일은 타 프레임워크 모델의 환경(Config) 파일을 DNN 패키지에서 다시 변환한 환경 파일을 말한다.

OpenCV 에서 사용 가능한 Object Detection 모델은 다음과 같다.

  • MobileNet-SSD v1

  • MobileNet-SSD v1 PPN

  • MobileNet-SSD v2
    -> Inference 수행 시간 위주의 task 에 적용하기 좋다.

  • Inception-SSD v2

  • Faster-RCNN Inception v2

  • Faster-RCNN ResNet-50

  • Mask-RCNN Inception v2
    -> Inference 정확도가 중요한 task 에 적용하기 좋다.

다음 링크 를 통해 접근할 수 있다.

OpenCV DNN을 이용한 Inference 수행절차

중요한 함수로는 readNetFromTensorflow, blobFromImage, setInput, cvNet.forward() 가 있다.

  1. 가중치모델파일, config 파일을 로드하여 네트웍 생성
cvNet = cv2.dnn.readNetfromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt') 

img = cv2.imread('img.jpg') 
rows, cols, channels = img.shape

인자로 전달받는 것은 가중치모델파일, config 파일이다.

  1. 입력이미지를 preprocess 하여 네트웍 입력
cvNet.setInput(cv2.dnn.blobFromImage(img, size=(300,300), swapRB=True, crop=False) # -> RGB로 변환하여 네트웍에 입력 

앞에서 만들어진 네트워크에 전처리된 사진을 넣는다. blobFromImage()는 전처리를 수행하여 네트워크에 입력할 수 있게 제공해주는 메서드이며, 1. 이미지 사이즈를 고정하고 2. 이미지 값 스케일링하며 3. BGR을 RGB로 변경, 이미지를 Cropt 할 수 있는 옵션을 제공한다.

  1. Inference 네트웍에서 output 추출
networkOutput = cvNet.forward() 

입력한 객체에 Forward 를 수행하면 detect 된 정보들이 networkOutput 에 저장되게 된다.

  1. 추출된 output 에서 detect 정보를 기반, 원본 이미지 위에 Object detection 시각화
for detection in networkOutput[0, 0]:
	### ojbect detect 결과, 바운딩박스좌표, 예측 레이블 등을 이미지 위에 시각화

루프를 돌면서 전에 인식한 정보를 시각화한다. 개별 Object 별로 정보가 들어있다!

➡️ 이는 단일 프레임에서 적용되는 Object Detection 이고, 동영상에서VideoCapture() 은 프레임마다 Ojbect Detection 을 수행할 수 있게 도와주는 메서드이다. 가장 핵심이 되는 API!

profile
Mathematics, Algorithm, and IDEA for AI research🦖

0개의 댓글