16.2.2 OpenCV에서 학습된 모델 불러와서 실행하기
앞 절에서는 텐서플로를 이용하여 MNIST 필기체 숫자 인식을 위한 학습을 수행하고, 그 결과를 mnist_cnn.pb 파일에 저장하였습니다. 이 절에서는 OpenCV dnn 모듈 기능을 이용하여 mnist_cnn.pb 파일을 불러와서 네트워크를 생성하고, 이 네트워크에 사용자가 마우스로 그린 숫자 영상을 입력으로 전달하여 인식하는 예제 프로그램을 만들어 보겠습니다.
OpenCV dnn 모듈을 사용함에 있어 가장 중요한 작업은 네트워크를 생성하는 일입니다. dnn 모듈에서 네트워크는 Net 클래스 객체로 표현되며, 이 객체는 readNet() 함수를 사용하여 생성할 수 있습니다. mnist_cnn.pb 학습 모델 파일을 이용하여 Net 객체를 생성하는 예제 코드는 다음과 같습니다.
Net net = readNet("mnist_cnn.pb");
앞 소스 코드에서 사용한 mnist_cnn.pb 파일은 프로그램 실행 폴더에 함께 있어야 합니다. readNet() 함수를 사용한 후에는 Net::empty() 함수를 사용하여 반환된 Net 객체가 정상적으로 생성되었는지를 확인하는 것이 좋습니다.
네트워크를 생성한 후에는 네트워크에 입력으로 전달할 블롭을 생성해야 합니다. 이 작업은 blobFromImage() 함수로 수행할 수 있습니다. 앞 절에서 사용한 MNIST 데이터셋은 하나의 필기체 숫자가 28×28 크기의 2차원 행렬 형식이고, 각 원소 값은 0에서 1 사이의 실수 값으로 구성된다고 설명했습니다. 그러므로 mnist_cnn.pb 파일로부터 생성한 네트워크에 새로운 입력 데이터를 전달할 때에도 이와 같은 형식에 맞게 변환해야 합니다. 다음은 입력 그레이스케일 영상 img의 각 픽셀에 1/255.f를 곱하고, 크기를 28×28로 변환하여 블롭 blob을 생성하는 코드입니다.
Mat blob = blobFromImage(img, 1/255.f, Size(28, 28));