# OpenCV DNN 장단점
1) 장점
- 딥러닝 개발 프레임워크 없이 쉽게 Inference 구현 가능
- OpenCV에서 지원하는 다양한 Computer Vision 처리 API와 Deep Learning을 쉽게 결합
2) 단점
- GPU 지원기능이 약함
- DDN 모듈은 과거에 NVIDIA GPU 지원이 안됨, 2019년 10월에 google에서 NVIDIA GPU 지원 발표함. 아직 환경 구성, 설치가 어려움, 점차 개선 예상됨
- OpenCV는 모델을 학습할수있는 방법을 제공하지 않으며 오직 inference만 가능
- CPU기반에서 Inference 속도가 개선되었으나, NVIDIA GPU가 지원되지 않아 타 Deep learning framework 대비 interence 속도가 크게 저하됨
# 타 deep learning frame과의 연동
- opencv는 자체적으로 딥러닝 가중치 모델을 생성하지 않고 타 framework에서 생성된 모델을 변환하여 로딩함
- dnn패키지는 파일로 생성된 타 프레임워크 모델을 로딩할 수 있도록 readNetFromxxx(가중치 모델, 환경 파일)API 제공
- 가중치 모델파일은 타 프레임워크 모델 파일, 환경 파일은 타 프레임워크 모델 파일의 환경(Config)파일을 DNN패키지에서 다시 변환한 환경 파일
Framework | 타 framework 모델 로딩 | 특징 | ||
tensorflow | cvNet = Cv2.dnn.readNetFromTensorflow(모델, 환경파일) | 많은 모델 제공 | ||
darknet | cvNet = Cv2.dnn.readNetFromDarknet(모델, 환경파일) | yolo만 로딩가능 | ||
torch | cvNet = Cv2.dnn.readNetFromTorch(모델, 환경파일) | |||
caffe | cvNet = Cv2.dnn.readNetFromCaffe(모델, 환경파일) |
* weights model은 tensorflow API로 PreTrained된 모델(Frozen Graph)를 다운로드
* config는 pretrained된 모델(Frozen Graph)를 구동을 위한 Config 다운로드
opencv지원 tensorflow모델
1) inference 수행시간 위주
- MobileNet-SSD v1
2) inference 정확도 위주
- inception-SSD v2
- Faster RCNN inception v2
- Faster RCNN ResNet-50
# opencv DNN을 이용한 inference 수행 절차
# 가중치 모델 파일과 환경설정 파일을 로드하여 inference network model 생성
cvNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.ph', 'graph.pbtxt')
img = cv2.imread('img.jpg')
rows, cols, channels = img.shape
# 입력 이미지를 preprocessing 하여 network 입력
cvNet.setInput(cv2.dnn.blobFromImage(img, size = (300, 300), swapRB=True, crop=False))
# interence network에서 detect된 정보 output 추출
networkOutput = cvNet.forward()
# 추출된 output에서 detect 정보를 기반으로 원본 image위에 object detection 시각화
for detection in networkOutput[0,0]:
# object detected 결과, bounding box 좌표, 예측 레이블들을 원본 image위에 시각화 로직
# opencv blobFromImage()
Image를 preprocessing 수행하여 network에 입력할수있게 제공
- 이미지 사이즈 고정
- 이미지 값 스케일링
- BGR을 RGB로 변경, 이미지를 CROP할수있는 옵션 제공
# BGR을 해결하는 법
1) cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
2) cvNet.setInput(cv2.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))
swapRB=True로 변환하여 네트워크에 입력
# video stream capture를 이용한 video object detection
opencv의 videocapture() api를 이용하여 video stream을 frame by frame 별로 capture한 image에 object detection을 수행하는 방식
input_video = cv2.VideoCapture(input_file_path)
while(True) :
frame 별로 Object Detection 수행
'Computer_Science > Computer Vision Guide' 카테고리의 다른 글
3-12. Video inference (0) | 2021.09.27 |
---|---|
3-10~11. Faster RCNN Object Detection (0) | 2021.09.27 |
3-8. RPN, Positive Anchor Box (0) | 2021.09.26 |
10일차 - 영상 데이터 기계학습 활용 (0) | 2021.09.26 |
3-7. anchor box를 이용한 RPN (0) | 2021.09.24 |