From 6eb8faea85d8469e38ffcead4f0494bdeca60abf Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Fri, 13 Jul 2018 19:47:50 +0300 Subject: [PATCH] Enable TensorFlow networks tests for different backends and targets --- .../dnn/src/layers/detection_output_layer.cpp | 6 +- modules/dnn/src/layers/softmax_layer.cpp | 13 ++-- modules/dnn/test/test_tf_importer.cpp | 61 +++++++++++++------ 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/modules/dnn/src/layers/detection_output_layer.cpp b/modules/dnn/src/layers/detection_output_layer.cpp index c6e011b5dd..f4d4d2b822 100644 --- a/modules/dnn/src/layers/detection_output_layer.cpp +++ b/modules/dnn/src/layers/detection_output_layer.cpp @@ -295,7 +295,9 @@ public: for (int i = 0; i < num; i++) confPreds.push_back(Mat(2, shape, CV_32F)); - UMat umat = inp1.reshape(1, num * numPredsPerClass); + shape[0] = num * numPredsPerClass; + shape[1] = inp1.total() / shape[0]; + UMat umat = inp1.reshape(1, 2, &shape[0]); for (int i = 0; i < num; ++i) { Range ranges[] = { Range(i * numPredsPerClass, (i + 1) * numPredsPerClass), Range::all() }; @@ -342,7 +344,7 @@ public: // Decode all loc predictions to bboxes bool ret = ocl_DecodeBBoxesAll(inputs[0], inputs[2], num, numPriors, _shareLocation, _numLocClasses, _backgroundLabelId, - _codeType, _varianceEncodedInTarget, false, + _codeType, _varianceEncodedInTarget, _clip, allDecodedBBoxes); if (!ret) return false; diff --git a/modules/dnn/src/layers/softmax_layer.cpp b/modules/dnn/src/layers/softmax_layer.cpp index 135874812b..5f50289847 100644 --- a/modules/dnn/src/layers/softmax_layer.cpp +++ b/modules/dnn/src/layers/softmax_layer.cpp @@ -110,27 +110,26 @@ public: outputs_.getUMatVector(outputs); internals_.getUMatVector(internals); + UMat& src = inputs[0]; + UMat& dstMat = outputs[0]; + int axis = clamp(axisRaw, src.dims); + if (softmaxOp.empty()) { OCL4DNNSoftmaxConfig config; - config.in_shape = shape(inputs[0]); - config.axis = axisRaw; - config.channels = inputs[0].size[axisRaw]; + config.axis = axis; + config.channels = inputs[0].size[axis]; config.logsoftmax = logSoftMax; config.use_half = use_half; softmaxOp = Ptr >(new OCL4DNNSoftmax(config)); } - UMat& src = inputs[0]; - UMat& dstMat = outputs[0]; - if (softmaxOp->Forward(src, dstMat)) return true; UMat& bufMat = internals[0]; - int axis = clamp(axisRaw, src.dims); MatShape s = shape(src); size_t outerSize = total(s, 0, axis); size_t channels = src.size[axis]; diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index 66b9d4f642..6ab0e41e18 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -243,10 +243,15 @@ TEST_P(Test_TensorFlow_layers, l2_normalize_3d) runTensorFlowNet("l2_normalize_3d"); } -typedef testing::TestWithParam Test_TensorFlow_nets; +class Test_TensorFlow_nets : public DNNTestLayer {}; TEST_P(Test_TensorFlow_nets, MobileNet_SSD) { + checkBackend(); + if ((backend == DNN_BACKEND_INFERENCE_ENGINE && target != DNN_TARGET_CPU) || + (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16)) + throw SkipTestException(""); + std::string netPath = findDataFile("dnn/ssd_mobilenet_v1_coco.pb", false); std::string netConfig = findDataFile("dnn/ssd_mobilenet_v1_coco.pbtxt", false); std::string imgPath = findDataFile("dnn/street.png", false); @@ -260,29 +265,30 @@ TEST_P(Test_TensorFlow_nets, MobileNet_SSD) outNames[1] = "concat_1"; outNames[2] = "detection_out"; - std::vector target(outNames.size()); + std::vector refs(outNames.size()); for (int i = 0; i < outNames.size(); ++i) { std::string path = findDataFile("dnn/tensorflow/ssd_mobilenet_v1_coco." + outNames[i] + ".npy", false); - target[i] = blobFromNPY(path); + refs[i] = blobFromNPY(path); } Net net = readNetFromTensorflow(netPath, netConfig); - net.setPreferableBackend(DNN_BACKEND_OPENCV); - net.setPreferableTarget(GetParam()); + net.setPreferableBackend(backend); + net.setPreferableTarget(target); net.setInput(inp); std::vector output; net.forward(output, outNames); - normAssert(target[0].reshape(1, 1), output[0].reshape(1, 1), "", 1e-5, 1.5e-4); - normAssert(target[1].reshape(1, 1), output[1].reshape(1, 1), "", 1e-5, 3e-4); - normAssertDetections(target[2], output[2], "", 0.2); + normAssert(refs[0].reshape(1, 1), output[0].reshape(1, 1), "", 1e-5, 1.5e-4); + normAssert(refs[1].reshape(1, 1), output[1].reshape(1, 1), "", 1e-5, 3e-4); + normAssertDetections(refs[2], output[2], "", 0.2); } TEST_P(Test_TensorFlow_nets, Inception_v2_SSD) { + checkBackend(); std::string proto = findDataFile("dnn/ssd_inception_v2_coco_2017_11_17.pbtxt", false); std::string model = findDataFile("dnn/ssd_inception_v2_coco_2017_11_17.pb", false); @@ -290,8 +296,8 @@ TEST_P(Test_TensorFlow_nets, Inception_v2_SSD) Mat img = imread(findDataFile("dnn/street.png", false)); Mat blob = blobFromImage(img, 1.0f / 127.5, Size(300, 300), Scalar(127.5, 127.5, 127.5), true, false); - net.setPreferableBackend(DNN_BACKEND_OPENCV); - net.setPreferableTarget(GetParam()); + net.setPreferableBackend(backend); + net.setPreferableTarget(target); net.setInput(blob); // Output has shape 1x1xNx7 where N - number of detections. @@ -302,16 +308,24 @@ TEST_P(Test_TensorFlow_nets, Inception_v2_SSD) 0, 3, 0.75838411, 0.44668293, 0.45907149, 0.49459291, 0.52197015, 0, 10, 0.95932811, 0.38349164, 0.32528657, 0.40387636, 0.39165527, 0, 10, 0.93973452, 0.66561931, 0.37841269, 0.68074018, 0.42907384); - normAssertDetections(ref, out, "", 0.5); + double scoreDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 5e-3 : default_l1; + double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.025 : default_lInf; + normAssertDetections(ref, out, "", 0.5, scoreDiff, iouDiff); } TEST_P(Test_TensorFlow_nets, Inception_v2_Faster_RCNN) { + checkBackend(); + if (backend == DNN_BACKEND_INFERENCE_ENGINE || + (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16)) + throw SkipTestException(""); + std::string proto = findDataFile("dnn/faster_rcnn_inception_v2_coco_2018_01_28.pbtxt", false); std::string model = findDataFile("dnn/faster_rcnn_inception_v2_coco_2018_01_28.pb", false); Net net = readNetFromTensorflow(model, proto); - net.setPreferableBackend(DNN_BACKEND_OPENCV); + net.setPreferableBackend(backend); + net.setPreferableTarget(target); Mat img = imread(findDataFile("dnn/dog416.png", false)); Mat blob = blobFromImage(img, 1.0f / 127.5, Size(800, 600), Scalar(127.5, 127.5, 127.5), true, false); @@ -324,6 +338,11 @@ TEST_P(Test_TensorFlow_nets, Inception_v2_Faster_RCNN) TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) { + checkBackend(); + if (backend == DNN_BACKEND_INFERENCE_ENGINE && + (target == DNN_TARGET_OPENCL || target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD)) + throw SkipTestException(""); + std::string proto = findDataFile("dnn/opencv_face_detector.pbtxt", false); std::string model = findDataFile("dnn/opencv_face_detector_uint8.pb", false); @@ -331,9 +350,8 @@ TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) Mat img = imread(findDataFile("gpu/lbpcascade/er.png", false)); Mat blob = blobFromImage(img, 1.0, Size(), Scalar(104.0, 177.0, 123.0), false, false); - net.setPreferableBackend(DNN_BACKEND_OPENCV); - net.setPreferableTarget(GetParam()); - + net.setPreferableBackend(backend); + net.setPreferableTarget(target); net.setInput(blob); // Output has shape 1x1xNx7 where N - number of detections. // An every detection is a vector of values [id, classId, confidence, left, top, right, bottom] @@ -346,7 +364,9 @@ TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) 0, 1, 0.98977017, 0.23901358, 0.09084064, 0.29902688, 0.1769477, 0, 1, 0.97203469, 0.67965847, 0.06876482, 0.73999709, 0.1513494, 0, 1, 0.95097077, 0.51901293, 0.45863652, 0.5777427, 0.5347801); - normAssertDetections(ref, out, "", 0.9, 3.4e-3, 1e-2); + double scoreDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 4e-3 : 3.4e-3; + double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.017 : 1e-2; + normAssertDetections(ref, out, "", 0.9, scoreDiff, iouDiff); } // inp = cv.imread('opencv_extra/testdata/cv/ximgproc/sources/08.png') @@ -360,6 +380,10 @@ TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) // np.save('east_text_detection.geometry.npy', geometry) TEST_P(Test_TensorFlow_nets, EAST_text_detection) { + checkBackend(); + if (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) + throw SkipTestException(""); + std::string netPath = findDataFile("dnn/frozen_east_text_detection.pb", false); std::string imgPath = findDataFile("cv/ximgproc/sources/08.png", false); std::string refScoresPath = findDataFile("dnn/east_text_detection.scores.npy", false); @@ -367,7 +391,8 @@ TEST_P(Test_TensorFlow_nets, EAST_text_detection) Net net = readNet(findDataFile("dnn/frozen_east_text_detection.pb", false)); - net.setPreferableTarget(GetParam()); + net.setPreferableBackend(backend); + net.setPreferableTarget(target); Mat img = imread(imgPath); Mat inp = blobFromImage(img, 1.0, Size(), Scalar(123.68, 116.78, 103.94), true, false); @@ -386,7 +411,7 @@ TEST_P(Test_TensorFlow_nets, EAST_text_detection) normAssert(geometry, blobFromNPY(refGeometryPath), "geometry", 1e-4, 3e-3); } -INSTANTIATE_TEST_CASE_P(/**/, Test_TensorFlow_nets, availableDnnTargets()); +INSTANTIATE_TEST_CASE_P(/**/, Test_TensorFlow_nets, dnnBackendsAndTargets()); TEST_P(Test_TensorFlow_layers, fp16_weights) {