mirror of
https://github.com/zebrajr/opencv.git
synced 2025-12-06 00:19:46 +01:00
[GSoC] OpenCV.js: Accelerate OpenCV.js DNN via WebNN * Add WebNN backend for OpenCV DNN Module Update dnn.cpp Update dnn.cpp Update dnn.cpp Update dnn.cpp Add WebNN head files into OpenCV 3rd partiy files Create webnn.hpp update cmake Complete README and add OpenCVDetectWebNN.cmake file add webnn.cpp Modify webnn.cpp Can successfully compile the codes for creating a MLContext Update webnn.cpp Update README.md Update README.md Update README.md Update README.md Update cmake files and update README.md Update OpenCVDetectWebNN.cmake and README.md Update OpenCVDetectWebNN.cmake Fix OpenCVDetectWebNN.cmake and update README.md Add source webnn_cpp.cpp and libary libwebnn_proc.so Update dnn.cpp Update dnn.cpp Update dnn.cpp Update dnn.cpp update dnn.cpp update op_webnn update op_webnn Update op_webnn.hpp update op_webnn.cpp & hpp Update op_webnn.hpp Update op_webnn update the skeleton Update op_webnn.cpp Update op_webnn Update op_webnn.cpp Update op_webnn.cpp Update op_webnn.hpp update op_webnn update op_webnn Solved the problems of released variables. Fixed the bugs in op_webnn.cpp Implement op_webnn Implement Relu by WebNN API Update dnn.cpp for better test Update elementwise_layers.cpp Implement ReLU6 Update elementwise_layers.cpp Implement SoftMax using WebNN API Implement Reshape by WebNN API Implement PermuteLayer by WebNN API Implement PoolingLayer using WebNN API Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Implement poolingLayer by WebNN API and add more detailed logs Update dnn.cpp Update dnn.cpp Remove redundant codes and add more logs for poolingLayer Add more logs in the pooling layer implementation Fix the indent issue and resolve the compiling issue Fix the build problems Fix the build issue FIx the build issue Update dnn.cpp Update dnn.cpp * Fix the build issue * Implement BatchNorm Layer by WebNN API * Update convolution_layer.cpp This is a temporary file for Conv2d layer implementation * Integrate some general functions into op_webnn.cpp&hpp * Update const_layer.cpp * Update convolution_layer.cpp Still have some bugs that should be fixed. * Update conv2d layer and fc layer still have some problems to be fixed. * update constLayer, conv layer, fc layer There are still some bugs to be fixed. * Fix the build issue * Update concat_layer.cpp Still have some bugs to be fixed. * Update conv2d layer, fully connected layer and const layer * Update convolution_layer.cpp * Add OpenCV.js DNN module WebNN Backend (both using webnn-polyfill and electron) * Delete bib19450.aux * Add WebNN backend for OpenCV DNN Module Update dnn.cpp Update dnn.cpp Update dnn.cpp Update dnn.cpp Add WebNN head files into OpenCV 3rd partiy files Create webnn.hpp update cmake Complete README and add OpenCVDetectWebNN.cmake file add webnn.cpp Modify webnn.cpp Can successfully compile the codes for creating a MLContext Update webnn.cpp Update README.md Update README.md Update README.md Update README.md Update cmake files and update README.md Update OpenCVDetectWebNN.cmake and README.md Update OpenCVDetectWebNN.cmake Fix OpenCVDetectWebNN.cmake and update README.md Add source webnn_cpp.cpp and libary libwebnn_proc.so Update dnn.cpp Update dnn.cpp Update dnn.cpp Update dnn.cpp update dnn.cpp update op_webnn update op_webnn Update op_webnn.hpp update op_webnn.cpp & hpp Update op_webnn.hpp Update op_webnn update the skeleton Update op_webnn.cpp Update op_webnn Update op_webnn.cpp Update op_webnn.cpp Update op_webnn.hpp update op_webnn update op_webnn Solved the problems of released variables. Fixed the bugs in op_webnn.cpp Implement op_webnn Implement Relu by WebNN API Update dnn.cpp for better test Update elementwise_layers.cpp Implement ReLU6 Update elementwise_layers.cpp Implement SoftMax using WebNN API Implement Reshape by WebNN API Implement PermuteLayer by WebNN API Implement PoolingLayer using WebNN API Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Update pooling_layer.cpp Implement poolingLayer by WebNN API and add more detailed logs Update dnn.cpp Update dnn.cpp Remove redundant codes and add more logs for poolingLayer Add more logs in the pooling layer implementation Fix the indent issue and resolve the compiling issue Fix the build problems Fix the build issue FIx the build issue Update dnn.cpp Update dnn.cpp * Fix the build issue * Implement BatchNorm Layer by WebNN API * Update convolution_layer.cpp This is a temporary file for Conv2d layer implementation * Integrate some general functions into op_webnn.cpp&hpp * Update const_layer.cpp * Update convolution_layer.cpp Still have some bugs that should be fixed. * Update conv2d layer and fc layer still have some problems to be fixed. * update constLayer, conv layer, fc layer There are still some bugs to be fixed. * Update conv2d layer, fully connected layer and const layer * Update convolution_layer.cpp * Add OpenCV.js DNN module WebNN Backend (both using webnn-polyfill and electron) * Update dnn.cpp * Fix Error in dnn.cpp * Resolve duplication in conditions in convolution_layer.cpp * Fixed the issues in the comments * Fix building issue * Update tutorial * Fixed comments * Address the comments * Update CMakeLists.txt * Offer more accurate perf test on native * Add better perf tests for both native and web * Modify per tests for better results * Use more latest version of Electron * Support latest WebNN Clamp op * Add definition of HAVE_WEBNN macro * Support group convolution * Implement Scale_layer using WebNN * Add Softmax option for native classification example * Fix comments * Fix comments
223 lines
8.6 KiB
CMake
223 lines
8.6 KiB
CMake
if(WINRT)
|
|
ocv_module_disable(dnn)
|
|
endif()
|
|
|
|
if(NOT HAVE_PROTOBUF)
|
|
ocv_module_disable(opencv_dnn)
|
|
endif()
|
|
|
|
set(the_description "Deep neural network module. It allows to load models from different frameworks and to make forward pass")
|
|
|
|
ocv_add_dispatched_file_force_all("layers/layers_common" AVX AVX2 AVX512_SKX RVV)
|
|
ocv_add_dispatched_file_force_all("int8layers/layers_common" AVX2 AVX512_SKX)
|
|
|
|
ocv_add_module(dnn opencv_core opencv_imgproc WRAP python java objc js)
|
|
|
|
ocv_option(OPENCV_DNN_OPENCL "Build with OpenCL support" HAVE_OPENCL AND NOT APPLE)
|
|
|
|
if(OPENCV_DNN_OPENCL AND HAVE_OPENCL)
|
|
add_definitions(-DCV_OCL4DNN=1)
|
|
endif()
|
|
|
|
if(WITH_WEBNN AND HAVE_WEBNN)
|
|
add_definitions(-DHAVE_WEBNN=1)
|
|
endif()
|
|
|
|
ocv_option(OPENCV_DNN_CUDA "Build with CUDA support"
|
|
HAVE_CUDA
|
|
AND HAVE_CUBLAS
|
|
AND HAVE_CUDNN
|
|
)
|
|
|
|
if(OPENCV_DNN_CUDA)
|
|
if(HAVE_CUDA AND HAVE_CUBLAS AND HAVE_CUDNN)
|
|
add_definitions(-DCV_CUDA4DNN=1)
|
|
else()
|
|
if(NOT HAVE_CUDA)
|
|
message(SEND_ERROR "DNN: CUDA backend requires CUDA Toolkit. Please resolve dependency or disable OPENCV_DNN_CUDA=OFF")
|
|
elseif(NOT HAVE_CUBLAS)
|
|
message(SEND_ERROR "DNN: CUDA backend requires cuBLAS. Please resolve dependency or disable OPENCV_DNN_CUDA=OFF")
|
|
elseif(NOT HAVE_CUDNN)
|
|
message(SEND_ERROR "DNN: CUDA backend requires cuDNN. Please resolve dependency or disable OPENCV_DNN_CUDA=OFF")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
ocv_cmake_hook_append(INIT_MODULE_SOURCES_opencv_dnn "${CMAKE_CURRENT_LIST_DIR}/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake")
|
|
|
|
if(HAVE_TENGINE)
|
|
add_definitions(-DHAVE_TENGINE=1)
|
|
endif()
|
|
|
|
if(MSVC)
|
|
add_definitions( -D_CRT_SECURE_NO_WARNINGS=1 )
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146
|
|
/wd4305 /wd4127 /wd4100 /wd4512 /wd4125 /wd4389 /wd4510 /wd4610
|
|
/wd4702 /wd4456 /wd4457 /wd4065 /wd4310 /wd4661 /wd4506
|
|
)
|
|
if(MSVC_VERSION LESS 1910) # MSVS 2015, .pb.cc generated files
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4309) # 'static_cast': truncation of constant value
|
|
endif()
|
|
if(MSVC_VERSION LESS 1920) # <MSVS2019, .pb.cc generated files
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4189) # local variable is initialized but not referenced
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4592) # symbol will be dynamically initialized (implementation limitation)
|
|
endif()
|
|
else()
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-deprecated -Wmissing-prototypes -Wmissing-declarations -Wshadow
|
|
-Wunused-parameter -Wsign-compare
|
|
)
|
|
endif()
|
|
if(HAVE_CUDA)
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
|
|
endif()
|
|
if(NOT HAVE_CXX11)
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-undef) # LANG_CXX11 from protobuf files
|
|
endif()
|
|
|
|
if(APPLE_FRAMEWORK)
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshorten-64-to-32)
|
|
endif()
|
|
|
|
if(ANDROID)
|
|
add_definitions(-DDISABLE_POSIX_MEMALIGN -DTH_DISABLE_HEAP_TRACKING)
|
|
endif()
|
|
|
|
if(NOT BUILD_PROTOBUF)
|
|
add_definitions(-DOPENCV_DNN_EXTERNAL_PROTOBUF=1)
|
|
endif()
|
|
|
|
add_definitions(-DHAVE_PROTOBUF=1)
|
|
|
|
#suppress warnings in autogenerated caffe.pb.* files
|
|
ocv_warnings_disable(CMAKE_CXX_FLAGS
|
|
/wd4125 /wd4267 /wd4127 /wd4244 /wd4512 /wd4702
|
|
/wd4456 /wd4510 /wd4610 /wd4800
|
|
/wd4701 /wd4703 # potentially uninitialized local/pointer variable 'value' used
|
|
/wd4505 # unreferenced local function has been removed
|
|
/wd4458 # declaration of 'x' hides class member. GCC still works, MSVC bug is here: https://developercommunity.visualstudio.com/content/problem/219311/c-c4458-declaration-hides-class-member-warning-iss.html
|
|
-wd858 -wd2196
|
|
-Winvalid-offsetof # Apple Clang (attr_value.pb.cc)
|
|
)
|
|
|
|
set(include_dirs "")
|
|
set(libs "")
|
|
|
|
if(PROTOBUF_UPDATE_FILES)
|
|
file(GLOB proto_files "${CMAKE_CURRENT_LIST_DIR}/src/tensorflow/*.proto" "${CMAKE_CURRENT_LIST_DIR}/src/caffe/opencv-caffe.proto" "${CMAKE_CURRENT_LIST_DIR}/src/onnx/opencv-onnx.proto")
|
|
set(PROTOBUF_GENERATE_CPP_APPEND_PATH ON) # required for tensorflow
|
|
protobuf_generate_cpp(fw_srcs fw_hdrs ${proto_files})
|
|
else()
|
|
file(GLOB fw_srcs "${CMAKE_CURRENT_LIST_DIR}/misc/tensorflow/*.cc" "${CMAKE_CURRENT_LIST_DIR}/misc/caffe/opencv-caffe.pb.cc" "${CMAKE_CURRENT_LIST_DIR}/misc/onnx/opencv-onnx.pb.cc")
|
|
file(GLOB fw_hdrs "${CMAKE_CURRENT_LIST_DIR}/misc/tensorflow/*.h" "${CMAKE_CURRENT_LIST_DIR}/misc/caffe/opencv-caffe.pb.h" "${CMAKE_CURRENT_LIST_DIR}/misc/onnx/opencv-onnx.pb.h")
|
|
set(fw_inc "${CMAKE_CURRENT_LIST_DIR}/misc/caffe" "${CMAKE_CURRENT_LIST_DIR}/misc/tensorflow" "${CMAKE_CURRENT_LIST_DIR}/misc/onnx")
|
|
endif()
|
|
|
|
list(APPEND include_dirs ${fw_inc})
|
|
list(APPEND libs ${Protobuf_LIBRARIES})
|
|
if(NOT BUILD_PROTOBUF)
|
|
list(APPEND include_dirs ${Protobuf_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
set(sources_options "")
|
|
|
|
list(APPEND libs ${LAPACK_LIBRARIES})
|
|
if(OPENCV_DNN_OPENCL AND HAVE_OPENCL)
|
|
list(APPEND include_dirs ${OPENCL_INCLUDE_DIRS})
|
|
else()
|
|
set(sources_options EXCLUDE_OPENCL)
|
|
endif()
|
|
|
|
if(OPENCV_DNN_CUDA AND HAVE_CUDA AND HAVE_CUBLAS AND HAVE_CUDNN)
|
|
list(APPEND include_dirs ${CUDA_TOOLKIT_INCLUDE} ${CUDNN_INCLUDE_DIRS})
|
|
set(CC_LIST ${CUDA_ARCH_BIN})
|
|
separate_arguments(CC_LIST)
|
|
foreach(cc ${CC_LIST})
|
|
if(cc VERSION_LESS 3.0)
|
|
message(FATAL_ERROR "CUDA backend for DNN module requires CC 3.0 or higher. Please remove unsupported architectures from CUDA_ARCH_BIN option or disable OPENCV_DNN_CUDA=OFF.")
|
|
endif()
|
|
endforeach()
|
|
unset(CC_LIST)
|
|
else()
|
|
set(sources_options ${sources_options} EXCLUDE_CUDA)
|
|
endif()
|
|
|
|
if(HAVE_TENGINE)
|
|
list(APPEND include_dirs ${TENGINE_INCLUDE_DIRS})
|
|
list(APPEND libs -Wl,--whole-archive ${TENGINE_LIBRARIES} -Wl,--no-whole-archive)
|
|
endif()
|
|
|
|
set(webnn_srcs "")
|
|
if(NOT EMSCRIPTEN)
|
|
if(HAVE_WEBNN)
|
|
list(APPEND include_dirs ${WEBNN_HEADER_DIRS})
|
|
list(APPEND include_dirs ${WEBNN_INCLUDE_DIRS})
|
|
list(APPEND libs -Wl,--whole-archive ${WEBNN_LIBRARIES} -Wl,--no-whole-archive)
|
|
list(APPEND webnn_srcs $ENV{WEBNN_NATIVE_DIR}/gen/src/webnn/webnn_cpp.cpp)
|
|
endif()
|
|
endif()
|
|
|
|
ocv_module_include_directories(${include_dirs})
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
ocv_append_source_files_cxx_compiler_options(fw_srcs "-Wno-suggest-override") # GCC
|
|
ocv_append_source_files_cxx_compiler_options(fw_srcs "-Wno-array-bounds") # GCC 9.3.0 (Ubuntu 20.04)
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
ocv_append_source_files_cxx_compiler_options(fw_srcs "-Wno-inconsistent-missing-override") # Clang
|
|
endif()
|
|
|
|
set(dnn_runtime_libs "")
|
|
if(INF_ENGINE_TARGET)
|
|
set(use_nn_builder OFF)
|
|
if(TARGET inference_engine_nn_builder OR # custom imported target
|
|
TARGET IE::inference_engine_nn_builder OR # default imported target via InferenceEngineConfig.cmake
|
|
INF_ENGINE_RELEASE VERSION_LESS "2020000000") # compatibility with older versions on IE
|
|
set(use_nn_builder ON)
|
|
endif()
|
|
ocv_option(OPENCV_DNN_IE_NN_BUILDER_2019 "Build with Inference Engine NN Builder API support" ${use_nn_builder}) # future: NOT HAVE_NGRAPH
|
|
if(OPENCV_DNN_IE_NN_BUILDER_2019)
|
|
message(STATUS "DNN: Enabling Inference Engine NN Builder API support")
|
|
add_definitions(-DHAVE_DNN_IE_NN_BUILDER_2019=1)
|
|
endif()
|
|
list(APPEND dnn_runtime_libs ${INF_ENGINE_TARGET})
|
|
endif()
|
|
if(HAVE_NGRAPH)
|
|
message(STATUS "DNN: Enabling Inference Engine nGraph API support")
|
|
add_definitions(-DHAVE_DNN_NGRAPH)
|
|
list(APPEND dnn_runtime_libs ngraph::ngraph)
|
|
endif()
|
|
|
|
ocv_glob_module_sources(${sources_options} SOURCES ${fw_srcs} ${webnn_srcs})
|
|
ocv_create_module(${libs} ${dnn_runtime_libs})
|
|
ocv_add_samples()
|
|
ocv_add_accuracy_tests(${dnn_runtime_libs})
|
|
|
|
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")
|
|
ocv_add_perf_tests(${INF_ENGINE_TARGET}
|
|
FILES test_common "${CMAKE_CURRENT_LIST_DIR}/test/test_common.hpp" "${CMAKE_CURRENT_LIST_DIR}/test/test_common.impl.hpp"
|
|
FILES Src ${perf_srcs}
|
|
FILES Include ${perf_hdrs}
|
|
)
|
|
|
|
ocv_option(OPENCV_DNN_PERF_CAFFE "Add performance tests of Caffe framework" OFF)
|
|
ocv_option(OPENCV_DNN_PERF_CLCAFFE "Add performance tests of clCaffe framework" OFF)
|
|
if(BUILD_PERF_TESTS)
|
|
if (OPENCV_DNN_PERF_CAFFE
|
|
OR ${the_module}_PERF_CAFFE # compatibility for deprecated option
|
|
)
|
|
find_package(Caffe QUIET)
|
|
if (Caffe_FOUND)
|
|
add_definitions(-DHAVE_CAFFE=1)
|
|
ocv_target_link_libraries(opencv_perf_dnn caffe)
|
|
endif()
|
|
elseif(OPENCV_DNN_PERF_CLCAFFE
|
|
OR ${the_module}_PERF_CAFFE # compatibility for deprecated option
|
|
)
|
|
find_package(Caffe QUIET)
|
|
if (Caffe_FOUND)
|
|
add_definitions(-DHAVE_CLCAFFE=1)
|
|
ocv_target_link_libraries(opencv_perf_dnn caffe)
|
|
endif()
|
|
endif()
|
|
endif()
|