본문 바로가기

IT

OpenCV + TensorFlow 모델 연동 튜토리얼

OpenCV의 dnn 모듈은 TensorFlow에서 학습한 모델을 직접 불러와서 사용할 수 있도록 도와줘요.

 

OpenCV + 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 같은 모델도 비슷한 방식으로 연동 가능하니, 확장성이 좋아요.

 

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

OpenCV + TensorFlow 모델 연동 튜토리얼.mp3
4.95MB