OpenCV의 dnn 모듈은 TensorFlow에서 학습한 모델을 직접 불러와서 사용할 수 있도록 도와줘요.
복잡한 환경 설정 없이 .pb 또는 .pbtxt 파일을 준비하고, 이미지나 영상에서 바로 추론 결과를 볼 수 있는 구조예요.
TensorFlow 모델을 OpenCV에서 사용할 수 있나요?
네, 가능해요! OpenCV의 DNN 모듈은 TensorFlow의 그래프 모델(.pb)과 구조 정의 파일(.pbtxt)를 함께 사용해서 모델을 불러올 수 있어요.
일반적으로 TensorFlow 1.x에서 저장된 모델들이 호환이 잘 돼요.
TensorFlow 2.x에서 SavedModel 포맷을 사용 중이라면, 이를 .pb 형태로 변환해주는 과정이 필요해요.
사전 학습된 모델 중에는 객체 감지, 이미지 분류, 얼굴 인식 등이 많이 사용돼요.
OpenCV만으로도 Python 없이도 빠르게 테스트할 수 있어 매우 실용적이에요.
모델 파일 준비하기: .pb와 .pbtxt
OpenCV에서 TensorFlow 모델을 쓰기 위해서는 두 가지 파일이 필요해요.
- .pb 파일: 학습된 모델의 가중치와 그래프 구조
- .pbtxt 파일: 텐서 그래프의 구조를 설명하는 텍스트 형태 (필요 시 직접 생성 가능)
보통 .pbtxt는 TensorFlow의 import_graph_def API를 활용하거나 변환 도구로 생성할 수 있어요.
예를 들어, ssd_mobilenet_v1_coco 모델은 TensorFlow 모델 Zoo에서 다운로드할 수 있어요.
cv::dnn::Net net = cv::dnn::readNetFromTensorflow("frozen_inference_graph.pb", "graph.pbtxt"); |
이렇게 두 파일을 함께 지정해줘야 모델이 정확히 로드돼요.
입력 이미지 전처리: blob 만들기
TensorFlow 모델도 입력 이미지의 크기, 채널 순서, 정규화 값 등을 정확히 맞춰줘야 해요.
OpenCV에서는 cv::dnn::blobFromImage()를 사용해서 손쉽게 전처리를 할 수 있어요.
이미지를 지정된 사이즈로 조정하고, 픽셀 값을 0~1 범위로 스케일링하거나 평균값을 빼줄 수도 있어요.
cv::Mat image = cv::imread("sample.jpg"); cv::Mat blob = cv::dnn::blobFromImage(image, 1.0, cv::Size(300, 300), cv::Scalar(127.5, 127.5, 127.5), true, false); net.setInput(blob); |
이 코드는 300x300 크기의 입력을 사용하는 SSD 모델에 적합한 전처리 방식이에요.
추론 수행하고 결과 처리하기
전처리된 이미지를 입력으로 설정한 뒤에는 .forward() 함수로 추론 결과를 받아올 수 있어요.
모델마다 출력 형식은 다르지만, 일반적으로 [batch, numDetections, 1, 7] 형식을 따르는 경우가 많아요.
이 중에서 신뢰도가 높은 결과만 골라서 시각화하거나 로그를 남기면 돼요.
cv::Mat output = net.forward(); for (int i = 0; i < output.size[2]; ++i) { float confidence = output.at<float>(0, 0, i, 2); if (confidence > 0.5) { int x1 = static_cast<int>(output.at<float>(0, 0, i, 3) * image.cols); int y1 = static_cast<int>(output.at<float>(0, 0, i, 4) * image.rows); int x2 = static_cast<int>(output.at<float>(0, 0, i, 5) * image.cols); int y2 = static_cast<int>(output.at<float>(0, 0, i, 6) * image.rows); cv::rectangle(image, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 255, 0), 2); } } |
이 코드는 검출된 객체의 위치와 신뢰도를 기준으로 사각형을 그려주는 예제예요.
성능 최적화와 실시간 활용 팁
OpenCV에서 TensorFlow 모델을 쓸 때도 속도와 정확도 간의 밸런스를 맞춰야 해요.
모델이 무거울 경우 이미지 크기를 줄이거나, setPreferableBackend()를 통해 하드웨어 가속을 적용할 수 있어요.
실시간 영상에서 사용할 땐 VideoCapture로 프레임을 가져와서 루프 내에서 계속 추론하는 구조로 만들면 돼요.
이 과정을 구조화해두면 다양한 모델로 쉽게 바꿔가며 테스트해볼 수 있어요.
특히 YOLO, SSD, DeepLab 같은 모델도 비슷한 방식으로 연동 가능하니, 확장성이 좋아요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV 환경설정 팁 - 다양한 IDE 환경에서 (0) | 2025.07.04 |
---|---|
OpenCV로 이미지 분류 모델의 결과를 시각화하는 방법 (0) | 2025.07.03 |
OpenCV에서 YOLO 모델 사용해보기 (0) | 2025.07.01 |
OpenCV DNN 모듈로 딥러닝 모델 로딩하기 (0) | 2025.06.30 |
OpenCV와 Haar Cascade를 이용한 얼굴 검출 (0) | 2025.06.29 |