1 |
|
2 |
|
3 | #include <iostream>
|
4 | #include <fstream>
|
5 |
|
6 | #include <cassert>
|
7 |
|
8 |
|
9 | #include <opencv2/core/core.hpp>
|
10 | #include <opencv2/highgui/highgui.hpp>
|
11 | #include <opencv2/ml/ml.hpp>
|
12 |
|
13 |
|
14 |
|
15 | static
|
16 | void
|
17 | usage(char* argv0)
|
18 | {
|
19 | std::cerr<<"Usage: "<<argv0<<" inputFilename inputModelFile"<<std::endl;
|
20 | std::cerr<<"inputFilename: input filename with data to classify & results obtained on linux\n";
|
21 | std::cerr<<"inputModelFile : input model file\n";
|
22 | std::cerr<<"\n";
|
23 | }
|
24 |
|
25 | static
|
26 | void
|
27 | processArgs(int argc, char *argv[],
|
28 | std::string &inputFilename,
|
29 | std::string &modelFilename)
|
30 | {
|
31 | if (argc != 3) {
|
32 | usage(argv[0]);
|
33 | exit(EXIT_FAILURE);
|
34 | }
|
35 |
|
36 | inputFilename = argv[1];
|
37 | modelFilename = argv[2];
|
38 |
|
39 | if (inputFilename.empty()) {
|
40 | std::cerr << "Error: unspecified input filename\n";
|
41 | usage (argv[0]);
|
42 | exit (EXIT_FAILURE);
|
43 | }
|
44 | if (modelFilename.empty()) {
|
45 | std::cerr<<"Error: no model filename specified\n";
|
46 | usage(argv[0]);
|
47 | exit(EXIT_FAILURE);
|
48 | }
|
49 |
|
50 |
|
51 | }
|
52 |
|
53 | void
|
54 | checkResults(const cv::Mat &res,
|
55 | const cv::Mat &resMat,
|
56 | const cv::Mat &data,
|
57 | const std::string &s)
|
58 | {
|
59 | assert(res.cols == resMat.cols);
|
60 | assert(res.rows == resMat.rows);
|
61 | assert(res.type() == resMat.type());
|
62 | assert(resMat.isContinuous());
|
63 | assert(res.isContinuous());
|
64 |
|
65 |
|
66 | const float *r1 = res.ptr<float>(0);
|
67 | const float *r2 = resMat.ptr<float>(0);
|
68 |
|
69 | const float EPS = 0.000001;
|
70 |
|
71 | int nbWrongs = 0;
|
72 | for (int i=0; i<res.rows; ++i) {
|
73 |
|
74 | if (fabs(*r1 - *r2) > EPS) {
|
75 | if (nbWrongs < 6) {
|
76 | std::cerr<<"For data["<<i<<": ";
|
77 | const float *d = data.ptr<float>(i);
|
78 | for (int i=0; i<data.cols; ++i) {
|
79 | std::cerr<<*d<<" ";
|
80 | ++d;
|
81 | }
|
82 | std::cerr<<"\n => classifier gives "<<*r1<<" instead of "<<*r2<<"\n";
|
83 | }
|
84 | ++nbWrongs;
|
85 | }
|
86 | ++r1;
|
87 | ++r2;
|
88 | }
|
89 | std::cerr<<s<<" ===> "<<nbWrongs<<"/"<<res.rows<<" errors\n";
|
90 | }
|
91 |
|
92 | void
|
93 | test1(const cv::Mat &testData,
|
94 | const CvSVM &svmClassifier,
|
95 | const cv::Mat &resMat)
|
96 | {
|
97 | assert(resMat.cols == 1);
|
98 | assert(resMat.type() == CV_32F);
|
99 |
|
100 | cv::Mat res(testData.rows, 1, CV_32F);
|
101 | assert(res.isContinuous());
|
102 | float *r = res.ptr<float>(0);
|
103 | for (int i=0; i<testData.rows; ++i) {
|
104 | *r = svmClassifier.predict(testData.row(i), true);
|
105 | ++r;
|
106 | }
|
107 |
|
108 | checkResults(res, resMat, testData, "test1");
|
109 | }
|
110 |
|
111 | void
|
112 | test2(const cv::Mat &testData,
|
113 | const CvSVM &svmClassifier,
|
114 | const cv::Mat &resMat)
|
115 | {
|
116 | assert(resMat.cols == 1);
|
117 | assert(resMat.type() == CV_32F);
|
118 |
|
119 | cv::Mat res(testData.rows, 1, CV_32F);
|
120 | svmClassifier.predict(testData, res);
|
121 |
|
122 | checkResults(res, resMat, testData, "test2");
|
123 | }
|
124 |
|
125 | int
|
126 | main(int argc, char *argv[])
|
127 | {
|
128 | std::string inputFilename, modelFilename;
|
129 | processArgs(argc, argv, inputFilename, modelFilename);
|
130 |
|
131 | cv::FileStorage fs2(inputFilename, cv::FileStorage::READ);
|
132 |
|
133 | cv::Mat dataMat, resMat, resCMat;
|
134 | fs2["data"] >> dataMat;
|
135 | fs2["results"] >> resMat;
|
136 | fs2["resultsC"] >> resCMat;
|
137 |
|
138 | if (dataMat.rows != resMat.rows) {
|
139 | std::cerr<<"ERROR: data & res do not have same number of rows ["<<dataMat.rows<<" vs "<<resMat.rows<<"] \n";
|
140 | exit(EXIT_FAILURE);
|
141 | }
|
142 | if (dataMat.rows != resCMat.rows) {
|
143 | std::cerr<<"ERROR: data & resC do not have same number of rows ["<<dataMat.rows<<" vs "<<resCMat.rows<<"] \n";
|
144 | exit(EXIT_FAILURE);
|
145 | }
|
146 | if (resMat.cols != 1) {
|
147 | std::cerr<<"ERROR: resMat.cols="<<resMat.cols<<" != 1\n";
|
148 | exit(EXIT_FAILURE);
|
149 | }
|
150 | if (resCMat.cols != 1) {
|
151 | std::cerr<<"ERROR: resCMat.cols="<<resCMat.cols<<" != 1\n";
|
152 | exit(EXIT_FAILURE);
|
153 | }
|
154 |
|
155 | CvSVM svmClassifier;
|
156 | svmClassifier.load(modelFilename.c_str());
|
157 |
|
158 |
|
159 | test1(dataMat, svmClassifier, resMat);
|
160 |
|
161 | test2(dataMat, svmClassifier, resCMat);
|
162 |
|
163 | return 0;
|
164 | }
|