기존 딥러닝 프레임과의 연동과정을 알아보자.
OpenCV 의 경우 자체적으로 딥러닝 가중치 모델을 생성하지 않고 타 Framework 에서 생성된 모델을 변환하여 로딩한다. 이때는 DNN 패키지가 사용되는데, 이 dnn 패키지는 파일로 생성된 타 프레임웍 모델을 로딩할 수 있도록 readNetFromXXX API를 제공하는 역할을 한다.
가중치모델파일이란 타 프레임워크의 모델 파일을 의미하며, 환경파일은 타 프레임워크 모델의 환경(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 에 적용하기 좋다.
다음 링크 를 통해 접근할 수 있다.
중요한 함수로는 readNetFromTensorflow, blobFromImage, setInput, cvNet.forward() 가 있다.
cvNet = cv2.dnn.readNetfromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')
img = cv2.imread('img.jpg')
rows, cols, channels = img.shape
인자로 전달받는 것은 가중치모델파일, config 파일이다.
cvNet.setInput(cv2.dnn.blobFromImage(img, size=(300,300), swapRB=True, crop=False) # -> RGB로 변환하여 네트웍에 입력
앞에서 만들어진 네트워크에 전처리된 사진을 넣는다. blobFromImage()는 전처리를 수행하여 네트워크에 입력할 수 있게 제공해주는 메서드이며, 1. 이미지 사이즈를 고정하고 2. 이미지 값 스케일링하며 3. BGR을 RGB로 변경, 이미지를 Cropt 할 수 있는 옵션을 제공한다.
networkOutput = cvNet.forward()
입력한 객체에 Forward 를 수행하면 detect 된 정보들이 networkOutput 에 저장되게 된다.
for detection in networkOutput[0, 0]:
### ojbect detect 결과, 바운딩박스좌표, 예측 레이블 등을 이미지 위에 시각화
루프를 돌면서 전에 인식한 정보를 시각화한다. 개별 Object 별로 정보가 들어있다!
➡️ 이는 단일 프레임에서 적용되는 Object Detection 이고, 동영상에서VideoCapture() 은 프레임마다 Ojbect Detection 을 수행할 수 있게 도와주는 메서드이다. 가장 핵심이 되는 API!