diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake index 8835347d1d..5b1e17529f 100644 --- a/cmake/OpenCVFindProtobuf.cmake +++ b/cmake/OpenCVFindProtobuf.cmake @@ -30,8 +30,14 @@ if(BUILD_PROTOBUF) set(Protobuf_LIBRARIES "libprotobuf") set(HAVE_PROTOBUF TRUE) else() + # we still need this for command PROTOBUF_GENERATE_CPP. + set(protobuf_MODULE_COMPATIBLE ON) + unset(Protobuf_VERSION CACHE) - find_package(Protobuf QUIET) + find_package(Protobuf QUIET CONFIG) + if(NOT Protobuf_FOUND) + find_package(Protobuf QUIET) + endif() # Backwards compatibility # Define camel case versions of input variables @@ -67,6 +73,20 @@ else() endif() endif() +# See https://github.com/opencv/opencv/issues/24369 +# In Protocol Buffers v22.0 and later drops C++11 support and depends abseil-cpp. +# Details: https://protobuf.dev/news/2022-08-03/ +# And if std::text_view is in abseil-cpp requests C++17 and later. + +if(HAVE_PROTOBUF) + if(NOT (Protobuf_VERSION VERSION_LESS 22)) + if((CMAKE_CXX_STANDARD EQUAL 98) OR (CMAKE_CXX_STANDARD LESS 17)) + message(STATUS "CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} is too old to support protobuf(${Protobuf_VERSION}) and/or abseil-cpp. Use C++17 or later. Turning HAVE_PROTOBUF off") + set(HAVE_PROTOBUF FALSE) + endif() + endif() +endif() + if(HAVE_PROTOBUF AND PROTOBUF_UPDATE_FILES AND NOT COMMAND PROTOBUF_GENERATE_CPP) message(FATAL_ERROR "Can't configure protobuf dependency (BUILD_PROTOBUF=${BUILD_PROTOBUF} PROTOBUF_UPDATE_FILES=${PROTOBUF_UPDATE_FILES})") endif() @@ -74,15 +94,20 @@ endif() if(HAVE_PROTOBUF) list(APPEND CUSTOM_STATUS protobuf) if(NOT BUILD_PROTOBUF) + unset( __location) if(TARGET "${Protobuf_LIBRARIES}") get_target_property(__location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION_RELEASE) if(NOT __location) get_target_property(__location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION) endif() - elseif(Protobuf_LIBRARY) - set(__location "${Protobuf_LIBRARY}") - else() - set(__location "${Protobuf_LIBRARIES}") + endif() + + if(NOT __location) + if(Protobuf_LIBRARY) + set(__location "${Protobuf_LIBRARY}") + else() + set(__location "${Protobuf_LIBRARIES}") + endif() endif() endif() list(APPEND CUSTOM_STATUS_protobuf " Protobuf:" diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt index 5963eb68d3..a5385fd403 100644 --- a/modules/dnn/CMakeLists.txt +++ b/modules/dnn/CMakeLists.txt @@ -240,6 +240,12 @@ ocv_create_module(${libs} ${dnn_runtime_libs}) ocv_add_samples() ocv_add_accuracy_tests(${dnn_runtime_libs}) +if(NOT BUILD_PROTOBUF) + if(TARGET opencv_test_dnn) + ocv_target_compile_definitions(opencv_test_dnn PRIVATE "OPENCV_DNN_EXTERNAL_PROTOBUF=1") + endif() +endif() + set(perf_path "${CMAKE_CURRENT_LIST_DIR}/perf") file(GLOB_RECURSE perf_srcs "${perf_path}/*.cpp") file(GLOB_RECURSE perf_hdrs "${perf_path}/*.hpp" "${perf_path}/*.h") diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp index f2ed8334e6..707ae51673 100644 --- a/modules/dnn/test/test_layers.cpp +++ b/modules/dnn/test/test_layers.cpp @@ -764,11 +764,15 @@ TEST_F(Layer_RNN_Test, get_set_test) TEST_P(Test_Caffe_layers, Accum) { +#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF + throw SkipTestException("Requires patched protobuf"); +#else if (backend == DNN_BACKEND_OPENCV && target != DNN_TARGET_CPU) applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL, CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); testLayerUsingCaffeModels("accum", false, false, 0.0, 0.0, 2); testLayerUsingCaffeModels("accum_ref", false, false, 0.0, 0.0, 2); +#endif } TEST_P(Test_Caffe_layers, FlowWarp) @@ -788,29 +792,41 @@ TEST_P(Test_Caffe_layers, ChannelNorm) TEST_P(Test_Caffe_layers, DataAugmentation) { +#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF + throw SkipTestException("Requires patched protobuf"); +#else if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); testLayerUsingCaffeModels("data_augmentation", true, false); testLayerUsingCaffeModels("data_augmentation_2x1", true, false); testLayerUsingCaffeModels("data_augmentation_8x6", true, false); +#endif } TEST_P(Test_Caffe_layers, Resample) { +#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF + throw SkipTestException("Requires patched protobuf"); +#else #if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_LT(2023000000) if (backend != DNN_BACKEND_OPENCV) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); #endif testLayerUsingCaffeModels("nearest_2inps", false, false, 0.0, 0.0, 2); testLayerUsingCaffeModels("nearest", false, false); +#endif } TEST_P(Test_Caffe_layers, Correlation) { +#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF + throw SkipTestException("Requires patched protobuf"); +#else if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NGRAPH, CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, CV_TEST_TAG_DNN_SKIP_OPENCL, CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); testLayerUsingCaffeModels("correlation", false, false, 0.0, 0.0, 2); +#endif } TEST_P(Test_Caffe_layers, Convolution2Inputs) @@ -1651,12 +1667,11 @@ private: int outWidth, outHeight, zoomFactor; }; -#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF TEST_P(Test_Caffe_layers, Interp) -#else -TEST_P(Test_Caffe_layers, DISABLED_Interp) // requires patched protobuf (available in OpenCV source tree only) -#endif { +#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF + throw SkipTestException("Requires patched protobuf"); +#else #if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_EQ(2021030000) if (backend == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH && target == DNN_TARGET_MYRIAD) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); // exception @@ -1680,6 +1695,7 @@ TEST_P(Test_Caffe_layers, DISABLED_Interp) // requires patched protobuf (availa // Test an implemented layer. testLayerUsingCaffeModels("layer_interp", false, false); +#endif } INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_Caffe_layers, dnnBackendsAndTargets());