Path: blob/master/modules/dnn/test/test_onnx_importer.cpp
16354 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.34// Copyright (C) 2018, Intel Corporation, all rights reserved.5// Third party copyrights are property of their respective owners.678#include "test_precomp.hpp"9#include "npy_blob.hpp"10#include <opencv2/dnn/shape_utils.hpp>1112namespace opencv_test { namespace {1314template<typename TString>15static std::string _tf(TString filename)16{17String rootFolder = "dnn/onnx/";18return findDataFile(rootFolder + filename, false);19}2021class Test_ONNX_layers : public DNNTestLayer22{23public:24enum Extension25{26npy,27pb28};2930void testONNXModels(const String& basename, const Extension ext = npy, const double l1 = 0, const float lInf = 0)31{32String onnxmodel = _tf("models/" + basename + ".onnx");33Mat inp, ref;34if (ext == npy) {35inp = blobFromNPY(_tf("data/input_" + basename + ".npy"));36ref = blobFromNPY(_tf("data/output_" + basename + ".npy"));37}38else if (ext == pb) {39inp = readTensorFromONNX(_tf("data/input_" + basename + ".pb"));40ref = readTensorFromONNX(_tf("data/output_" + basename + ".pb"));41}42else43CV_Error(Error::StsUnsupportedFormat, "Unsupported extension");4445checkBackend(&inp, &ref);46Net net = readNetFromONNX(onnxmodel);47ASSERT_FALSE(net.empty());4849net.setPreferableBackend(backend);50net.setPreferableTarget(target);5152net.setInput(inp);53Mat out = net.forward();54normAssert(ref, out, "", l1 ? l1 : default_l1, lInf ? lInf : default_lInf);55}56};5758TEST_P(Test_ONNX_layers, MaxPooling)59{60testONNXModels("maxpooling");61testONNXModels("two_maxpooling");62}6364TEST_P(Test_ONNX_layers, Convolution)65{66testONNXModels("convolution");67testONNXModels("two_convolution");68}6970TEST_P(Test_ONNX_layers, Dropout)71{72testONNXModels("dropout");73}7475TEST_P(Test_ONNX_layers, Linear)76{77if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16)78throw SkipTestException("");79testONNXModels("linear");80}8182TEST_P(Test_ONNX_layers, ReLU)83{84testONNXModels("ReLU");85}8687TEST_P(Test_ONNX_layers, MaxPooling_Sigmoid)88{89testONNXModels("maxpooling_sigmoid");90}9192TEST_P(Test_ONNX_layers, Concatenation)93{94if (backend == DNN_BACKEND_INFERENCE_ENGINE &&95(target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_OPENCL || target == DNN_TARGET_MYRIAD))96throw SkipTestException("");97testONNXModels("concatenation");98}99100TEST_P(Test_ONNX_layers, AveragePooling)101{102testONNXModels("average_pooling");103}104105TEST_P(Test_ONNX_layers, BatchNormalization)106{107testONNXModels("batch_norm");108}109110TEST_P(Test_ONNX_layers, Transpose)111{112if (backend == DNN_BACKEND_INFERENCE_ENGINE &&113(target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_OPENCL || target == DNN_TARGET_MYRIAD))114throw SkipTestException("");115testONNXModels("transpose");116}117118TEST_P(Test_ONNX_layers, Multiplication)119{120if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16 ||121backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)122throw SkipTestException("");123testONNXModels("mul");124}125126TEST_P(Test_ONNX_layers, Constant)127{128testONNXModels("constant");129}130131TEST_P(Test_ONNX_layers, MultyInputs)132{133const String model = _tf("models/multy_inputs.onnx");134135Net net = readNetFromONNX(model);136ASSERT_FALSE(net.empty());137138net.setPreferableBackend(backend);139net.setPreferableTarget(target);140141Mat inp1 = blobFromNPY(_tf("data/input_multy_inputs_0.npy"));142Mat inp2 = blobFromNPY(_tf("data/input_multy_inputs_1.npy"));143Mat ref = blobFromNPY(_tf("data/output_multy_inputs.npy"));144checkBackend(&inp1, &ref);145146net.setInput(inp1, "0");147net.setInput(inp2, "1");148Mat out = net.forward();149150normAssert(ref, out, "", default_l1, default_lInf);151}152153154INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_ONNX_layers, dnnBackendsAndTargets());155156class Test_ONNX_nets : public Test_ONNX_layers {};157TEST_P(Test_ONNX_nets, Alexnet)158{159const String model = _tf("models/alexnet.onnx");160161Net net = readNetFromONNX(model);162ASSERT_FALSE(net.empty());163164net.setPreferableBackend(backend);165net.setPreferableTarget(target);166167Mat inp = imread(_tf("../grace_hopper_227.png"));168Mat ref = blobFromNPY(_tf("../caffe_alexnet_prob.npy"));169checkBackend(&inp, &ref);170171net.setInput(blobFromImage(inp, 1.0f, Size(227, 227), Scalar(), false));172ASSERT_FALSE(net.empty());173Mat out = net.forward();174175normAssert(out, ref, "", default_l1, default_lInf);176}177178TEST_P(Test_ONNX_nets, Squeezenet)179{180testONNXModels("squeezenet", pb);181}182183TEST_P(Test_ONNX_nets, Googlenet)184{185if (backend == DNN_BACKEND_INFERENCE_ENGINE)186throw SkipTestException("");187188const String model = _tf("models/googlenet.onnx");189190Net net = readNetFromONNX(model);191ASSERT_FALSE(net.empty());192193net.setPreferableBackend(backend);194net.setPreferableTarget(target);195196std::vector<Mat> images;197images.push_back( imread(_tf("../googlenet_0.png")) );198images.push_back( imread(_tf("../googlenet_1.png")) );199Mat inp = blobFromImages(images, 1.0f, Size(), Scalar(), false);200Mat ref = blobFromNPY(_tf("../googlenet_prob.npy"));201checkBackend(&inp, &ref);202203net.setInput(inp);204ASSERT_FALSE(net.empty());205Mat out = net.forward();206207normAssert(ref, out, "", default_l1, default_lInf);208}209210TEST_P(Test_ONNX_nets, CaffeNet)211{212testONNXModels("caffenet", pb);213}214215TEST_P(Test_ONNX_nets, RCNN_ILSVRC13)216{217testONNXModels("rcnn_ilsvrc13", pb);218}219220#ifdef OPENCV_32BIT_CONFIGURATION221TEST_P(Test_ONNX_nets, DISABLED_VGG16) // memory usage >2Gb222#else223TEST_P(Test_ONNX_nets, VGG16)224#endif225{226double l1 = default_l1;227double lInf = default_lInf;228// output range: [-69; 72]229if (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) {230l1 = 0.087;231lInf = 0.585;232}233else if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_OPENCL) {234lInf = 1.2e-4;235}236testONNXModels("vgg16", pb, l1, lInf);237}238239#ifdef OPENCV_32BIT_CONFIGURATION240TEST_P(Test_ONNX_nets, DISABLED_VGG16_bn) // memory usage >2Gb241#else242TEST_P(Test_ONNX_nets, VGG16_bn)243#endif244{245double l1 = default_l1;246double lInf = default_lInf;247// output range: [-16; 27]248if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) {249l1 = 0.0086;250lInf = 0.037;251}252else if (backend == DNN_BACKEND_INFERENCE_ENGINE &&253(target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD)) {254l1 = 0.031;255lInf = 0.2;256}257testONNXModels("vgg16-bn", pb, l1, lInf);258}259260TEST_P(Test_ONNX_nets, ZFNet)261{262testONNXModels("zfnet512", pb);263}264265TEST_P(Test_ONNX_nets, ResNet18v1)266{267// output range: [-16; 22]268const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.022 : default_l1;269const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.12 : default_lInf;270testONNXModels("resnet18v1", pb, l1, lInf);271}272273TEST_P(Test_ONNX_nets, ResNet50v1)274{275// output range: [-67; 75]276const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.6 : 1.25e-5;277const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.51 : 1.2e-4;278testONNXModels("resnet50v1", pb, l1, lInf);279}280281TEST_P(Test_ONNX_nets, ResNet101_DUC_HDC)282{283if (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_OPENCL284|| target == DNN_TARGET_MYRIAD) {285throw SkipTestException("");286}287testONNXModels("resnet101_duc_hdc", pb);288}289290TEST_P(Test_ONNX_nets, TinyYolov2)291{292if (cvtest::skipUnstableTests ||293backend == DNN_BACKEND_INFERENCE_ENGINE && (target == DNN_TARGET_OPENCL || target == DNN_TARGET_OPENCL_FP16)) {294throw SkipTestException("");295}296// output range: [-11; 8]297const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.017 : default_l1;298const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.14 : default_lInf;299testONNXModels("tiny_yolo2", pb, l1, lInf);300}301302TEST_P(Test_ONNX_nets, CNN_MNIST)303{304// output range: [-1952; 6574]305const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 3.82 : 4.4e-4;306const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 13.5 : 2e-3;307308testONNXModels("cnn_mnist", pb, l1, lInf);309}310311TEST_P(Test_ONNX_nets, MobileNet_v2)312{313// output range: [-166; 317]314const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.38 : 7e-5;315const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 2.87 : 5e-4;316testONNXModels("mobilenetv2", pb, l1, lInf);317}318319TEST_P(Test_ONNX_nets, LResNet100E_IR)320{321if (backend == DNN_BACKEND_INFERENCE_ENGINE &&322(target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_OPENCL || target == DNN_TARGET_MYRIAD))323throw SkipTestException("");324325double l1 = default_l1;326double lInf = default_lInf;327// output range: [-3; 3]328if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) {329l1 = 0.009;330lInf = 0.035;331}332testONNXModels("LResNet100E_IR", pb, l1, lInf);333}334335TEST_P(Test_ONNX_nets, Emotion_ferplus)336{337testONNXModels("emotion_ferplus", pb);338}339340TEST_P(Test_ONNX_nets, Inception_v2)341{342if (backend == DNN_BACKEND_INFERENCE_ENGINE)343throw SkipTestException("");344345testONNXModels("inception_v2", pb);346}347348TEST_P(Test_ONNX_nets, DenseNet121)349{350// output range: [-87; 138]351const double l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.12 : 2.2e-5;352const double lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.74 : 1.23e-4;353testONNXModels("densenet121", pb, l1, lInf);354}355356TEST_P(Test_ONNX_nets, Inception_v1)357{358testONNXModels("inception_v1", pb);359}360361TEST_P(Test_ONNX_nets, Shufflenet)362{363if (backend == DNN_BACKEND_INFERENCE_ENGINE &&364(target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_OPENCL || target == DNN_TARGET_MYRIAD))365throw SkipTestException("");366testONNXModels("shufflenet", pb);367}368369INSTANTIATE_TEST_CASE_P(/**/, Test_ONNX_nets, dnnBackendsAndTargets());370371}} // namespace372373374