딥러닝과 OpenCV DNN 모듈

BERT·2023년 5월 2일
0

Computer Vision

목록 보기
51/56

딥러닝

LeNet-5

필기체 숫자 인식을 위한 LeNet-5 (LeCun et al., 1998)
CNN 원조
28x28 필기체 숫자 영상을 32x32로 확장하여 만든 입력 데이터 사용
전체 7개 레이어 : Conv-Pool-Conv-Pool-FC-FC-FC

AlexNet

AlexNet (Krizhevsky et al., 2012)
2012년 ILSVRC 영상 인식 분야 1위
Top-5 Error: 15.4%
하드웨어의 제약으로 2개의 GPU 사용

VGG16

VGG16 (Simonyan and Zisserman, 2014)
2014년 ILSVRC 영상 인식 분야 2위
Top-5 Error: 7.3%
컨볼루션 레이어에서 3x3 필터만 사용
총 16개 레이어로 구성

GoogLeNet

GoogLeNet (Szegedy et al., 2014)
2014년 ILSVRC 영상 인식 분야 1위
Top-5 Error: 6.7%
총 22개의 레이어로 구성
Inception 모듈

OpenCV DNN 모듈 개요

OpenCV DNN 모듈

미리 학습된 딥러닝 모델을 이용하여 실행하는 기능
학습은 지원하지 않음
OpenCV 3.3 버전부터 기본 기능으로 제공
OpenCV 4.3 버전부터 GPU(CUDA) 지원
Deep Learning in OpenCV

지원하는 딥러닝 프레임워크

Caffe
Tensorflow
torch
Darknet
ONNX

Tested networks

Image classification

AlexNet
GoogLeNet
VGG
ResNet
SqueezeNet
DenseNet
ShuffleNet
Inception
MobileNet
Darknet
ONNX formats

Object detection

SSD VGG
MobileNet-SSD
Faster-RCNN
R-FCN
OpenCV face detector
SSD, Faster-RCNN and Mask-RCNN
EAST
YOLOv2, tiny YOLO, YOLOv3, Tiny YOLOv3, YOLOv4, Tiny Yolov4

Semantic segmentation

FCN
ENet

Pose estimation

OpenPose

Image processing

Colorization
Fast-Neural-Style
Style Transfer

Person identification

OpenFace

Net 클래스와 주요 함수 사용법

네트워크 불러오기

model : 훈련된 가중치를 저장하고 있는 이진 파일 이름
config : 네트워크 구성을 저장하고 있는 텍스트 파일 이름
framework : 명시적인 딥러닝 프레임워크 이름
return : dnn:Net 객체

Net readNet(const String& model, 
			const String& config = "", 
            const String& framework = "");
프레임워크model파일 확장자config파일 확장자framework 문자열
caffe*.caffemodel*.prototxt"caffe"
tensorflow*.pb*pbtxt"tensorflow"
torch*.t7 *.net"torch"
darknet*.weights*.cfg"darknet"
DLDT*.bin*.xml"dldt"
ONNX*.onnx"onnx"

네트워크 입력 blob 만들기

image : 입력 영상
scalefactor : 입력 영상 픽셀 값에 곱할 값
size : 출력 영상의 크기
mean : 입력 영상 각 채널에서 뺄 평균 값
swapRB : R과 B 채널에서 서로 바꿀 것인지를 결정하는 플래그
crop : crop 수행 여부
ddepth : 출력 blob 깊이
return : 영상으로부터 구한 blob 4차원(NCHW) Mat 행렬 객체

Mat blobFromImage(InputArray image,
				  double scalefactor=1.0,
                  const Size& size = Size(),
                  const Scalar& mean = Scalar(),
                  bool swapRB = false,
                  bool crop = false,
                  int ddepth = CV_32F);

네트워크 입력 설정하기

blob : blob 객체
name : 입력 레이어 이름
scalefactor : 추가적으로 픽셀 값에 곱할 값
mean : 추가적으로 픽셀 값에서 뺄 평균 값

void Net::setInput(InputArray blob,
				   const String& name = "",
                   double scalefactor = 1.0,
                   const Scalar& mean = Scalar());

네트워크 순방향 실행 (추론)

outputName : 출력 레이어 이름
return : 지정한 레이어의 출력 blob

Mat Net::forward(const String& outputName = String());

MNIST 학습하기

Tensorflow 또는 PyTorch를 이용하여 MNIST 필기체 숫자 인식을 학습하기
학습된 모델을 파일로 저장하기
OpenCV에서 학습된 모델을 불러와서 필기체 인식 프로그램을 실행하기

0개의 댓글