a5a12f730465921e87ab7f0f3cc35a6ec130e66a
[platform/upstream/opencv.git] / modules / softcascade / perf / perf_cuda_softcascade.cpp
1 #include "perf_precomp.hpp"
2
3 using std::tr1::get;
4
5 #define SC_PERF_TEST_P(fixture, name, params)  \
6     class fixture##_##name : public fixture {\
7      public:\
8       fixture##_##name() {}\
9      protected:\
10         virtual void __cpu();\
11         virtual void __gpu();\
12       virtual void PerfTestBody();\
13     };\
14     TEST_P(fixture##_##name, name /*perf*/){ RunPerfTestBody(); }\
15     INSTANTIATE_TEST_CASE_P(/*none*/, fixture##_##name, params);\
16     void fixture##_##name::PerfTestBody() { if (PERF_RUN_CUDA()) __gpu(); else __cpu(); }
17
18 #define RUN_CPU(fixture, name)\
19     void fixture##_##name::__cpu()
20
21 #define RUN_CUDA(fixture, name)\
22     void fixture##_##name::__gpu()
23
24 #define NO_CPU(fixture, name)\
25 void fixture##_##name::__cpu() { FAIL() << "No such CPU implementation analogy";}
26
27 namespace {
28     struct DetectionLess
29     {
30         bool operator()(const cv::softcascade::Detection& a,
31             const cv::softcascade::Detection& b) const
32         {
33             if (a.x != b.x)      return a.x < b.x;
34             else if (a.y != b.y) return a.y < b.y;
35             else if (a.w != b.w) return a.w < b.w;
36             else return a.h < b.h;
37         }
38     };
39
40     cv::Mat sortDetections(cv::cuda::GpuMat& objects)
41     {
42         cv::Mat detections(objects);
43
44         typedef cv::softcascade::Detection Detection;
45         Detection* begin = (Detection*)(detections.ptr<char>(0));
46         Detection* end = (Detection*)(detections.ptr<char>(0) + detections.cols);
47         std::sort(begin, end, DetectionLess());
48
49         return detections;
50     }
51 }
52
53
54 typedef std::tr1::tuple<std::string, std::string> fixture_t;
55 typedef perf::TestBaseWithParam<fixture_t> SCascadeTest;
56
57 SC_PERF_TEST_P(SCascadeTest, detect,
58     testing::Combine(
59         testing::Values(std::string("cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"),
60                         std::string("cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml")),
61         testing::Values(std::string("cv/cascadeandhog/images/image_00000000_0.png"))))
62
63 RUN_CUDA(SCascadeTest, detect)
64 {
65     cv::Mat cpu = cv::imread(getDataPath(get<1>(GetParam())));;
66     ASSERT_FALSE(cpu.empty());
67     cv::cuda::GpuMat colored(cpu);
68
69     cv::softcascade::SCascade cascade;
70
71     cv::FileStorage fs(getDataPath(get<0>(GetParam())), cv::FileStorage::READ);
72     ASSERT_TRUE(fs.isOpened());
73
74     ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode()));
75
76     cv::cuda::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1);
77     rois.setTo(1);
78
79     cascade.detect(colored, rois, objectBoxes);
80
81     TEST_CYCLE()
82     {
83         cascade.detect(colored, rois, objectBoxes);
84     }
85
86     SANITY_CHECK(sortDetections(objectBoxes));
87 }
88
89 NO_CPU(SCascadeTest, detect)
90
91 static cv::Rect getFromTable(int idx)
92 {
93     static const cv::Rect rois[] =
94     {
95         cv::Rect( 65 * 4,  20 * 4,  35 * 4, 80 * 4),
96         cv::Rect( 95 * 4,  35 * 4,  45 * 4, 40 * 4),
97         cv::Rect( 45 * 4,  35 * 4,  45 * 4, 40 * 4),
98         cv::Rect( 25 * 4,  27 * 4,  50 * 4, 45 * 4),
99         cv::Rect(100 * 4,  50 * 4,  45 * 4, 40 * 4),
100
101         cv::Rect( 60 * 4,  30 * 4,  45 * 4, 40 * 4),
102         cv::Rect( 40 * 4,  55 * 4,  50 * 4, 40 * 4),
103         cv::Rect( 48 * 4,  37 * 4,  72 * 4, 80 * 4),
104         cv::Rect( 48 * 4,  32 * 4,  85 * 4, 58 * 4),
105         cv::Rect( 48 * 4,   0 * 4,  32 * 4, 27 * 4)
106     };
107
108     return rois[idx];
109 }
110
111 typedef std::tr1::tuple<std::string, std::string, int> roi_fixture_t;
112 typedef perf::TestBaseWithParam<roi_fixture_t> SCascadeTestRoi;
113
114 SC_PERF_TEST_P(SCascadeTestRoi, detectInRoi,
115     testing::Combine(
116         testing::Values(std::string("cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"),
117                         std::string("cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml")),
118         testing::Values(std::string("cv/cascadeandhog/images/image_00000000_0.png")),
119         testing::Range(0, 5)))
120
121 RUN_CUDA(SCascadeTestRoi, detectInRoi)
122 {
123     cv::Mat cpu = cv::imread(getDataPath(get<1>(GetParam())));
124     ASSERT_FALSE(cpu.empty());
125     cv::cuda::GpuMat colored(cpu);
126
127     cv::softcascade::SCascade cascade;
128
129     cv::FileStorage fs(getDataPath(get<0>(GetParam())), cv::FileStorage::READ);
130     ASSERT_TRUE(fs.isOpened());
131
132     ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode()));
133
134     cv::cuda::GpuMat objectBoxes(1, 16384 * 20, CV_8UC1), rois(colored.size(), CV_8UC1);
135     rois.setTo(0);
136
137     int nroi = get<2>(GetParam());
138     cv::RNG rng;
139     for (int i = 0; i < nroi; ++i)
140     {
141         cv::Rect r = getFromTable(rng(10));
142         cv::cuda::GpuMat sub(rois, r);
143         sub.setTo(1);
144     }
145
146     cascade.detect(colored, rois, objectBoxes);
147
148     TEST_CYCLE()
149     {
150         cascade.detect(colored, rois, objectBoxes);
151     }
152
153     SANITY_CHECK(sortDetections(objectBoxes));
154 }
155
156 NO_CPU(SCascadeTestRoi, detectInRoi)
157
158
159 SC_PERF_TEST_P(SCascadeTestRoi, detectEachRoi,
160     testing::Combine(
161         testing::Values(std::string("cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"),
162                         std::string("cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml")),
163         testing::Values(std::string("cv/cascadeandhog/images/image_00000000_0.png")),
164         testing::Range(0, 10)))
165
166 RUN_CUDA(SCascadeTestRoi, detectEachRoi)
167 {
168     cv::Mat cpu = cv::imread(getDataPath(get<1>(GetParam())));
169     ASSERT_FALSE(cpu.empty());
170     cv::cuda::GpuMat colored(cpu);
171
172     cv::softcascade::SCascade cascade;
173
174     cv::FileStorage fs(getDataPath(get<0>(GetParam())), cv::FileStorage::READ);
175     ASSERT_TRUE(fs.isOpened());
176
177     ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode()));
178
179     cv::cuda::GpuMat objectBoxes(1, 16384 * 20, CV_8UC1), rois(colored.size(), CV_8UC1);
180     rois.setTo(0);
181
182     int idx = get<2>(GetParam());
183     cv::Rect r = getFromTable(idx);
184     cv::cuda::GpuMat sub(rois, r);
185     sub.setTo(1);
186
187     cascade.detect(colored, rois, objectBoxes);
188
189     TEST_CYCLE()
190     {
191         cascade.detect(colored, rois, objectBoxes);
192     }
193
194     SANITY_CHECK(sortDetections(objectBoxes));
195 }
196
197 NO_CPU(SCascadeTestRoi, detectEachRoi)
198
199 SC_PERF_TEST_P(SCascadeTest, detectStream,
200     testing::Combine(
201         testing::Values(std::string("cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"),
202                         std::string("cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml")),
203         testing::Values(std::string("cv/cascadeandhog/images/image_00000000_0.png"))))
204
205 RUN_CUDA(SCascadeTest, detectStream)
206 {
207     cv::Mat cpu = cv::imread(getDataPath(get<1>(GetParam())));
208     ASSERT_FALSE(cpu.empty());
209     cv::cuda::GpuMat colored(cpu);
210
211     cv::softcascade::SCascade cascade;
212
213     cv::FileStorage fs(getDataPath(get<0>(GetParam())), cv::FileStorage::READ);
214     ASSERT_TRUE(fs.isOpened());
215
216     ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode()));
217
218     cv::cuda::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1);
219     rois.setTo(1);
220
221     cv::cuda::Stream s;
222
223     cascade.detect(colored, rois, objectBoxes, s);
224
225     TEST_CYCLE()
226     {
227         cascade.detect(colored, rois, objectBoxes, s);
228     }
229
230     s.waitForCompletion();
231     SANITY_CHECK(sortDetections(objectBoxes));
232 }
233
234 NO_CPU(SCascadeTest, detectStream)
235
236 #undef SC_PERF_TEST_P