| From 75f7475fcfb35cbe4d8f5ccf5c4ac8bc78f2dc30 Mon Sep 17 00:00:00 2001 |
| From: Kumataro <Kumataro@users.noreply.github.com> |
| Date: Thu, 19 Oct 2023 14:45:08 +0900 |
| Subject: [PATCH] Merge pull request #24372 from Kumataro:fix24369 |
| |
| Supporting protobuf v22 and later(with abseil-cpp/C++17) #24372 |
| |
| fix https://github.com/opencv/opencv/issues/24369 |
| related https://github.com/opencv/opencv/issues/23791 |
| |
| 1. This patch supports external protobuf v22 and later, it required abseil-cpp and c++17. |
| Even if the built-in protobuf is upgraded to v22 or later, |
| the dependency on abseil-cpp and the requirement for C++17 will continue. |
| 2. Some test for caffe required patched protobuf, so this patch disable them. |
| |
| This patch is tested by following libraries. |
| - Protobuf: /usr/local/lib/libprotobuf.so (4.24.4) |
| - abseil-cpp: YES (20230125) |
| |
| See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request |
| |
| - [x] I agree to contribute to the project under Apache 2 License. |
| - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV |
| - [x] The PR is proposed to the proper branch |
| - [x] There is a reference to the original bug report and related work |
| - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable |
| Patch to opencv_extra has the same branch name. |
| - [x] The feature is well documented and sample code can be built with the project CMake |
| |
| Upstream-Status: Backport [https://github.com/opencv/opencv/commit/6e4280ea81b59c6dca45bb9801b758377beead55] |
| --- |
| cmake/OpenCVFindProtobuf.cmake | 35 +++++++++++++++++++++++++++----- |
| modules/dnn/CMakeLists.txt | 6 ++++++ |
| modules/dnn/test/test_layers.cpp | 24 ++++++++++++++++++---- |
| 3 files changed, 56 insertions(+), 9 deletions(-) |
| |
| 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 804b78ead2..9fcc460909 100644 |
| --- a/modules/dnn/CMakeLists.txt |
| +++ b/modules/dnn/CMakeLists.txt |
| @@ -245,6 +245,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 763d94b99c..6cb6d54b3f 100644 |
| --- a/modules/dnn/test/test_layers.cpp |
| +++ b/modules/dnn/test/test_layers.cpp |
| @@ -756,11 +756,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) |
| @@ -780,27 +784,39 @@ 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 (backend != DNN_BACKEND_OPENCV) |
| applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); |
| 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) |
| @@ -1641,12 +1657,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 |
| @@ -1670,6 +1685,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()); |