Browse Source

raspberry add armv8 support

syyxsxx 5 năm trước cách đây
mục cha
commit
53fb2be99e

+ 1 - 2
deploy/cpp/cmake/yaml-cpp.cmake

@@ -4,8 +4,7 @@ message("${CMAKE_BUILD_TYPE}")
 
 ExternalProject_Add(
         ext-yaml-cpp
-        URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
-        URL_MD5 9542d6de397d1fbd649ed468cb5850e6
+	URL ${CMAKE_CURRENT_SOURCE_DIR}/deps/yaml-cpp.zip
         CMAKE_ARGS
         -DYAML_CPP_BUILD_TESTS=OFF
         -DYAML_CPP_BUILD_TOOLS=OFF

+ 8 - 0
deploy/cpp/scripts/bootstrap.sh

@@ -6,6 +6,14 @@ if [ ! -d "./paddlex-encryption" ]; then
     rm -rf paddlex-encryption.zip
 fi
 
+# install yaml
+YAML_URL=https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
+if [ ! -f "./deps/yaml-cpp.zip" ]; then
+    cd deps
+    wget -c ${YAML_URL}
+    cd ..
+fi
+
 # download pre-compiled opencv lib
 OPENCV_URL=https://bj.bcebos.com/paddleseg/deploy/opencv3.4.6gcc4.8ffmpeg.tar.gz2
 {

+ 1 - 2
deploy/openvino/CMakeLists.txt

@@ -9,7 +9,6 @@ SET(OPENVINO_DIR "" CACHE PATH "Location of libraries")
 SET(OPENCV_DIR "" CACHE PATH "Location of libraries")
 SET(GFLAGS_DIR "" CACHE PATH "Location of libraries")
 SET(NGRAPH_LIB "" CACHE PATH "Location of libraries")
-SET(ARCH "" CACHE PATH "Location of libraries")
 
 include(cmake/yaml-cpp.cmake)
 
@@ -96,7 +95,7 @@ if(WIN32)
     set(DEPS ${OPENVINO_DIR}/lib/intel64/Release/inference_engine${CMAKE_STATIC_LIBRARY_SUFFIX})
     set(DEPS ${DEPS} ${OPENVINO_DIR}/lib/intel64/Release/inference_engine_legacy${CMAKE_STATIC_LIBRARY_SUFFIX})
 else()
-    if (ARCH STREQUAL "armv7")
+    if (${ARCH} STREQUAL "armv7")
         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a")
         if(WITH_STATIC_LIB)
             set(DEPS ${OPENVINO_DIR}/lib/armv7l/libinference_engine${CMAKE_STATIC_LIBRARY_SUFFIX})

+ 1 - 2
deploy/openvino/cmake/yaml-cpp.cmake

@@ -5,8 +5,7 @@ message("${CMAKE_BUILD_TYPE}")
 
 ExternalProject_Add(
         ext-yaml-cpp
-        URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
-        URL_MD5 9542d6de397d1fbd649ed468cb5850e6
+        URL ${CMAKE_CURRENT_SOURCE_DIR}/deps/yaml-cpp.zip
         CMAKE_ARGS
         -DYAML_CPP_BUILD_TESTS=OFF
         -DYAML_CPP_BUILD_TOOLS=OFF

+ 10 - 1
deploy/openvino/scripts/install_third-party.sh

@@ -2,7 +2,7 @@
 if [ ! -d "./deps" ]; then
     mkdir deps
 fi
-if [ ! -d "./deps/gflag" ]; then
+if [ ! -d "./deps/gflags" ]; then
     cd deps
     git clone https://github.com/gflags/gflags
     cd gflags
@@ -12,6 +12,15 @@ if [ ! -d "./deps/gflag" ]; then
     cd ..
 fi
 
+# install yaml
+YAML_URL=https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
+if [ ! -f "./deps/yaml-cpp.zip" ]; then
+    cd deps
+    wget -c ${YAML_URL}
+    cd ..
+fi
+
+
 if [ "$ARCH" = "x86" ]; then
     OPENCV_URL=https://bj.bcebos.com/paddlex/deploy/x86opencv/opencv.tar.bz2
 else

+ 31 - 38
deploy/raspberry/CMakeLists.txt

@@ -4,11 +4,11 @@ project(PaddleX CXX C)
 
 option(WITH_STATIC_LIB "Compile demo with static/shared library, default use static."   OFF)
 
+
 SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
 SET(LITE_DIR "" CACHE PATH "Location of libraries")
 SET(OPENCV_DIR "" CACHE PATH "Location of libraries")
-SET(NGRAPH_LIB "" CACHE PATH "Location of libraries")
-
+SET(GFLAGS_DIR "" CACHE PATH "Location of libraries")
 
 include(cmake/yaml-cpp.cmake)
 
@@ -39,9 +39,13 @@ if (NOT DEFINED GFLAGS_DIR OR ${GFLAGS_DIR} STREQUAL "")
     message(FATAL_ERROR "please set GFLAGS_DIR with -DGFLAGS_DIR=/path/gflags")
 endif()
 
+if (NOT DEFINED ARCH OR ${ARCH} STREQUAL "")
+    message(FATAL_ERROR "please set ARCH with ARCH=armv7 or ARCH=armv8")
+endif()
 
-
-
+if (NOT DEFINED LITE OR ${LITE} STREQUAL "")
+    message(FATAL_ERROR "Please set LITE with LITE=light or LITE=full")
+endif()
 
 link_directories("${LITE_DIR}/lib")
 include_directories("${LITE_DIR}/include")
@@ -53,52 +57,41 @@ include_directories("${GFLAGS_DIR}/include")
 
 
 
-
-if (WIN32)
-  find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/build/ NO_DEFAULT_PATH)
-  unset(OpenCV_DIR CACHE)
-else ()
-	find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH)
-endif ()
-
+find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH)
 include_directories(${OpenCV_INCLUDE_DIRS})
 
