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.
5 #ifndef __OPENCV_TEST_COMMON_HPP__
6 #define __OPENCV_TEST_COMMON_HPP__
8 #include "opencv2/dnn/utils/inference_engine.hpp"
11 #include "opencv2/core/ocl.hpp"
14 #define CV_TEST_TAG_DNN_SKIP_HALIDE "dnn_skip_halide"
15 #define CV_TEST_TAG_DNN_SKIP_OPENCL "dnn_skip_ocl"
16 #define CV_TEST_TAG_DNN_SKIP_OPENCL_FP16 "dnn_skip_ocl_fp16"
17 #define CV_TEST_TAG_DNN_SKIP_IE "dnn_skip_ie"
18 #define CV_TEST_TAG_DNN_SKIP_IE_2018R5 "dnn_skip_ie_2018r5"
19 #define CV_TEST_TAG_DNN_SKIP_IE_2019R1 "dnn_skip_ie_2019r1"
20 #define CV_TEST_TAG_DNN_SKIP_IE_2019R1_1 "dnn_skip_ie_2019r1_1"
21 #define CV_TEST_TAG_DNN_SKIP_IE_2019R2 "dnn_skip_ie_2019r2"
22 #define CV_TEST_TAG_DNN_SKIP_IE_OPENCL "dnn_skip_ie_ocl"
23 #define CV_TEST_TAG_DNN_SKIP_IE_OPENCL_FP16 "dnn_skip_ie_ocl_fp16"
24 #define CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_2 "dnn_skip_ie_myriad2"
25 #define CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_X "dnn_skip_ie_myriadx"
26 #define CV_TEST_TAG_DNN_SKIP_IE_MYRIAD CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_2, CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_X
28 #define CV_TEST_TAG_DNN_SKIP_VULKAN "dnn_skip_vulkan"
31 namespace cv { namespace dnn {
32 CV__DNN_INLINE_NS_BEGIN
34 void PrintTo(const cv::dnn::Backend& v, std::ostream* os);
35 void PrintTo(const cv::dnn::Target& v, std::ostream* os);
36 using opencv_test::tuple;
37 using opencv_test::get;
38 void PrintTo(const tuple<cv::dnn::Backend, cv::dnn::Target> v, std::ostream* os);
41 }} // namespace cv::dnn
45 namespace opencv_test {
49 using namespace cv::dnn;
51 static inline const std::string &getOpenCVExtraDir()
53 return cvtest::TS::ptr()->get_data_path();
57 cv::InputArray ref, cv::InputArray test, const char *comment = "",
58 double l1 = 0.00001, double lInf = 0.0001);
60 std::vector<cv::Rect2d> matToBoxes(const cv::Mat& m);
62 void normAssertDetections(
63 const std::vector<int>& refClassIds,
64 const std::vector<float>& refScores,
65 const std::vector<cv::Rect2d>& refBoxes,
66 const std::vector<int>& testClassIds,
67 const std::vector<float>& testScores,
68 const std::vector<cv::Rect2d>& testBoxes,
69 const char *comment = "", double confThreshold = 0.0,
70 double scores_diff = 1e-5, double boxes_iou_diff = 1e-4);
72 // For SSD-based object detection networks which produce output of shape 1x1xNx7
73 // where N is a number of detections and an every detection is represented by
74 // a vector [batchId, classId, confidence, left, top, right, bottom].
75 void normAssertDetections(
76 cv::Mat ref, cv::Mat out, const char *comment = "",
77 double confThreshold = 0.0, double scores_diff = 1e-5,
78 double boxes_iou_diff = 1e-4);
80 void readFileContent(const std::string& filename, CV_OUT std::vector<char>& content);
82 #ifdef HAVE_INF_ENGINE
83 bool validateVPUType();
86 testing::internal::ParamGenerator< tuple<Backend, Target> > dnnBackendsAndTargets(
87 bool withInferenceEngine = true,
88 bool withHalide = false,
89 bool withCpuOCV = true,
94 class DNNTestLayer : public TestWithParam<tuple<Backend, Target> >
99 double default_l1, default_lInf;
103 backend = (dnn::Backend)(int)get<0>(GetParam());
104 target = (dnn::Target)(int)get<1>(GetParam());
105 getDefaultThresholds(backend, target, &default_l1, &default_lInf);
108 static void getDefaultThresholds(int backend, int target, double* l1, double* lInf)
110 if (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD)
122 static void checkBackend(int backend, int target, Mat* inp = 0, Mat* ref = 0)
124 if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
126 if (inp && ref && inp->dims == 4 && ref->dims == 4 &&
127 inp->size[0] != 1 && inp->size[0] != ref->size[0])
129 applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD);
130 throw SkipTestException("Inconsistent batch size of input and output blobs for Myriad plugin");
135 void expectNoFallbacks(Net& net)
137 // Check if all the layers are supported with current backend and target.
138 // Some layers might be fused so their timings equal to zero.
139 std::vector<double> timings;
140 net.getPerfProfile(timings);
141 std::vector<String> names = net.getLayerNames();
142 CV_Assert(names.size() == timings.size());
144 for (int i = 0; i < names.size(); ++i)
146 Ptr<dnn::Layer> l = net.getLayer(net.getLayerId(names[i]));
147 bool fused = !timings[i];
148 if ((!l->supportBackend(backend) || l->preferableTarget != target) && !fused)
149 CV_Error(Error::StsNotImplemented, "Layer [" + l->name + "] of type [" +
150 l->type + "] is expected to has backend implementation");
154 void expectNoFallbacksFromIE(Net& net)
156 if (backend == DNN_BACKEND_INFERENCE_ENGINE)
157 expectNoFallbacks(net);
161 void checkBackend(Mat* inp = 0, Mat* ref = 0)
163 checkBackend(backend, target, inp, ref);
170 // src/op_inf_engine.hpp
171 #define INF_ENGINE_VER_MAJOR_GT(ver) (((INF_ENGINE_RELEASE) / 10000) > ((ver) / 10000))
172 #define INF_ENGINE_VER_MAJOR_GE(ver) (((INF_ENGINE_RELEASE) / 10000) >= ((ver) / 10000))
173 #define INF_ENGINE_VER_MAJOR_LT(ver) (((INF_ENGINE_RELEASE) / 10000) < ((ver) / 10000))
174 #define INF_ENGINE_VER_MAJOR_LE(ver) (((INF_ENGINE_RELEASE) / 10000) <= ((ver) / 10000))
175 #define INF_ENGINE_VER_MAJOR_EQ(ver) (((INF_ENGINE_RELEASE) / 10000) == ((ver) / 10000))