C++推理onnx模子并部署于Android(包含Opencv,onnxruntime的交叉编译) ...

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

目录
一、Opencv的ubuntu编译
二、onnxruntime的ubuntu编译
三、在Ubuntu上编译写好的步伐
四、交叉编译安卓版本Opencv
五、交叉编译安卓版本onnxruntime
六、工程CMakeLists.txt
参考链接

一、Opencv的ubuntu编译

       参考:Ubuntu18.04安装Opencv4.5(最新最详细)_ubuntu安装opencv4.5-CSDN博客
        起首下载Opencv源代码:Releases - OpenCV,我这里下载的是4.5.4版本,在ubuntu体系中解压。
        安装环境依赖:
  1. sudo apt-get install build-essential
  2. sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
复制代码
        创建build文件夹并进入,然后cmake编译:
  1. mkdir build
  2. cd ./build
  3. cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D  OPENCV_ENABLE_NONFREE=True ..
复制代码
        cmake结束之后举行make编译然后安装:
  1. make -j8 # 建议ubuntu线程多的可以分配多一点,编译要很久
  2. sudo make install
复制代码
二、onnxruntime的ubuntu编译

        起首在GitHub中下载源码,这里我下载的是1.18.0版本Release ONNX Runtime v1.18.0 · microsoft/onnxruntime · GitHub
        查抄有没有安装依赖项,先安装build-essential:
  1. sudo apt-get install build-essential
复制代码
        然后解压代码进入到目录中举行编译:
  1. cd onnxruntime-1.18.0/
  2. ./build.sh --config Release --build_shared_lib --parallel #进行编译
复制代码
        一般来说都可以正常编译,但不知道为什么我会出现这种错误:

        然后我初始化git再举行编译,然后安装。
  1. git init
  2. ./build.sh --config Release --build_shared_lib --parallel
  3. sudo make install
复制代码
三、在Ubuntu上编译写好的步伐

        编译好本地的Opencv和onnxruntime后,我们得先编译本地的步伐测试是否能够正常运行,否则反面交叉编译堕落也不知道问题在哪,起首写好CMakeLists.txt文件生存。
  1. cmake_minimum_required(VERSION 3.10)
  2. project(InferenceDecoder)
  3. # 设置 C++ 标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED True)
  6. # 查找 OpenCV 库
  7. find_package(OpenCV REQUIRED)
  8. # 设置 ONNX Runtime 的路径
  9. set(ONNX_RUNTIME_DIR /home/liao/onnxruntime-1.18.0)
  10. # 添加 ONNX Runtime 包含目录
  11. include_directories(${ONNX_RUNTIME_DIR}/include)
  12. include_directories(${ONNX_RUNTIME_DIR}/include/onnxruntime/core/session)
  13. # 添加 ONNX Runtime 库目录
  14. link_directories(${ONNX_RUNTIME_DIR}/lib)
  15. # 添加头文件目录
  16. include_directories(${CMAKE_SOURCE_DIR}/include)
  17. # 定义可执行文件
  18. add_executable(${PROJECT_NAME} ./src/decode.cpp ./src/rans_interface.cpp)
  19. # 链接 OpenCV 库
  20. target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
  21. # 链接 ONNX Runtime 库
  22. target_link_libraries(${PROJECT_NAME} onnxruntime)
复制代码
        项目编译后能够正常运行。 
  1. mkdir build
  2. cd build
  3. cmake ..
  4. make
复制代码
四、交叉编译安卓版本Opencv

        把下载的opencv再解压一份,我这里生存为opencv4.5.4-Android_arm64-v8a,这里编译的是arm64-v8a版本。在这之前先安装安卓ndk,可以参考:安卓交叉编译Python-CSDN博客。
  1. mkdir build
  2. cd ./build
复制代码
        然后利用安卓编译链举行cmake:
-DCMAKE_TOOLCHAIN_FILE和-DCMAKE_ANDROID_NDK记得修改为自己的所在
-DANDROID_NATIVE_API_LEVEL:设置安卓版本,24对应安卓7.0
-DANDROID_ABI:设置平台架构,这里是arm64-v8a,根据需要可以换成armeabi-v7a,x86_64,x64
-DANDROID_STL=c++_shared 和-DBUILD_SHARED_LIBS=ON :用于天生动态库
-DCMAKE_INSTALL_PREFIX:设置安装所在
  1. cmake -DCMAKE_TOOLCHAIN_FILE=/home/liao/android-ndk-r26d/build/cmake/android.toolchain.cmake \
  2. -DCMAKE_ANDROID_NDK=/home/liao/android-ndk-r26d \
  3. -DANDROID_NATIVE_API_LEVEL=24 \
  4. -DBUILD_ANDROID_PROJECTS=OFF \
  5. -DBUILD_ANDROID_EXAMPLES=OFF \
  6. -DCMAKE_BUILD_TYPE=Release  \
  7. -DBUILD_JAVA=OFF  \
  8. -DANDROID_ABI=arm64-v8a \
  9. -DANDROID_STL=c++_shared \
  10. -DBUILD_SHARED_LIBS=ON \
  11. -DCMAKE_INSTALL_PREFIX=/home/liao/opencv-4.5.4-Android_arm64-v8a/install ..
