지금까지 설명한 구글넷 사용 예제 코드를 모아서 영상을 인식하는 예제 프로그램을 만들어 보겠습니다. 코드 16-4에 나타난 classify 프로그램 소스 코드는 영상에 포함된 주된 객체를 판단하고, 해당 객체 이름과 판단 확률을 영상 위에 문자열로 출력합니다. 코드 16-4에 나타난 소스 코드 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch16/classify 프로젝트에서 확인할 수 있습니다.10
코드 16-4 구글넷 영상 인식 예제 프로그램 [ch16/classify]
01 #include "opencv2/opencv.hpp" 02 #include <iostream> 03 #include <fstream> 04 05 using namespace cv; 06 using namespace cv::dnn; 07 using namespace std; 08 09 int main(int argc, char* argv[]) 10 { 11 // Load an image 12 13 Mat img; 14 15 if (argc < 2) 16 img = imread("space_shuttle.jpg", IMREAD_COLOR); 17 else 18 img = imread(argv[1], IMREAD_COLOR); 19 20 if (img.empty()) { 21 cerr << "Image load failed!" << endl; 22 return -1; 23 } 24 25 // Load network 26 27 Net net = readNet("bvlc_googlenet.caffemodel", "deploy.prototxt"); 28 29 if (net.empty()) { 30 cerr << "Network load failed!" << endl; 31 return -1; 32 } 33 34 // Load class names 35 36 ifstream fp("classification_classes_ILSVRC2012.txt"); 37 38 if (!fp.is_open()) { 39 cerr << "Class file load failed!" << endl; 40 return -1; 41 } 42 43 vector<String> classNames; 44 string name; 45 while (!fp.eof()) { 46 getline(fp, name); 47 if (name.length()) 48 classNames.push_back(name); 49 } 50 51 fp.close(); 52 53 // Inference 54 55 Mat inputBlob = blobFromImage(img, 1, Size(224, 224), Scalar(104, 117, 123)); 56 net.setInput(inputBlob); 57 Mat prob = net.forward(); 58 59 // Check results & display 60 61 double maxVal; 62 Point maxLoc; 63 minMaxLoc(prob, NULL, &maxVal, NULL, &maxLoc); 64 65 String str = format("%s (%4.2lf%%)", classNames[maxLoc.x].c_str(), maxVal * 100); 66 putText(img, str, Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255)); 67 imshow("img", img); 68 69 waitKey(); 70 return 0; 71 }
10 classify 프로그램을 실행하기 위해 필요한 파일 중에서 deploy.prototxt와 classification_classes_ILSVRC2012.txt 파일은 편의상 classify 프로젝트 폴더에 미리 넣어 두었습니다. bvlc_googlenet.caffemodel 파일은 528쪽에 나타난 링크에서 내려받은 후, classify 프로젝트 폴더로 이동하기 바랍니다.