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로 바꿔줘야 해요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV와 Haar Cascade를 이용한 얼굴 검출 (0) | 2025.06.29 |
---|---|
OpenCV에서 프레임 단위 영상 처리 기법 (0) | 2025.06.28 |
OpenCV로 영상 저장하기: VideoWriter 사용법 (0) | 2025.06.28 |
OpenCV VideoCapture 클래스 이해 및 활용 (0) | 2025.06.28 |
OpenCV로 실시간 웹캠 캡처하기 (0) | 2025.06.27 |