blob: 536060cfd9ec44876d3f8bf7df19bc9f02766586 [file] [log] [blame]
From 5e4150826fea6f37276f348c65d94ce4847d1211 Mon Sep 17 00:00:00 2001
From: Kumataro <Kumataro@users.noreply.github.com>
Date: Sat, 7 Oct 2023 10:11:25 +0900
Subject: [PATCH] 3rdparty: supporting protobuf v22 and later
Upstream-Status: Submitted [https://github.com/opencv/opencv/pull/24372]
---
cmake/OpenCVFindProtobuf.cmake | 37 ++++++++++++++++++++++++++++++++++
modules/dnn/CMakeLists.txt | 9 +++++++++
2 files changed, 46 insertions(+)
diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake
index 8835347d1d..9bd5c28db8 100644
--- a/cmake/OpenCVFindProtobuf.cmake
+++ b/cmake/OpenCVFindProtobuf.cmake
@@ -67,6 +67,38 @@ 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("${Protobuf_VERSION}" MATCHES [[[0-9]+.([0-9]+).[0-9]+]])
+ string(COMPARE GREATER_EQUAL "${CMAKE_MATCH_1}" "22" REQUEST_ABSL)
+
+ if(REQUEST_ABSL)
+ string(COMPARE GREATER_EQUAL "${CMAKE_CXX_STANDARD}" "17" USED_AFTER_CXX17)
+ if(NOT USED_AFTER_CXX17)
+ message("CMAKE_CXX_STANDARD : ${CMAKE_CXX_STANDARD}")
+ message("protobuf : ${Protobuf_VERSION}")
+ message(FATAL_ERROR "protobuf(v22 and later) and abseil-cpp request CMAKE_CXX_STANDARD=17 and later.")
+ endif()
+
+ ocv_check_modules(ABSL_STRINGS absl_strings)
+ if(NOT ABSL_STRINGS_FOUND)
+ message(FATAL_ERROR "protobuf(v22 and later) requests abseil-cpp(strings), but missing.")
+ endif()
+
+ ocv_check_modules(ABSL_LOG absl_log)
+ if(NOT ABSL_LOG_FOUND)
+ message(FATAL_ERROR "protobuf(v22 and later) requests abseil-cpp(log), but missing.")
+ endif()
+
+ endif()
+ else()
+ message(FATAL_ERROR "Protobuf version(${Protobuf_VERSION}) is unexpected to split.")
+ 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()
@@ -89,3 +121,8 @@ if(HAVE_PROTOBUF)
BUILD_PROTOBUF THEN "build (${Protobuf_VERSION})"
ELSE "${__location} (${Protobuf_VERSION})")
endif()
+
+if(HAVE_ABSL_STRINGS AND HAVE_ABSL_LOG)
+ list(APPEND CUSTOM_STATUS absl)
+ list(APPEND CUSTOM_STATUS_absl " abseil-cpp:" "YES (${ABSL_STRINGS_VERSION})" )
+endif()
diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt
index 804b78ead2..d32007b37e 100644
--- a/modules/dnn/CMakeLists.txt
+++ b/modules/dnn/CMakeLists.txt
@@ -149,6 +149,15 @@ if(NOT BUILD_PROTOBUF)
list(APPEND include_dirs ${Protobuf_INCLUDE_DIRS})
endif()
+if(HAVE_ABSL_STRINGS)
+ list(APPEND libs ${ABSL_STRINGS_LIBRARIES})
+ list(APPEND include_dirs ${ABSL_STRTRINGS_INCLUDE_DIRS})
+endif()
+if(HAVE_ABSL_LOG)
+ list(APPEND libs ${ABSL_LOG_LIBRARIES})
+ list(APPEND include_dirs ${ABSL_LOG_INCLUDE_DIRS})
+endif()
+
set(sources_options "")
list(APPEND libs ${LAPACK_LIBRARIES})
From 06a7669521d205f647d3e718322ccd153cdbbb77 Mon Sep 17 00:00:00 2001
From: Kumataro <Kumataro@users.noreply.github.com>
Date: Sun, 8 Oct 2023 09:39:35 +0900
Subject: [PATCH] dnn: disable some tests for external protobuf
---
modules/dnn/CMakeLists.txt | 5 +++++
modules/dnn/src/caffe/caffe_io.cpp | 24 ++++++++++++++++++++++--
modules/dnn/test/test_layers.cpp | 16 ++++++++++++++++
3 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt
index d32007b37e..face38465f 100644
--- a/modules/dnn/CMakeLists.txt
+++ b/modules/dnn/CMakeLists.txt
@@ -254,6 +254,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")
@@ -318,3 +322,4 @@ if(OPENCV_TEST_DNN_TFLITE)
ocv_target_compile_definitions(opencv_perf_dnn PRIVATE "OPENCV_TEST_DNN_TFLITE=1")
endif()
endif()
+
diff --git a/modules/dnn/src/caffe/caffe_io.cpp b/modules/dnn/src/caffe/caffe_io.cpp
index ebecf95eea..ebceca84cf 100644
--- a/modules/dnn/src/caffe/caffe_io.cpp
+++ b/modules/dnn/src/caffe/caffe_io.cpp
@@ -1130,7 +1130,17 @@ bool ReadProtoFromTextFile(const char* filename, Message* proto) {
parser.AllowUnknownField(true);
parser.SetRecursionLimit(1000);
#endif
- return parser.Parse(&input, proto);
+ const bool ret = parser.Parse(&input, proto);
+
+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF
+ if(!ret)
+ {
+ LOG(ERROR) << "Some data requires patched protobuf (available in OpenCV source tree only).";
+ CV_Error_(Error::StsError,("Some data requires patched protobuf (available in OpenCV source tree only)."));
+ }
+#endif
+
+ return ret;
}
bool ReadProtoFromBinaryFile(const char* filename, Message* proto) {
@@ -1148,7 +1158,17 @@ bool ReadProtoFromTextBuffer(const char* data, size_t len, Message* proto) {
parser.AllowUnknownField(true);
parser.SetRecursionLimit(1000);
#endif
- return parser.Parse(&input, proto);
+ const bool ret = parser.Parse(&input, proto);
+
+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF
+ if(!ret)
+ {
+ LOG(ERROR) << "Some data requires patched protobuf (available in OpenCV source tree only).";
+ CV_Error_(Error::StsError,("Some data requires patched protobuf (available in OpenCV source tree only)."));
+ }
+#endif
+
+ return ret;
}
diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp
index 763d94b99c..a07d442d76 100644
--- a/modules/dnn/test/test_layers.cpp
+++ b/modules/dnn/test/test_layers.cpp
@@ -754,7 +754,11 @@ TEST_F(Layer_RNN_Test, get_set_test)
EXPECT_EQ(shape(outputs[1]), shape(nT, nS, nH));
}
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Accum)
+#else
+TEST_P(Test_Caffe_layers, DISABLED_Accum) // requires patched protobuf (available in OpenCV source tree only)
+#endif
{
if (backend == DNN_BACKEND_OPENCV && target != DNN_TARGET_CPU)
applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL, CV_TEST_TAG_DNN_SKIP_OPENCL_FP16);
@@ -778,7 +782,11 @@ TEST_P(Test_Caffe_layers, ChannelNorm)
testLayerUsingCaffeModels("channel_norm", false, false);
}
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, DataAugmentation)
+#else
+TEST_P(Test_Caffe_layers, DISABLED_DataAugmentation) // requires patched protobuf (available in OpenCV source tree only)
+#endif
{
if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16)
applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL_FP16);
@@ -787,7 +795,11 @@ TEST_P(Test_Caffe_layers, DataAugmentation)
testLayerUsingCaffeModels("data_augmentation_8x6", true, false);
}
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Resample)
+#else
+TEST_P(Test_Caffe_layers, DISABLED_Resample) // requires patched protobuf (available in OpenCV source tree only)
+#endif
{
if (backend != DNN_BACKEND_OPENCV)
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH);
@@ -795,7 +807,11 @@ TEST_P(Test_Caffe_layers, Resample)
testLayerUsingCaffeModels("nearest", false, false);
}
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Correlation)
+#else
+TEST_P(Test_Caffe_layers, DISABLED_Correlation) // requires patched protobuf (available in OpenCV source tree only)
+#endif
{
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,
From 2c33798f41942aefc203183d673ce4846f32dba4 Mon Sep 17 00:00:00 2001
From: Kumataro <Kumataro@users.noreply.github.com>
Date: Sun, 8 Oct 2023 13:28:40 +0900
Subject: [PATCH] use GREATER instead of GREATER_EQUAL and remove new blank
line at EOF
---
cmake/OpenCVFindProtobuf.cmake | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake
index 9bd5c28db8..ba147526d6 100644
--- a/cmake/OpenCVFindProtobuf.cmake
+++ b/cmake/OpenCVFindProtobuf.cmake
@@ -71,12 +71,14 @@ endif()
# 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("${Protobuf_VERSION}" MATCHES [[[0-9]+.([0-9]+).[0-9]+]])
- string(COMPARE GREATER_EQUAL "${CMAKE_MATCH_1}" "22" REQUEST_ABSL)
+ string(COMPARE GREATER "${CMAKE_MATCH_1}" "21" REQUEST_ABSL) # >=22
if(REQUEST_ABSL)
- string(COMPARE GREATER_EQUAL "${CMAKE_CXX_STANDARD}" "17" USED_AFTER_CXX17)
+ string(COMPARE GREATER "${CMAKE_CXX_STANDARD}" "16" USED_AFTER_CXX17) # >=17
+
if(NOT USED_AFTER_CXX17)
message("CMAKE_CXX_STANDARD : ${CMAKE_CXX_STANDARD}")
message("protobuf : ${Protobuf_VERSION}")
From cd709eefbeedd116bf3495b42280323b932791ff Mon Sep 17 00:00:00 2001
From: Kumataro <Kumataro@users.noreply.github.com>
Date: Mon, 9 Oct 2023 21:51:04 +0900
Subject: [PATCH] fix for review
---
cmake/OpenCVFindProtobuf.cmake | 5 ----
modules/dnn/src/caffe/caffe_io.cpp | 24 ++----------------
modules/dnn/test/test_layers.cpp | 40 +++++++++++++++---------------
3 files changed, 22 insertions(+), 47 deletions(-)
diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake
index ba147526d6..2faf1010bf 100644
--- a/cmake/OpenCVFindProtobuf.cmake
+++ b/cmake/OpenCVFindProtobuf.cmake
@@ -123,8 +123,3 @@ if(HAVE_PROTOBUF)
BUILD_PROTOBUF THEN "build (${Protobuf_VERSION})"
ELSE "${__location} (${Protobuf_VERSION})")
endif()
-
-if(HAVE_ABSL_STRINGS AND HAVE_ABSL_LOG)
- list(APPEND CUSTOM_STATUS absl)
- list(APPEND CUSTOM_STATUS_absl " abseil-cpp:" "YES (${ABSL_STRINGS_VERSION})" )
-endif()
diff --git a/modules/dnn/src/caffe/caffe_io.cpp b/modules/dnn/src/caffe/caffe_io.cpp
index ebceca84cf..ebecf95eea 100644
--- a/modules/dnn/src/caffe/caffe_io.cpp
+++ b/modules/dnn/src/caffe/caffe_io.cpp
@@ -1130,17 +1130,7 @@ bool ReadProtoFromTextFile(const char* filename, Message* proto) {
parser.AllowUnknownField(true);
parser.SetRecursionLimit(1000);
#endif
- const bool ret = parser.Parse(&input, proto);
-
-#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF
- if(!ret)
- {
- LOG(ERROR) << "Some data requires patched protobuf (available in OpenCV source tree only).";
- CV_Error_(Error::StsError,("Some data requires patched protobuf (available in OpenCV source tree only)."));
- }
-#endif
-
- return ret;
+ return parser.Parse(&input, proto);
}
bool ReadProtoFromBinaryFile(const char* filename, Message* proto) {
@@ -1158,17 +1148,7 @@ bool ReadProtoFromTextBuffer(const char* data, size_t len, Message* proto) {
parser.AllowUnknownField(true);
parser.SetRecursionLimit(1000);
#endif
- const bool ret = parser.Parse(&input, proto);
-
-#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF
- if(!ret)
- {
- LOG(ERROR) << "Some data requires patched protobuf (available in OpenCV source tree only).";
- CV_Error_(Error::StsError,("Some data requires patched protobuf (available in OpenCV source tree only)."));
- }
-#endif
-
- return ret;
+ return parser.Parse(&input, proto);
}
diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp
index a07d442d76..5c6fc541d7 100644
--- a/modules/dnn/test/test_layers.cpp
+++ b/modules/dnn/test/test_layers.cpp
@@ -754,17 +754,17 @@ TEST_F(Layer_RNN_Test, get_set_test)
EXPECT_EQ(shape(outputs[1]), shape(nT, nS, nH));
}
-#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Accum)
-#else
-TEST_P(Test_Caffe_layers, DISABLED_Accum) // requires patched protobuf (available in OpenCV source tree only)
-#endif
{
+#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)
@@ -782,42 +782,42 @@ TEST_P(Test_Caffe_layers, ChannelNorm)
testLayerUsingCaffeModels("channel_norm", false, false);
}
-#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, DataAugmentation)
-#else
-TEST_P(Test_Caffe_layers, DISABLED_DataAugmentation) // requires patched protobuf (available in OpenCV source tree only)
-#endif
{
+#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
}
-#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Resample)
-#else
-TEST_P(Test_Caffe_layers, DISABLED_Resample) // requires patched protobuf (available in OpenCV source tree only)
-#endif
{
+#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
}
-#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
TEST_P(Test_Caffe_layers, Correlation)
-#else
-TEST_P(Test_Caffe_layers, DISABLED_Correlation) // requires patched protobuf (available in OpenCV source tree only)
-#endif
{
+#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)
{
@@ -1657,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
@@ -1686,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());