From e7f741292ed2d29a51105506ef010e963a42ecab Mon Sep 17 00:00:00 2001 From: Jack Zhou Date: Wed, 21 Sep 2022 13:25:56 +0800 Subject: [PATCH] Add some lib directories compiler option (#255) * Add OPENCV_DIRECTORY option to provide the ability to specify the installed opecv lib pat * Use find_package for opencv in windows, mac and linux * Fix opencv cmake * Fix python lib rpath setting * fix mac python package * Add some promt when use different opencv lib * add status message * Fix the backslash * Fix python package user defined libs * Fix windows python process libs * Add windows lib set path --- CMakeLists.txt | 18 ++- FastDeploy.cmake.in | 28 ++-- cmake/opencv.cmake | 120 +++--------------- python/fastdeploy/c_lib_wrap.py.in | 14 +- ...s_libraries.py => process_libraries.py.in} | 51 +++++--- python/setup.py | 7 +- 6 files changed, 83 insertions(+), 155 deletions(-) rename python/scripts/{process_libraries.py => process_libraries.py.in} (76%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 93481dad8..50cfb82d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,10 @@ option(ENABLE_VISION "Whether to enable vision models usage." OFF) option(ENABLE_VISION_VISUALIZE "Whether to enable visualize vision model result toolbox." ON) option(ENABLE_TEXT "Whether to enable text models usage." OFF) option(WITH_TESTING "Whether to compile with unittest." OFF) +option(OPENCV_DIRECTORY "User can specify the installed opencv directory.") # Please don't open this flag now, some bugs exists. -option(ENABLE_OPENCV_CUDA "Whether to enable opencv with cuda, this will allow process image with GPU." OFF) +# option(ENABLE_OPENCV_CUDA "Whether to enable opencv with cuda, this will allow process image with GPU." OFF) option(ENABLE_DEBUG "Whether to enable print debug information, this may reduce performance." OFF) # Whether to build fastdeply with vision/text/... examples, only for testings. @@ -242,9 +243,17 @@ if(ENABLE_VISION) list(APPEND DEPEND_LIBS yaml-cpp) list(APPEND ALL_DEPLOY_SRCS ${DEPLOY_VISION_SRCS}) include_directories(${PROJECT_SOURCE_DIR}/third_party/yaml-cpp/include) - include(${PROJECT_SOURCE_DIR}/cmake/opencv.cmake) - list(APPEND DEPEND_LIBS ${OpenCV_LIBS}) - + if (OPENCV_DIRECTORY) + message(STATUS "Use the opencv lib specified by user. The OpenCV path: ${OPENCV_DIRECTORY}") + STRING(REGEX REPLACE "\\\\" "/" OPENCV_DIRECTORY ${OPENCV_DIRECTORY}) + find_package(OpenCV REQUIRED PATHS ${OPENCV_DIRECTORY}) + list(APPEND DEPEND_LIBS ${OpenCV_LIBS}) + include_directories(${OpenCV_INCLUDE_DIRS}) + else() + message(STATUS "Use the default opencv lib.") + include(${PROJECT_SOURCE_DIR}/cmake/opencv.cmake) + list(APPEND DEPEND_LIBS ${OpenCV_LIBS}) + endif() if(ENABLE_VISION_VISUALIZE) add_definitions(-DENABLE_VISION_VISUALIZE) endif() @@ -263,6 +272,7 @@ endif() configure_file(${PROJECT_SOURCE_DIR}/FastDeploy.cmake.in ${PROJECT_SOURCE_DIR}/FastDeploy.cmake @ONLY) configure_file(${PROJECT_SOURCE_DIR}/python/fastdeploy/c_lib_wrap.py.in ${PROJECT_SOURCE_DIR}/python/fastdeploy/c_lib_wrap.py) +configure_file(${PROJECT_SOURCE_DIR}/python/scripts/process_libraries.py.in ${PROJECT_SOURCE_DIR}/python/scripts/process_libraries.py) list(REMOVE_ITEM ALL_DEPLOY_SRCS ${DEPLOY_PYBIND_SRCS}) diff --git a/FastDeploy.cmake.in b/FastDeploy.cmake.in index 3ec9d2a60..2da50867d 100644 --- a/FastDeploy.cmake.in +++ b/FastDeploy.cmake.in @@ -10,8 +10,9 @@ set(ENABLE_TRT_BACKEND @ENABLE_TRT_BACKEND@) set(ENABLE_PADDLE_FRONTEND @ENABLE_PADDLE_FRONTEND@) set(ENABLE_VISION @ENABLE_VISION@) set(ENABLE_TEXT @ENABLE_TEXT@) -set(ENABLE_OPENCV_CUDA @ENABLE_OPENCV_CUDA@) +# set(ENABLE_OPENCV_CUDA @ENABLE_OPENCV_CUDA@) set(LIBRARY_NAME @LIBRARY_NAME@) +set(OPENCV_DIRECTORY @OPENCV_DIRECTORY@) set(FASTDEPLOY_LIBS "") set(FASTDEPLOY_INCS "") @@ -76,26 +77,13 @@ if(WITH_GPU) endif() if(ENABLE_VISION) - if(WIN32) - set(OpenCV_DIR ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv-win-x64-3.4.16/build) - find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR}) - list(APPEND FASTDEPLOY_INCS ${OpenCV_INCLUDE_DIRS}) - list(APPEND FASTDEPLOY_LIBS ${OpenCV_LIBS}) - else() - find_library(OPENCV_CORE_LIB opencv_core ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - find_library(OPENCV_HIGHGUI_LIB opencv_highgui ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - find_library(OPENCV_IMGPROC_LIB opencv_imgproc ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - find_library(OPENCV_IMGCODESC_LIB opencv_imgcodecs ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - list(APPEND FASTDEPLOY_LIBS ${OPENCV_CORE_LIB} ${OPENCV_HIGHGUI_LIB} ${OPENCV_IMGPROC_LIB} ${OPENCV_IMGCODESC_LIB}) - list(APPEND FASTDEPLOY_INCS ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/include) - - if(ENABLE_OPENCV_CUDA) - find_library(OPENCV_CUDAARITHM_LIB opencv_core ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - find_library(OPENCV_CUDAIMGPROC_LIB opencv_core ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - find_library(OPENCV_CUDAWARPING_LIB opencv_core ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/opencv/lib NO_DEFAULT_PATH) - list(APPEND FASTDEPLOY_LIBS ${OPENCV_CUDAARITHM_LIB} ${OPENCV_CUDAIMGPROC_LIB} ${OPENCV_CUDAWARPING_LIB}) - endif() + set(OpenCV_DIR @OpenCV_DIR@) + if (OPENCV_DIRECTORY) + set(OpenCV_DIR ${OPENCV_DIRECTORY}) endif() + find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR}) + list(APPEND FASTDEPLOY_INCS ${OpenCV_INCLUDE_DIRS}) + list(APPEND FASTDEPLOY_LIBS ${OpenCV_LIBS}) endif() if (ENABLE_TEXT) diff --git a/cmake/opencv.cmake b/cmake/opencv.cmake index 975e99742..85fadc440 100644 --- a/cmake/opencv.cmake +++ b/cmake/opencv.cmake @@ -14,125 +14,39 @@ set(OPENCV_INSTALL_DIR ${THIRD_PARTY_PATH}/install/) +set(OPENCV_URL_PREFIX "https://bj.bcebos.com/paddle2onnx/libs") +set(COMPRESSED_SUFFIX ".tgz") if(WIN32) - set(OPENCV_URL https://bj.bcebos.com/paddle2onnx/libs/opencv-win-x64-3.4.16.zip) - download_and_decompress(${OPENCV_URL} ${CMAKE_CURRENT_BINARY_DIR}/opencv-win-x64-3.4.16.zip ${THIRD_PARTY_PATH}/install/) - set(OpenCV_DIR ${THIRD_PARTY_PATH}/install/opencv-win-x64-3.4.16/build) - find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR}) - include_directories(${OpenCV_INCLUDE_DIRS}) - list(APPEND DEPEND_LIBS ${OpenCV_LIBS}) -else() - -include(ExternalProject) - -set(OPENCV_PROJECT "extern_opencv") -set(OPENCV_PREFIX_DIR ${THIRD_PARTY_PATH}/opencv) -set(OPENCV_SOURCE_DIR - ${THIRD_PARTY_PATH}/opencv/src/${OPENCV_PROJECT}) -set(OPENCV_INSTALL_DIR ${THIRD_PARTY_PATH}/install/opencv) -set(OPENCV_INC_DIR - "${OPENCV_INSTALL_DIR}/include/" - CACHE PATH "opencv include directory." FORCE) -set(OPENCV_LIB_DIR - "${OPENCV_INSTALL_DIR}/lib" - CACHE PATH "opencv lib directory." FORCE) -set(CMAKE_BUILD_RPATH "${CMAKE_BUILD_RPATH}" "${OPENCV_LIB_DIR}") - -if(WIN32) - message(FATAL_ERROR "NOT SUPPORT WINDOWS NOW, OPENCV") + set(OPENCV_LIB "opencv-win-x64-3.4.16") + set(COMPRESSED_SUFFIX ".zip") elseif(APPLE) if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64") - set(OPENCV_URL "https://bj.bcebos.com/paddle2onnx/libs/opencv-osx-arm64-3.4.16.tgz") + set(OPENCV_LIB "opencv-osx-arm64-3.4.16") else() - set(OPENCV_URL "https://bj.bcebos.com/paddle2onnx/libs/opencv-osx-x86_64-3.4.16.tgz") + set(OPENCV_LIB "opencv-osx-x86_64-3.4.16") endif() else() if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") - set(OPENCV_URL "https://bj.bcebos.com/paddle2onnx/libs/opencv-linux-aarch64-3.4.14.tgz") + set(OPENCV_LIB "opencv-linux-aarch64-3.4.14") else() - set(OPENCV_URL "https://bj.bcebos.com/paddle2onnx/libs/opencv-linux-x64-3.4.16.tgz") + set(OPENCV_LIB "opencv-linux-x64-3.4.16") endif() if(ENABLE_OPENCV_CUDA) if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") message(FATAL_ERROR "Cannot set ENABLE_OPENCV_CUDA=ON while in linux-aarch64 platform.") endif() - set(OPENCV_URL "https://bj.bcebos.com/paddle2onnx/libs/opencv-linux-x64-gpu-3.4.16.tgz") + set(OPENCV_LIB "opencv-linux-x64-gpu-3.4.16") endif() endif() -include_directories(${OPENCV_INC_DIR} -)# For OPENCV code to include internal headers. +set(OPENCV_URL ${OPENCV_URL_PREFIX}/${OPENCV_LIB}${COMPRESSED_SUFFIX}) +download_and_decompress(${OPENCV_URL} ${CMAKE_CURRENT_BINARY_DIR}/${OPENCV_LIB}${COMPRESSED_SUFFIX} ${THIRD_PARTY_PATH}/install/) -set(OPENCV_SOURCE_LIB ${OPENCV_SOURCE_DIR}/lib/) -if(WIN32) - message(FATAL_ERROR "NOT SUPPORT WEINDOWS, OPENCV") -elseif(APPLE) - set(OPENCV_CORE_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_core.dylib) - set(OPENCV_HIGHGUI_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_highgui.dylib) - set(OPENCV_IMGPROC_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_imgproc.dylib) - set(OPENCV_IMGCODESC_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_imgcodecs.dylib) -else() - set(OPENCV_SOURCE_LIB ${OPENCV_SOURCE_DIR}/lib64) - if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") - set(OPENCV_SOURCE_LIB ${OPENCV_SOURCE_DIR}/lib) - endif() - set(OPENCV_CORE_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_core.so) - set(OPENCV_HIGHGUI_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_highgui.so) - set(OPENCV_IMGPROC_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_imgproc.so) - set(OPENCV_IMGCODESC_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_imgcodecs.so) - set(OPENCV_CUDAARITHM_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_cudaarithm.so) - set(OPENCV_CUDAIMGPROC_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_cudaimgproc.so) - set(OPENCV_CUDAWARPING_LIB ${OPENCV_INSTALL_DIR}/lib/libopencv_cudawarping.so) +set(OpenCV_DIR ${THIRD_PARTY_PATH}/install/${OPENCV_LIB}/) +if (WIN32) + set(OpenCV_DIR ${OpenCV_DIR}/build/) endif() - -if(WIN32) - message(FATAL_ERROR "NOT SUPPORT WINDOWS, OPENCV") -else() - ExternalProject_Add( - ${OPENCV_PROJECT} - ${EXTERNAL_PROJECT_LOG_ARGS} - URL ${OPENCV_URL} - PREFIX ${OPENCV_PREFIX_DIR} - DOWNLOAD_NO_PROGRESS 1 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - UPDATE_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} -E remove_directory ${OPENCV_INSTALL_DIR} && - ${CMAKE_COMMAND} -E make_directory ${OPENCV_INSTALL_DIR} && - ${CMAKE_COMMAND} -E rename ${OPENCV_SOURCE_LIB} ${OPENCV_INSTALL_DIR}/lib && - ${CMAKE_COMMAND} -E copy_directory ${OPENCV_SOURCE_DIR}/include/ - ${OPENCV_INC_DIR} - BUILD_BYPRODUCTS ${OPENCV_LIB}) -endif() - -add_library(external_opencv_core STATIC IMPORTED GLOBAL) -set_property(TARGET external_opencv_core PROPERTY IMPORTED_LOCATION ${OPENCV_CORE_LIB}) -add_library(external_opencv_highgui STATIC IMPORTED GLOBAL) -set_property(TARGET external_opencv_highgui PROPERTY IMPORTED_LOCATION ${OPENCV_HIGHGUI_LIB}) -add_library(external_opencv_imgproc STATIC IMPORTED GLOBAL) -set_property(TARGET external_opencv_imgproc PROPERTY IMPORTED_LOCATION ${OPENCV_IMGPROC_LIB}) -add_library(external_opencv_imgcodesc STATIC IMPORTED GLOBAL) -set_property(TARGET external_opencv_imgcodesc PROPERTY IMPORTED_LOCATION ${OPENCV_IMGCODESC_LIB}) - -add_dependencies(external_opencv_core ${OPENCV_PROJECT}) -add_dependencies(external_opencv_highgui ${OPENCV_PROJECT}) -add_dependencies(external_opencv_imgproc ${OPENCV_PROJECT}) -add_dependencies(external_opencv_imgcodesc ${OPENCV_PROJECT}) - -list(APPEND DEPEND_LIBS external_opencv_core external_opencv_highgui external_opencv_imgproc external_opencv_imgcodesc) - -if(ENABLE_OPENCV_CUDA) - add_library(extern_opencv_cudawarping STATIC IMPORTED GLOBAL) - set_property(TARGET extern_opencv_cudawarping PROPERTY IMPORTED_LOCATION ${OPENCV_CUDAWARPING_LIB}) - add_dependencies(extern_opencv_cudawarping ${OPENCV_PROJECT}) - add_library(extern_opencv_cudaarithm STATIC IMPORTED GLOBAL) - set_property(TARGET extern_opencv_cudaarithm PROPERTY IMPORTED_LOCATION ${OPENCV_CUDAARITHM_LIB}) - add_dependencies(extern_opencv_cudaarithm ${OPENCV_PROJECT}) - add_library(extern_opencv_cudaimgproc STATIC IMPORTED GLOBAL) - set_property(TARGET extern_opencv_cudaimgproc PROPERTY IMPORTED_LOCATION ${OPENCV_CUDAIMGPROC_LIB}) - add_dependencies(extern_opencv_cudaimgproc ${OPENCV_PROJECT}) - list(APPEND DEPEND_LIBS extern_opencv_cudawarping extern_opencv_cudaarithm extern_opencv_cudaimgproc) -endif() -endif(WIN32) +find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR}) +include_directories(${OpenCV_INCLUDE_DIRS}) +list(APPEND DEPEND_LIBS ${OpenCV_LIBS}) diff --git a/python/fastdeploy/c_lib_wrap.py.in b/python/fastdeploy/c_lib_wrap.py.in index c4dfdde69..06a4357bf 100644 --- a/python/fastdeploy/c_lib_wrap.py.in +++ b/python/fastdeploy/c_lib_wrap.py.in @@ -16,6 +16,8 @@ import logging import os import sys +user_specified_dirs = ['@OPENCV_DIRECTORY@', ] + def is_built_with_gpu() -> bool: return True if "@WITH_GPU@" == "ON" else False @@ -143,11 +145,13 @@ if os.name == "nt": current_path = os.path.abspath(__file__) dirname = os.path.dirname(current_path) third_libs_dir = os.path.join(dirname, "libs") - add_dll_search_dir(third_libs_dir) - for root, dirs, filenames in os.walk(third_libs_dir): - for d in dirs: - if d == "lib" or d == "bin": - add_dll_search_dir(os.path.join(dirname, root, d)) + all_dirs = user_specified_dirs + [third_libs_dir] + for dir in all_dirs: + add_dll_search_dir(dir) + for root, dirs, filenames in os.walk(dir): + for d in dirs: + if d == "lib" or d == "bin": + add_dll_search_dir(os.path.join(dirname, root, d)) try: diff --git a/python/scripts/process_libraries.py b/python/scripts/process_libraries.py.in similarity index 76% rename from python/scripts/process_libraries.py rename to python/scripts/process_libraries.py.in index a21592c32..407a0b0af 100644 --- a/python/scripts/process_libraries.py +++ b/python/scripts/process_libraries.py.in @@ -18,6 +18,7 @@ import shutil import subprocess import platform +user_specified_dirs = ['@OPENCV_DIRECTORY@', ] def process_on_linux(current_dir): rpaths = ["$ORIGIN:$ORIGIN/libs"] @@ -31,13 +32,15 @@ def process_on_linux(current_dir): fd_libs.append(filename) third_libs_path = os.path.join(libs_path, "third_libs") - for root, dirs, files in os.walk(third_libs_path): - for d in dirs: - if d != "lib": - continue - rel_path = os.path.relpath(os.path.join(root, d), libs_path) - rpath = "$ORIGIN/" + rel_path - rpaths.append(rpath) + all_libs_paths = [third_libs_path] + user_specified_dirs + for path in all_libs_paths: + for root, dirs, files in os.walk(path): + for d in dirs: + if d not in ["lib", "lib64"]: + continue + rel_path = os.path.relpath(os.path.join(root, d), libs_path) + rpath = "$ORIGIN/" + rel_path + rpaths.append(rpath) for lib in fd_libs: command = "patchelf --set-rpath '{}' {}".format(":".join(rpaths), lib) @@ -66,18 +69,20 @@ def process_on_mac(current_dir): commands = list() third_libs_path = os.path.join(libs_path, "third_libs") - for root, dirs, files in os.walk(third_libs_path): - for d in dirs: - if d != "lib": - continue - rel_path = rel_path = os.path.relpath(os.path.join(root, d), libs_path) - rpath = "$loader_path/" + rel_path - for lib in fd_libs: - pre_commands.append( - "install_name_tool -delete_rpath '@loader_path/{}' {}".format( - rpath, lib)) - commands.append("install_name_tool -add_rpath 'loader_path/{}' {}". - format(rpath, lib)) + all_libs_paths = [third_libs_path] + user_specified_dirs + for path in all_libs_paths: + for root, dirs, files in os.walk(path): + for d in dirs: + if d not in ["lib", "lib64"]: + continue + rel_path = rel_path = os.path.relpath(os.path.join(root, d), libs_path) + rpath = "$loader_path/" + rel_path + for lib in fd_libs: + pre_commands.append( + "install_name_tool -delete_rpath '@loader_path/{}' {}".format( + rpath, lib)) + commands.append("install_name_tool -add_rpath 'loader_path/{}' {}". + format(rpath, lib)) for cmd in pre_commands: try: @@ -136,6 +141,7 @@ def process_libraries(current_dir): package_data.append( os.path.relpath(f, os.path.join(current_dir, "fastdeploy"))) + return package_data filters = [".vcxproj", ".png", ".java", ".h", ".cc", ".cpp", ".hpp"] @@ -145,7 +151,12 @@ def process_libraries(current_dir): if f.count(flt) > 0: remain = False filename = os.path.split(f)[-1] - if filename in ["libnvinfer_plugin.so", "libnvinfer_plugin.so.8.4.1", "libnvinfer.so", "libnvinfer.so.8.4.1", "libnvonnxparser.so", "libnvonnxparser.so.8.4.1", "libnvparsers.so", "libnvparsers.so.8.4.1"]: + if filename in [ + "libnvinfer_plugin.so", "libnvinfer_plugin.so.8.4.1", + "libnvinfer.so", "libnvinfer.so.8.4.1", "libnvonnxparser.so", + "libnvonnxparser.so.8.4.1", "libnvparsers.so", + "libnvparsers.so.8.4.1" + ]: continue if remain: package_data.append( diff --git a/python/setup.py b/python/setup.py index dac6fe58e..23a51e6e1 100644 --- a/python/setup.py +++ b/python/setup.py @@ -62,6 +62,7 @@ setup_configs["CUDA_DIRECTORY"] = os.getenv("CUDA_DIRECTORY", "/usr/local/cuda") setup_configs["LIBRARY_NAME"] = PACKAGE_NAME setup_configs["PY_LIBRARY_NAME"] = PACKAGE_NAME + "_main" +setup_configs["OPENCV_DIRECTORY"] = os.getenv("OPENCV_DIRECTORY", "") if setup_configs["WITH_GPU"] == "ON": wheel_name = "fastdeploy-gpu-python" @@ -327,8 +328,7 @@ ext_modules = [ # no need to do fancy stuff so far if PACKAGE_NAME != "fastdeploy": - packages = setuptools.find_packages( - exclude=['fastdeploy*', 'scripts']) + packages = setuptools.find_packages(exclude=['fastdeploy*', 'scripts']) else: packages = setuptools.find_packages(exclude=['scripts']) @@ -353,7 +353,8 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel": shutil.copy( os.path.join(TOP_DIR, "LICENSE"), os.path.join(TOP_DIR, PACKAGE_NAME)) if not os.path.exists( - os.path.join(TOP_DIR, "python", "fastdeploy", "libs", "third_libs")): + os.path.join(TOP_DIR, "python", "fastdeploy", "libs", + "third_libs")): print( "Didn't detect path: fastdeploy/libs/third_libs exist, please execute `python setup.py build` first" )