-if (WIN32)
-    set(CMAKE_C_FLAGS_DEBUG   "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd")
-    set(CMAKE_C_FLAGS_RELEASE  "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT")
-    set(CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd")
-    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT")
-    if (WITH_STATIC_LIB)
-        safe_set_static_flag()
-        add_definitions(-DSTATIC_LIB)
-    endif()
-else()
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon-vfpv4 -g -o2 -fopenmp -std=c++11")
+if (${ARCH} STREQUAL "armv7")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4 -g -o2 -fopenmp -std=c++11")
+    set(CMAKE_STATIC_LIBRARY_PREFIX "")
+elseif(${ARC}H STREQUAL "armv8")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -march=armb8-a -g -o2 -fopenmp -std=c++11")
     set(CMAKE_STATIC_LIBRARY_PREFIX "")
+else()
+    message(FATAL_ERROR "Unknown arch abi ${ARCH}, only support armv8 and armv7")
 endif()
 
 
 if(WITH_STATIC_LIB)
+    if(${LITE} STREQUAL "full")
 	set(DEPS ${LITE_DIR}/lib/libpaddle_full_api_shared${CMAKE_STATIC_LIBRARY_SUFFIX})
+    elseif(${LITE} STREQUAL "light")
+	set(DEPS ${LITE_DIR}/lib/libpaddle_light_api_shared${CMAKE_STATIC_LIBRARY_SUFFIX})
+    else()
+	message(FATAL_ERROR "Unkown LITE release ${LITE}, only support light and full")
+    endif()
 else()
+    if(${LITE} STREQUAL "full")
 	set(DEPS ${LITE_DIR}/lib/libpaddle_full_api_shared${CMAKE_SHARED_LIBRARY_SUFFIX})
+    elseif(${LITE} STREQUAL "light")
+        set(DEPS ${LITE_DIR}/lib/libpaddle_light_api_shared${CMAKE_SHARED_LIBRARY_SUFFIX})
+    else()
+	message(FATAL_ERROR "Unkown LITE release ${LITE}, only support light and full")
+    endif()
 endif()
 
-if (NOT WIN32)
-    set(DEPS ${DEPS}
-        gflags yaml-cpp
-        )
-else()
-    set(DEPS ${DEPS}
-        gflags_static libprotobuf zlibstatic xxhash libyaml-cppmt)
-    set(DEPS ${DEPS} libcmt shlwapi)
-endif(NOT WIN32)
-
-
-if (NOT WIN32)
-    set(EXTERNAL_LIB "-ldl -lrt -lgomp -lz -lm -lpthread")
-    set(DEPS ${DEPS} ${EXTERNAL_LIB})
-endif()
+set(DEPS ${DEPS} gflags yaml-cpp)
+set(EXTERNAL_LIB "-ldl -lrt -lgomp -lz -lm -lpthread")
+set(DEPS ${DEPS} ${EXTERNAL_LIB})
 
 set(DEPS ${DEPS} ${OpenCV_LIBS})
 add_executable(classifier demo/classifier.cpp src/transforms.cpp src/paddlex.cpp)

+ 2 - 2
deploy/raspberry/cmake/yaml-cpp.cmake

@@ -2,11 +2,11 @@
 include(ExternalProject)
 
 message("${CMAKE_BUILD_TYPE}")
+message(${CMAKE_CURRENT_SOURCE_DIR})
 
 ExternalProject_Add(
         ext-yaml-cpp
-        URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
-        URL_MD5 9542d6de397d1fbd649ed468cb5850e6
+	URL ${CMAKE_CURRENT_SOURCE_DIR}/deps/yaml-cpp.zip
         CMAKE_ARGS
         -DYAML_CPP_BUILD_TESTS=OFF
         -DYAML_CPP_BUILD_TOOLS=OFF

+ 1 - 1
deploy/raspberry/include/paddlex/visualize.h

@@ -22,7 +22,7 @@
 #include <io.h>
 #else  // Linux/Unix
 #include <dirent.h>
-#include <sys/io.h>
+#include <sys/uio.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>

+ 12 - 4
deploy/raspberry/scripts/build.sh

@@ -1,13 +1,20 @@
 # Paddle-Lite预编译库的路径
-LITE_DIR=/path/to/Paddle-Lite/inference/lib
+LITE_DIR=/home/pi/wsy/Paddle-Lite/build.lite.armlinux.armv7hf.gcc/inference_lite_lib.armlinux.armv7hf/cxx
 
 # gflags预编译库的路径
 GFLAGS_DIR=$(pwd)/deps/gflags
 
 # opencv预编译库的路径, 如果使用自带预编译版本可不修改
 OPENCV_DIR=$(pwd)/deps/opencv
+
+# arm处理器架构,默认为armv7若CPU为armv8请修改为ARCH=armv8
+ARCH=armv7
+
+# 采用lite的版本,可选为full 与 light,默认为full版
+LITE=full
+
 # 下载自带预编译版本
-exec $(pwd)/scripts/install_third-party.sh
+bash $(pwd)/scripts/install_third-party.sh
 
 rm -rf build
 mkdir -p build
@@ -16,5 +23,6 @@ cmake .. \
     -DOPENCV_DIR=${OPENCV_DIR} \
     -DGFLAGS_DIR=${GFLAGS_DIR} \
     -DLITE_DIR=${LITE_DIR} \
-    -DCMAKE_CXX_FLAGS="-march=armv7-a"  
-make
+    -DARCH=${ARCH} \
+    -DLITE=${LITE}
+make -j4

+ 12 - 1
deploy/raspberry/scripts/install_third-party.sh

@@ -2,7 +2,8 @@
 if [ ! -d "./deps" ]; then
     mkdir deps
 fi
-if [ ! -d "./deps/gflag" ]; then
+
+if [ ! -d "./deps/gflags" ]; then
     cd deps
     git clone https://github.com/gflags/gflags
     cd gflags
@@ -11,6 +12,16 @@ if [ ! -d "./deps/gflag" ]; then
     cd ..
     cd ..
 fi
+
+# install yaml
+YAML_URL=https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
+if [ ! -f "./deps/yaml-cpp.zip" ]; then
+    cd deps
+    wget -c ${YAML_URL}
+    cd ..
+fi
+
+# install opencv
 OPENCV_URL=https://bj.bcebos.com/paddlex/deploy/armlinux/opencv.tar.bz2
 if [ ! -d "./deps/opencv" ]; then
     cd deps

+ 18 - 11
docs/deploy/raspberry/Raspberry.md

@@ -44,35 +44,41 @@ git clone https://github.com/PaddlePaddle/PaddleX.git
 **说明**:其中C++预测代码在PaddleX/deploy/raspberry 目录,该目录不依赖任何PaddleX下其他目录,如果需要在python下预测部署请参考[Python预测部署](./python.md)。  
 
 #### Step2:Paddle-Lite预编译库下载
-提供了下载的opt工具对应的Paddle-Lite在ArmLinux下面的预编译库:[Paddle-Lite(ArmLinux)预编译库](https://bj.bcebos.com/paddlex/deploy/lite/inference_lite_2.6.1_armlinux.tar.bz2)。  
-建议用户使用预编译库,若需要自行编译,在树莓派上LX终端输入
+提供了下载的opt工具对应2.6.1版本的Paddle-Lite在架构为armv7hf的ArmLinux下面的Full版本预编译库:[Paddle-Lite(ArmLinux)预编译库](https://bj.bcebos.com/paddlex/deploy/lite/inference_lite_2.6.1_armlinux.tar.bz2)  
+其他版本与arm架构的Paddle-Lite预测库请在官网[Releases](https://github.com/PaddlePaddle/Paddle-Lite/release)下载
+对于armv7hf架构的树莓派建议用户使用文档提供预编译库,对于架构为armv8的树莓派用户则需要自行编译,在树莓派上LX终端输入  
+
 ```
 git clone https://github.com/PaddlePaddle/Paddle-Lite.git
 cd Paddle-Lite
 sudo ./lite/tools/build.sh  --arm_os=armlinux --arm_abi=armv7hf --arm_lang=gcc  --build_extra=ON full_publish
-```  
-
-预编库位置:`./build.lite.armlinux.armv7hf.gcc/inference_lite_lib.armlinux.armv7hf/cxx`  
+```
+对于armv7hf的架构预编库位置:`./build.lite.armlinux.armv7hf.gcc/inference_lite_lib.armlinux.armv7hf/cxx`  
 
-**注意**:预测库版本需要跟opt版本一致,更多Paddle-Lite编译内容请参考[Paddle-Lite编译](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html);更多预编译Paddle-Lite预测库请参考[Paddle-Lite Release Note](https://github.com/PaddlePaddle/Paddle-Lite/releases)
+**注意**:预测库版本需要跟opt版本一致,检测与分割请使用Paddle-LITE的full版本预测库,更多Paddle-Lite编译内容请参考[Paddle-Lite编译](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html);更多预编译Paddle-Lite预测库请参考[Paddle-Lite Release Note](https://github.com/PaddlePaddle/Paddle-Lite/releases)
 
 #### Step3 软件依赖
-提供了依赖软件的预编包或者一键编译,用户不需要单独下载或编译第三方依赖软件。若需要自行编译第三方依赖软件请参考:
+提供了依赖软件的预编包或者一键编译,对于armv7树莓派用户不需要单独下载或编译第三方依赖软件,对于armv8树莓派用户需要自行编译opencv,编译第三方依赖软件请参考:
 
 - gflags:编译请参考 [编译文档](https://gflags.github.io/gflags/#download)  
 
 - opencv: 编译请参考
-[编译文档](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)
+[编译文档](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)  
+**注意**:对于armv8树莓派用户,需要自行编译opencv  
 
 #### Step4: 编译
 编译`cmake`的命令在`scripts/build.sh`中,修改LITE_DIR为Paddle-Lite预测库目录,若自行编译第三方依赖软件请根据Step1中编译软件的实际情况修改主要参数,其主要内容说明如下:
 ```
 # Paddle-Lite预编译库的路径
 LITE_DIR=/path/to/Paddle-Lite/inference/lib
-# gflags预编译库的路径
+# gflags预编译库的路径,若没有自行编译无需修改
 GFLAGS_DIR=$(pwd)/deps/gflags
-# opencv预编译库的路径
+# opencv预编译库的路径,若自行编译请指定到对应路径
 OPENCV_DIR=$(pwd)/deps/opencv/
+# arm处理器架构 armv7或者armv8
+ARCH=armv7
+# Lite预测库版本 light或者full
+LITE=full
 ```
 执行`build`脚本:
  ```shell
@@ -154,4 +160,5 @@ OPENCV_DIR=$(pwd)/deps/opencv/
 ## NCS2部署
 树莓派支持通过OpenVINO在NCS2上跑PaddleX模型预测,目前仅支持PaddleX的分类网络,基于NCS2的方式包含Paddle模型转OpenVINO IR以及部署IR在NCS2上进行预测两个步骤。
 - 模型转换请参考:[PaddleX模型转换为OpenVINO IR](../openvino/export_openvino_model.md),raspbian OS上的OpenVINO不支持模型转换,需要先在host侧转换FP16的IR。
-- 预测部署请参考[OpenVINO部署](../openvino/linux.md)中VPU在raspbian OS部署的部分
+- 预测部署请参考[OpenVINO部署](../openvino/linux.md)中VPU在raspbian OS部署的部分  
+- 目前仅支持armv7的树莓派