본문 바로가기

IT

OpenCV DNN 모듈로 딥러닝 모델 로딩하기

OpenCV DNN 모듈은 딥러닝 프레임워크에서 학습한 모델을 로드하고,

이미지나 영상에 적용할 수 있게 해줘요.

 

OpenCV DNN 모듈로 딥러닝 모델 로딩하기


특히 복잡한 환경 설정 없이도 Caffe, TensorFlow, ONNX 등의 모델을 

간단하게 가져다 쓸 수 있어서 좋아요.

OpenCV DNN 모듈이란?

OpenCV DNN 모듈은 다양한 딥러닝 프레임워크(Caffe, TensorFlow, ONNX, Darknet 등)에서

학습된 모델을 OpenCV만으로 불러오고 실행할 수 있게 해주는 모듈이에요.


추론(Inference)만을 위한 경량화된 구조라서 학습은 지원하지 않지만,
이미 학습된 모델을 기반으로 얼굴 인식, 객체 검출, 스타일 전이 등 다양한 작업을 수행할 수 있어요.


C++뿐만 아니라 Python에서도 동일하게 사용할 수 있으며, GPU 가속도 일부 가능해요.

 

딥러닝 모델 로딩을 위한 기본 흐름

OpenCV에서 딥러닝 모델을 로딩하려면 cv::dnn::readNet() 또는

readNetFromXXX() 계열의 함수를 사용해요.
모델 구조 파일과 가중치 파일을 함께 지정해야 하고,

프레임워크별로 지원되는 포맷이 달라요.


예를 들어, Caffe는 .prototxt + .caffemodel,

TensorFlow는 .pb + .pbtxt, ONNX는 단일 .onnx 파일을 사용해요.

 

cv::dnn::Net net = cv::dnn::readNetFromONNX("model.onnx");

이렇게 하면 ONNX 포맷의 모델을 메모리에 로딩하고 바로 사용할 수 있어요.

입력 이미지 전처리: blob 만들기

모델에 입력하기 전에 이미지를 정확한 크기, 채널 수, 정규화 방식에 맞게 전처리해야 해요.
OpenCV DNN에서는 cv::dnn::blobFromImage() 함수로 이러한 전처리를 한 번에 처리할 수 있어요.


이때 크기 조정, 스케일링, 평균값 보정, RGB ↔ BGR 변환 여부 등을 조정할 수 있어요.

cv::Mat blob = cv::dnn::blobFromImage(image, 1.0/255.0, cv::Size(224, 224), cv::Scalar(0,0,0), true, false);
net.setInput(blob);

위 코드는 224x224 크기로 리사이즈하고,

픽셀을 0~1 사이로 정규화한 뒤 DNN 네트워크에 입력으로 설정하는 흐름이에요.

추론 결과 받아오기

입력을 설정한 후에는 .forward() 함수를 호출해서 추론 결과를 받아올 수 있어요.
이 결과는 cv::Mat 형태로 반환되며, 모델의 구조에 따라 분류 확률, 좌표, 마스크 등이 들어 있을 수 있어요.
후처리를 통해 필요한 정보를 추출해야 하고,

argmax, threshold, reshape() 같은 OpenCV 함수들을 함께 쓰면 좋아요.

cv::Mat output = net.forward();
// 예: 분류 모델이라면 가장 큰 확률의 인덱스를 찾기
cv::Point classIdPoint;
double confidence;
cv::minMaxLoc(output.reshape(1,1), 0, &confidence, 0, &classIdPoint);
int classId = classIdPoint.x;

이 코드는 분류 모델에서 가장 높은 확률을 갖는 클래스 ID를 추출하는 예제입니다.

DNN 성능 최적화와 주의사항

OpenCV DNN은 CPU에서도 잘 작동하지만,

속도 개선을 위해 OpenVINO나 CUDA 백엔드를 설정할 수 있어요.
net.setPreferableBackend()와 net.setPreferableTarget() 함수를 활용하면

Intel GPU나 NVIDIA GPU로 추론을 가속할 수 있어요.


또한, 모델의 입력 크기와 형식이 정확히 맞지 않으면 오류가 발생하니,

모델 문서나 예제와 동일하게 전처리하는 것이 중요해요.


실행 환경에 따라 OpenCV 빌드 옵션에 DNN 모듈과 관련된 라이브러리가 포함되어야 정상 동작해요.

 

net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);  // 기본 CPU
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);

이 코드는 DNN 백엔드를 기본 CPU로 설정한 예로,

CUDA를 쓸 경우 DNN_BACKEND_CUDA, DNN_TARGET_CUDA로 바꿔줘야 해요.

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV DNN 모듈로 딥러닝 모델 로딩하기.mp3
4.55MB