• 6행 소스 코드에서 cv::dnn 네임스페이스를 사용하도록 설정합니다.
• 9행 명령행 인자를 받을 수 있도록 main() 함수 인자를 설정합니다.
• 13~18행 프로그램 실행 시 명령행 인자를 지정하지 않으면 space_shuttle.jpg 파일을 입력 영상으로 사용하고, 명령행 인자가 있으면 해당 영상 파일을 입력 영상으로 사용합니다.
• 27행 bvlc_googlenet.caffemodel 파일과 deploy.prototxt 파일을 이용하여 Net 객체를 생성합니다.
• 36~51행 classification_classes_ILSVRC2012.txt 파일을 한 줄씩 읽어서 해당 문자열을 classNames 벡터에 저장합니다.
• 55~57행 입력 영상 img를 이용하여 입력 블롭 inputBlob을 생성하고, 이를 네트워크에 입력으로 주고 실행합니다. 실행 결과는 prob 행렬에 저장됩니다.
• 61~63행 prob 행렬에서 최댓값과 최댓값 위치를 찾습니다. 최댓값 위치는 인식된 영상 클래스 번호이고, 최댓값은 확률을 의미합니다.
• 65~66행 인식된 클래스 이름과 확률을 문자열 형태로 영상 위에 나타냅니다.
코드 16-4의 classify 프로그램 실행 결과를 그림 16-11에 나타냈습니다. 그림 16-11은 명령행 인자를 지정하지 않고 프로그램을 실행한 결과이며, space_shuttle.jpg 우주 왕복선 사진을 인식한 결과입니다. img 창 상단에 객체의 이름 space shuttle과 확률 99.99% 문자열이 출력되어 있는 것을 확인할 수 있습니다.
▲ 그림 16-11 구글넷 영상 인식 예제 프로그램 실행 결과