复制代码
        然后make举行漫长的编译安装:
  1. make -j8
  2. make install
复制代码
        编译完成后so库就位于:/home/liao/opencv-4.5.4-Android_arm64-v8a/install/sdk/native/libs/arm64-v8a。通过file指令查看so库可以看到是ARM aarch64架构,分析编译成功了。
五、交叉编译安卓版本onnxruntime

        交叉编译onnxruntime还需要下载Android SDK:AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载

         下载好后直接在ubuntu解压即可,无需安装。把下载的onnxruntime再解压一份,我这里生存为onnxruntime1.18.0-Android_arm64-v8a,这里编译的是arm64-v8a版本。
        举行编译:
  1. ./build.sh --android --android_sdk_path /home/liao/android-sdk-linux --android_ndk_path /home/liao/android-ndk-r26d --android_abi arm64-v8a --android_api 24 --use_nnapi --parallel --build_shared_lib --config MinSizeRel
复制代码
参数介绍:
–android表现build android版
android_sdk_path:下载的SDK文件夹
android_ndk_path:下载的NDK文件夹
android_abi:安卓架构
android_api:安卓版本
parallel: 并行编译
build_shared_lib: 利用就是编译动态库,不利用就是静态库
config: 有4种选项[“Debug”, “MinSizeRel”, “Release”, “RelWithDebInfo”],MinSizeRel可以用于优化目标文件的巨细,,都可以正常利用。
        编译完后会在onnxruntime-1.18.0-Android_arm64-v8a/build/Android/MinSizeRel天生libonnxruntime.so。
六、工程CMakeLists.txt

        我们在工程根目录下创建lib文件夹,用于存放需要用到的opencv和onnxruntime的so库,然后写CMakeLists.txt,以我的工程为例:
  1. cmake_minimum_required(VERSION 3.10)
  2. project(InferenceEncoder_arm64-v8a)
  3. # 设置 C++ 标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED True)
  6. # 设置OpenCV路径
  7. set(OPENCV_DIR /home/liao/opencv-4.5.4-Android_arm64-v8a/install/sdk/native)
  8. # 设置ONNX Runtime路径
  9. set(ONNX_RUNTIME_DIR /home/liao/onnxruntime-1.18.0-Android_arm64-v8a)
  10. # 添加ONNXRuntime目录
  11. include_directories(${ONNX_RUNTIME_DIR}/include)
  12. include_directories(${ONNX_RUNTIME_DIR}/include/onnxruntime/core/session)
  13. # 添加opencv目录
  14. include_directories(${OPENCV_DIR}/jni/include)
  15. # 添加 ONNXRuntime opencv 库目录
  16. link_directories(${CMAKE_SOURCE_DIR}/lib)
  17. # 添加项目的头文件目录
  18. include_directories(${CMAKE_SOURCE_DIR}/include)
  19. # 定义可执行文件
  20. add_executable(${PROJECT_NAME} ./src/encode.cpp ./src/rans.cpp)
  21. # 链接库
  22. target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/lib/libonnxruntime.so
  23.                                       ${CMAKE_SOURCE_DIR}/lib/libopencv_core.so
  24.                                       ${CMAKE_SOURCE_DIR}/lib/libopencv_dnn.so
  25.                                       ${CMAKE_SOURCE_DIR}/lib/libopencv_imgcodecs.so
  26.                                       ${CMAKE_SOURCE_DIR}/lib/libopencv_imgproc.so)
复制代码
        这里各人看自己代码需要用到opencv哪些so库就把它复制到lib里面即可。写完之后举行交叉编译:
  1. mkdir build
  2. cd build
  3. cmake -DCMAKE_TOOLCHAIN_FILE=/home/liao/android-ndk-r26d/build/cmake/android.toolchain.cmake \
  4. -DCMAKE_ANDROID_NDK=/home/liao/android-ndk-r26d \
  5. -DANDROID_NATIVE_API_LEVEL=24 \
  6. -DANDROID_ABI=arm64-v8a \
  7. ..
  8. make
复制代码
        编译完成之后就可以在build目录下看到天生的.o文件,通过file指令查看是ARM aarch64架构,分析编译成功了。这里可以根据自己需要再去编译armeabi-v7a,x86-64等架构,只需要改变对应cmake指令中的架构选项。
        完结撒花❀❀

参考链接

在linux上用cmake交叉编译opencv到android手机上用 - 简书 (jianshu.com)
onnxruntime android版build & 利用_onnx android-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表