204 lines
7.9 KiB
Diff
204 lines
7.9 KiB
Diff
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());
|