Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/dnn/perf/perf_net.cpp
16345 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html.
4
//
5
// Copyright (C) 2017, Intel Corporation, all rights reserved.
6
// Third party copyrights are property of their respective owners.
7
8
#include "perf_precomp.hpp"
9
#include "opencv2/core/ocl.hpp"
10
11
#include "opencv2/dnn/shape_utils.hpp"
12
13
#include "../test/test_common.hpp"
14
15
namespace opencv_test {
16
17
class DNNTestNetwork : public ::perf::TestBaseWithParam< tuple<Backend, Target> >
18
{
19
public:
20
dnn::Backend backend;
21
dnn::Target target;
22
23
dnn::Net net;
24
25
DNNTestNetwork()
26
{
27
backend = (dnn::Backend)(int)get<0>(GetParam());
28
target = (dnn::Target)(int)get<1>(GetParam());
29
}
30
31
void processNet(std::string weights, std::string proto, std::string halide_scheduler,
32
const Mat& input, const std::string& outputLayer = "")
33
{
34
if (backend == DNN_BACKEND_OPENCV && (target == DNN_TARGET_OPENCL || target == DNN_TARGET_OPENCL_FP16))
35
{
36
#if defined(HAVE_OPENCL)
37
if (!cv::ocl::useOpenCL())
38
#endif
39
{
40
throw cvtest::SkipTestException("OpenCL is not available/disabled in OpenCV");
41
}
42
}
43
if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
44
{
45
if (!checkMyriadTarget())
46
{
47
throw SkipTestException("Myriad is not available/disabled in OpenCV");
48
}
49
}
50
51
randu(input, 0.0f, 1.0f);
52
53
weights = findDataFile(weights, false);
54
if (!proto.empty())
55
proto = findDataFile(proto, false);
56
if (backend == DNN_BACKEND_HALIDE)
57
{
58
if (halide_scheduler == "disabled")
59
throw cvtest::SkipTestException("Halide test is disabled");
60
if (!halide_scheduler.empty())
61
halide_scheduler = findDataFile(std::string("dnn/halide_scheduler_") + (target == DNN_TARGET_OPENCL ? "opencl_" : "") + halide_scheduler, true);
62
}
63
net = readNet(proto, weights);
64
net.setInput(blobFromImage(input, 1.0, Size(), Scalar(), false));
65
net.setPreferableBackend(backend);
66
net.setPreferableTarget(target);
67
if (backend == DNN_BACKEND_HALIDE)
68
{
69
net.setHalideScheduler(halide_scheduler);
70
}
71
72
MatShape netInputShape = shape(1, 3, input.rows, input.cols);
73
size_t weightsMemory = 0, blobsMemory = 0;
74
net.getMemoryConsumption(netInputShape, weightsMemory, blobsMemory);
75
int64 flops = net.getFLOPS(netInputShape);
76
CV_Assert(flops > 0);
77
78
net.forward(outputLayer); // warmup
79
80
std::cout << "Memory consumption:" << std::endl;
81
std::cout << " Weights(parameters): " << divUp(weightsMemory, 1u<<20) << " Mb" << std::endl;
82
std::cout << " Blobs: " << divUp(blobsMemory, 1u<<20) << " Mb" << std::endl;
83
std::cout << "Calculation complexity: " << flops * 1e-9 << " GFlops" << std::endl;
84
85
PERF_SAMPLE_BEGIN()
86
net.forward();
87
PERF_SAMPLE_END()
88
89
SANITY_CHECK_NOTHING();
90
}
91
};
92
93
94
PERF_TEST_P_(DNNTestNetwork, AlexNet)
95
{
96
processNet("dnn/bvlc_alexnet.caffemodel", "dnn/bvlc_alexnet.prototxt",
97
"alexnet.yml", Mat(cv::Size(227, 227), CV_32FC3));
98
}
99
100
PERF_TEST_P_(DNNTestNetwork, GoogLeNet)
101
{
102
processNet("dnn/bvlc_googlenet.caffemodel", "dnn/bvlc_googlenet.prototxt",
103
"", Mat(cv::Size(224, 224), CV_32FC3));
104
}
105
106
PERF_TEST_P_(DNNTestNetwork, ResNet_50)
107
{
108
processNet("dnn/ResNet-50-model.caffemodel", "dnn/ResNet-50-deploy.prototxt",
109
"resnet_50.yml", Mat(cv::Size(224, 224), CV_32FC3));
110
}
111
112
PERF_TEST_P_(DNNTestNetwork, SqueezeNet_v1_1)
113
{
114
processNet("dnn/squeezenet_v1.1.caffemodel", "dnn/squeezenet_v1.1.prototxt",
115
"squeezenet_v1_1.yml", Mat(cv::Size(227, 227), CV_32FC3));
116
}
117
118
PERF_TEST_P_(DNNTestNetwork, Inception_5h)
119
{
120
if (backend == DNN_BACKEND_INFERENCE_ENGINE) throw SkipTestException("");
121
processNet("dnn/tensorflow_inception_graph.pb", "",
122
"inception_5h.yml",
123
Mat(cv::Size(224, 224), CV_32FC3), "softmax2");
124
}
125
126
PERF_TEST_P_(DNNTestNetwork, ENet)
127
{
128
if ((backend == DNN_BACKEND_INFERENCE_ENGINE) ||
129
(backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16))
130
throw SkipTestException("");
131
processNet("dnn/Enet-model-best.net", "", "enet.yml",
132
Mat(cv::Size(512, 256), CV_32FC3));
133
}
134
135
PERF_TEST_P_(DNNTestNetwork, SSD)
136
{
137
processNet("dnn/VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel", "dnn/ssd_vgg16.prototxt", "disabled",
138
Mat(cv::Size(300, 300), CV_32FC3));
139
}
140
141
PERF_TEST_P_(DNNTestNetwork, OpenFace)
142
{
143
if (backend == DNN_BACKEND_HALIDE ||
144
(backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_OPENCL_FP16) ||
145
(backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD))
146
throw SkipTestException("");
147
processNet("dnn/openface_nn4.small2.v1.t7", "", "",
148
Mat(cv::Size(96, 96), CV_32FC3));
149
}
150
151
PERF_TEST_P_(DNNTestNetwork, MobileNet_SSD_Caffe)
152
{
153
if (backend == DNN_BACKEND_HALIDE)
154
throw SkipTestException("");
155
processNet("dnn/MobileNetSSD_deploy.caffemodel", "dnn/MobileNetSSD_deploy.prototxt", "",
156
Mat(cv::Size(300, 300), CV_32FC3));
157
}
158
159
PERF_TEST_P_(DNNTestNetwork, MobileNet_SSD_v1_TensorFlow)
160
{
161
if (backend == DNN_BACKEND_HALIDE)
162
throw SkipTestException("");
163
processNet("dnn/ssd_mobilenet_v1_coco_2017_11_17.pb", "ssd_mobilenet_v1_coco_2017_11_17.pbtxt", "",
164
Mat(cv::Size(300, 300), CV_32FC3));
165
}
166
167
PERF_TEST_P_(DNNTestNetwork, MobileNet_SSD_v2_TensorFlow)
168
{
169
if (backend == DNN_BACKEND_HALIDE)
170
throw SkipTestException("");
171
processNet("dnn/ssd_mobilenet_v2_coco_2018_03_29.pb", "ssd_mobilenet_v2_coco_2018_03_29.pbtxt", "",
172
Mat(cv::Size(300, 300), CV_32FC3));
173
}
174
175
PERF_TEST_P_(DNNTestNetwork, DenseNet_121)
176
{
177
if (backend == DNN_BACKEND_HALIDE ||
178
backend == DNN_BACKEND_INFERENCE_ENGINE && (target == DNN_TARGET_OPENCL_FP16 ||
179
target == DNN_TARGET_MYRIAD))
180
throw SkipTestException("");
181
processNet("dnn/DenseNet_121.caffemodel", "dnn/DenseNet_121.prototxt", "",
182
Mat(cv::Size(224, 224), CV_32FC3));
183
}
184
185
PERF_TEST_P_(DNNTestNetwork, OpenPose_pose_coco)
186
{
187
if (backend == DNN_BACKEND_HALIDE ||
188
backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
189
throw SkipTestException("");
190
processNet("dnn/openpose_pose_coco.caffemodel", "dnn/openpose_pose_coco.prototxt", "",
191
Mat(cv::Size(368, 368), CV_32FC3));
192
}
193
194
PERF_TEST_P_(DNNTestNetwork, OpenPose_pose_mpi)
195
{
196
if (backend == DNN_BACKEND_HALIDE ||
197
backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
198
throw SkipTestException("");
199
processNet("dnn/openpose_pose_mpi.caffemodel", "dnn/openpose_pose_mpi.prototxt", "",
200
Mat(cv::Size(368, 368), CV_32FC3));
201
}
202
203
PERF_TEST_P_(DNNTestNetwork, OpenPose_pose_mpi_faster_4_stages)
204
{
205
if (backend == DNN_BACKEND_HALIDE ||
206
backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
207
throw SkipTestException("");
208
// The same .caffemodel but modified .prototxt
209
// See https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/src/openpose/pose/poseParameters.cpp
210
processNet("dnn/openpose_pose_mpi.caffemodel", "dnn/openpose_pose_mpi_faster_4_stages.prototxt", "",
211
Mat(cv::Size(368, 368), CV_32FC3));
212
}
213
214
PERF_TEST_P_(DNNTestNetwork, opencv_face_detector)
215
{
216
if (backend == DNN_BACKEND_HALIDE)
217
throw SkipTestException("");
218
processNet("dnn/opencv_face_detector.caffemodel", "dnn/opencv_face_detector.prototxt", "",
219
Mat(cv::Size(300, 300), CV_32FC3));
220
}
221
222
PERF_TEST_P_(DNNTestNetwork, Inception_v2_SSD_TensorFlow)
223
{
224
if (backend == DNN_BACKEND_HALIDE)
225
throw SkipTestException("");
226
processNet("dnn/ssd_inception_v2_coco_2017_11_17.pb", "ssd_inception_v2_coco_2017_11_17.pbtxt", "",
227
Mat(cv::Size(300, 300), CV_32FC3));
228
}
229
230
PERF_TEST_P_(DNNTestNetwork, YOLOv3)
231
{
232
if (backend == DNN_BACKEND_HALIDE ||
233
backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
234
throw SkipTestException("");
235
Mat sample = imread(findDataFile("dnn/dog416.png", false));
236
Mat inp;
237
sample.convertTo(inp, CV_32FC3);
238
processNet("dnn/yolov3.cfg", "dnn/yolov3.weights", "", inp / 255);
239
}
240
241
PERF_TEST_P_(DNNTestNetwork, EAST_text_detection)
242
{
243
if (backend == DNN_BACKEND_HALIDE ||
244
backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
245
throw SkipTestException("");
246
processNet("dnn/frozen_east_text_detection.pb", "", "", Mat(cv::Size(320, 320), CV_32FC3));
247
}
248
249
PERF_TEST_P_(DNNTestNetwork, FastNeuralStyle_eccv16)
250
{
251
if (backend == DNN_BACKEND_HALIDE ||
252
(backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) ||
253
(backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD))
254
throw SkipTestException("");
255
processNet("dnn/fast_neural_style_eccv16_starry_night.t7", "", "", Mat(cv::Size(320, 240), CV_32FC3));
256
}
257
258
PERF_TEST_P_(DNNTestNetwork, Inception_v2_Faster_RCNN)
259
{
260
if (backend == DNN_BACKEND_HALIDE ||
261
(backend == DNN_BACKEND_INFERENCE_ENGINE && target != DNN_TARGET_CPU) ||
262
(backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16))
263
throw SkipTestException("");
264
processNet("dnn/faster_rcnn_inception_v2_coco_2018_01_28.pb",
265
"dnn/faster_rcnn_inception_v2_coco_2018_01_28.pbtxt", "",
266
Mat(cv::Size(800, 600), CV_32FC3));
267
}
268
269
INSTANTIATE_TEST_CASE_P(/*nothing*/, DNNTestNetwork, dnnBackendsAndTargets());
270
271
} // namespace
272
273