From b0a350d49e95055136bbef570fd5c635b935c59c Mon Sep 17 00:00:00 2001 From: lvhan028 Date: Thu, 10 Nov 2022 18:22:15 -0800 Subject: [PATCH] build opencv for aarch64 with videoio enabled (#1343) * build opencv for aarch64 with videoio enabled * update doc * update * update * update --- docs/zh_cn/01-how-to-build/rockchip.md | 82 ++++++++++++++++-------- tools/scripts/ubuntu_cross_build_rknn.sh | 80 ++++++++++++++--------- 2 files changed, 107 insertions(+), 55 deletions(-) diff --git a/docs/zh_cn/01-how-to-build/rockchip.md b/docs/zh_cn/01-how-to-build/rockchip.md index d2711ef99..111745c31 100644 --- a/docs/zh_cn/01-how-to-build/rockchip.md +++ b/docs/zh_cn/01-how-to-build/rockchip.md @@ -192,11 +192,7 @@ backend_config = dict( ### Host 交叉编译 -mmdeploy 提供 2 种交叉编译方式: - -1. 执行编译脚本(推荐) - -在 Ubuntu 主机上,执行如下命令: +若 host 是 Ubuntu 18.04 及以上版本,推荐脚本编译: ```shell bash tools/scripts/ubuntu_cross_build_rknn.sh @@ -204,7 +200,7 @@ bash tools/scripts/ubuntu_cross_build_rknn.sh 命令中的参数 model 表示瑞芯微芯片的型号,目前支持 rv1126,rk3588。 -2. 手动配置环境并编译 +以下是对脚本中编译过程的说明。 如下表所示,瑞芯微提供了 2 套 RKNN API 工具包,对应于不同的芯片型号。而每套 RKNN API 工具包又分别对应不同的 gcc 交叉编译工具。 @@ -215,27 +211,41 @@ bash tools/scripts/ubuntu_cross_build_rknn.sh 以支持的 rv1126 和 rk3588 为例,mmdeploy 在 ubuntu18.04 上的交叉编译过程如下: -- rv11126 +- **rv11126** -````shell -# 1. 下载 RKNN API 包 +1. 下载 RKNN API 包 + +```shell git clone https://github.com/rockchip-linux/rknpu export RKNPU_DIR=$(pwd)/rknpu +``` -# 2. 准备 gcc 交叉编译工具 +2. 准备 gcc 交叉编译工具 + +```shell sudo apt-get update -sudo apt-get install gcc-7-arm-linux-gnueabihf -sudo apt-get install g++-7-arm-linux-gnueabihf +sudo apt-get install gcc-arm-linux-gnueabihf +sudo apt-get install g++-arm-linux-gnueabihf +``` -# 3. 下载 OpenCV -## 在rknpu2中,有opencv-linux-armhf库。路径是 rknpu2/examples/3rdparty/opencv/opencv-linux-armhf -git clone https://github.com/rockchip-linux/rknpu2 -export RKNPU2_DIR=$(pwd)/rknpu2 +3. 源码安装 OpenCV + +```shell +git clone https://github.com/opencv/opencv --depth=1 --branch=4.6.0 --recursive +cd opencv +mkdir -p build_arm_gnueabi && cd build_arm_gnueabi +cmake .. -DCMAKE_INSTALL_PREFIX=install \ + -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \ + -DBUILD_PERF_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release +make -j $(nproc) && make install +export OpenCV_ARM_INSTALL_DIR=$(pwd)/install +``` + +4. 编译 mmdeploy SDK -# 3. 编译 mmdeploy SDK ```shell cd /path/to/mmdeploy -mkdir -p build && rm -rf build/CM* && cd build +mkdir -p build && cd build cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/arm-linux-gnueabihf.cmake \ -DMMDEPLOY_BUILD_SDK=ON \ @@ -243,25 +253,45 @@ cmake .. \ -DMMDEPLOY_BUILD_EXAMPLES=ON \ -DMMDEPLOY_TARGET_BACKENDS="rknn" \ -DRKNPU_DEVICE_DIR=${RKNPU_DIR}/rknn/rknn_api/librknn_api \ --DOpenCV_DIR=${RKNPU2_DIR}/examples/3rdparty/opencv/opencv-linux-armhf/share/OpenCV +-DOpenCV_DIR=${OpenCV_ARM_INSTALL_DIR}/lib/cmake/opencv4 make -j$(nproc) && make install -```` +``` -- rk3588 +- **rk3588** + +1. 下载 RKNN API 包 ```shell -# 1. 下载 RKNN API 包 git clone https://github.com/rockchip-linux/rknpu2 export RKNPU2_DEVICE_DIR=$(pwd)/rknpu2/runtime/RK3588 +``` -# 2. 准备 gcc 交叉编译工具 +2. 准备 gcc 交叉编译工具 + +```shell git clone https://github.com/Caesar-github/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu export RKNN_TOOL_CHAIN=$(pwd)/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu export LD_LIBRARY_PATH=$RKNN_TOOL_CHAIN/lib64:$LD_LIBRARY_PATH +``` -# 3. 编译 mmdeploy SDK +3. 下载 opencv 预编译包 + +```shell +git clone https://github.com/opencv/opencv --depth=1 --branch=4.6.0 --recursive +cd opencv +mkdir -p build_aarch64 && cd build_aarch64 +cmake .. -DCMAKE_INSTALL_PREFIX=install + -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \ + -DBUILD_PERF_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release +make -j $(nproc) && make install +export OpenCV_AARCH64_INSTALL_DIR=$(pwd)/install +``` + +4. 编译 mmdeploy SDK + +```shell cd /path/to/mmdeploy -mkdir -p build && rm -rf build/CM* && cd build +mkdir -p build && cd build export LD_LIBRARY_PATH=$RKNN_TOOL_CHAIN/lib64:$LD_LIBRARY_PATH cmake \ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/rknpu2-linux-gnu.cmake \ @@ -269,7 +299,7 @@ cmake \ -DMMDEPLOY_BUILD_SDK_CXX_API=ON \ -DMMDEPLOY_TARGET_BACKENDS="rknn" \ -DMMDEPLOY_BUILD_EXAMPLES=ON \ - -DOpenCV_DIR=${RKNPU2_DEVICE_DIR}/../../examples/3rdparty/opencv/opencv-linux-aarch64/share/OpenCV + -DOpenCV_DIR=${OpenCV_AARCH64_INSTALL_DIR}/lib/cmake/opencv4 make -j $(nproc) && make install ``` diff --git a/tools/scripts/ubuntu_cross_build_rknn.sh b/tools/scripts/ubuntu_cross_build_rknn.sh index e3ed7bf4e..59ba252ed 100644 --- a/tools/scripts/ubuntu_cross_build_rknn.sh +++ b/tools/scripts/ubuntu_cross_build_rknn.sh @@ -19,10 +19,10 @@ install_rknpu_toolchain() { echo "ubuntu 18.04 is minimum requirement, but got $ubuntu_version" wget wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz tar -xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz - ln -sf $(pwd)/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc - ln -sf $(pwd)/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++ + sudo ln -sf $(pwd)/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc + sudo ln -sf $(pwd)/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++ else - sudo apt install -y gcc-7-arm-linux-gnueabihf g++-7-arm-linux-gnueabihf + sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf fi arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-g++ --version @@ -40,22 +40,44 @@ install_rknpu_toolchain() { } install_rknpu2_toolchain() { + sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu + aarch64-linux-gnu-g++ --version + aarch64-linux-gnu-gcc --version git clone https://github.com/Caesar-github/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu.git git clone https://github.com/rockchip-linux/rknpu2.git export RKNN_TOOL_CHAIN=$(pwd)/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu + export LD_LIBRARY_PATH=$RKNN_TOOL_CHAIN/lib64:$LD_LIBRARY_PATH export RKNPU2_DIR=$(pwd)/rknpu2 } -build_ocv() { +build_ocv_arm_gnueabi() { if [ ! -e "opencv" ];then git clone https://github.com/opencv/opencv --depth=1 --branch=4.6.0 --recursive fi - if [ ! -e "opencv/build_rknpu" ];then - mkdir -p opencv/build_rknpu + if [ ! -e "opencv/build_arm_gnueabi" ];then + mkdir -p opencv/build_arm_gnueabi fi - cd opencv/build_rknpu + cd opencv/build_arm_gnueabi rm -rf CMakeCache.txt - cmake .. -DCMAKE_INSTALL_PREFIX=$(pwd)/install -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \ + cmake .. -DCMAKE_INSTALL_PREFIX=install -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \ + -DBUILD_PERF_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release + good_nproc + jobs=$? + make -j${jobs} && make install + export OPENCV_PACKAGE_DIR=$(pwd)/install/lib/cmake/opencv4 + cd - +} + +build_ocv_aarch64() { + if [ ! -e "opencv" ];then + git clone https://github.com/opencv/opencv --depth=1 --branch=4.6.0 --recursive + fi + if [ ! -e "opencv/build_aarch64" ];then + mkdir -p opencv/build_aarch64 + fi + cd opencv/build_aarch64 + rm -rf CMakeCache.txt + cmake .. -DCMAKE_INSTALL_PREFIX=install -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \ -DBUILD_PERF_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release good_nproc jobs=$? @@ -82,12 +104,10 @@ build_mmdeploy_with_rknpu() { -DMMDEPLOY_TARGET_BACKENDS="rknn" \ -DRKNPU_DEVICE_DIR="${RKNPU_DIR}"/rknn/rknn_api/librknn_api \ -DOpenCV_DIR="${OPENCV_PACKAGE_DIR}" - make -j$(nproc) && make install good_nproc jobs=$? - make -j${jobs} - make install + make -j${jobs} && make install ls -lah install/bin/* } @@ -98,26 +118,24 @@ build_mmdeploy_with_rknpu2() { device_model=$1 if [ ! -e "build_rknpu2" ];then mkdir build_rknpu2 - fi - cd build_rknpu2 + fi + cd build_rknpu2 - rm -rf CMakeCache.txt - cmake .. \ - -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/rknpu2-linux-gnu.cmake \ - -DMMDEPLOY_BUILD_SDK=ON \ - -DMMDEPLOY_BUILD_SDK_CXX_API=ON \ - -DMMDEPLOY_BUILD_EXAMPLES=ON \ - -DMMDEPLOY_TARGET_BACKENDS="rknn" \ - -DRKNPU2_DEVICE_DIR="${RKNPU2_DIR}/runtime/${device_model}" \ - -DOpenCV_DIR="${RKNPU2_DIR}"/examples/3rdparty/opencv/opencv-linux-aarch64/share/OpenCV - make -j$(nproc) && make install + rm -rf CMakeCache.txt + cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/rknpu2-linux-gnu.cmake \ + -DMMDEPLOY_BUILD_SDK=ON \ + -DMMDEPLOY_BUILD_SDK_CXX_API=ON \ + -DMMDEPLOY_BUILD_EXAMPLES=ON \ + -DMMDEPLOY_TARGET_BACKENDS="rknn" \ + -DRKNPU2_DEVICE_DIR="${RKNPU2_DIR}/runtime/${device_model}" \ + -DOpenCV_DIR="${OPENCV_PACKAGE_DIR}" - good_nproc - jobs=$? - make -j${jobs} - make install + good_nproc + jobs=$? + make -j${jobs} && make install - ls -lah install/bin/* + ls -lah install/bin/* } print_success() { @@ -126,6 +144,8 @@ print_success() { echo "----------------------------------------------------------------------" } +echo "the current workspace: $(pwd)" + if [ ! -e "../mmdeploy-dep" ];then mkdir ../mmdeploy-dep fi @@ -135,17 +155,19 @@ device_model=$(echo "$1" | tr [:lower:] [:upper:]) case "$device_model" in RK1808|RK1806|RV1109|RV1126) install_rknpu_toolchain - build_ocv + build_ocv_arm_gnueabi cd ../mmdeploy build_mmdeploy_with_rknpu ;; RK3566|RK3568) install_rknpu2_toolchain + build_ocv_aarch64 cd ../mmdeploy build_mmdeploy_with_rknpu2 "RK356X" ;; RK3588|RV1106) install_rknpu2_toolchain + build_ocv_aarch64 cd ../mmdeploy build_mmdeploy_with_rknpu2 "$device_model" ;;