더북(TheBook)

지금까지 설명한 구글넷 사용 예제 코드를 모아서 영상을 인식하는 예제 프로그램을 만들어 보겠습니다. 코드 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 프로젝트 폴더로 이동하기 바랍니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.