MMDeploy 为 android 平台提供交叉编译的构建方式.
MMDeploy converter 部分在 linux 平台上执行,SDK 部分在 android 平台上执行.
MMDeploy 的交叉编译分为两步:
-
在 linux 平台上构建 MMDeploy converter. 请根据 How to build linux 进行构建.
-
使用 android 工具链构建 MMDeploy SDK.
本文档仅提供在 linux 平台上使用 android 工具链进行交叉编译构建 MMDeploy SDK 的方法.
-
cmake
保证 cmake的版本 >= 3.14.0. 如果不是,可以参考以下命令安装 3.20.0 版本. 如要获取其他版本,请参考 这里
wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
-
ANDROID NDK 19+
保证 android ndk 的版本 >= 19.0. 如果不是,可以参考以下命令安装 r23b 版本. 如要获取其他版本,请参考 这里
wget https://dl.google.com/android/repository/android-ndk-r23b-linux.zip unzip android-ndk-r23b-linux.zip cd android-ndk-r23b export NDK_PATH=${PWD}
如果您只对模型转换感兴趣,那么可以跳过本章节.
名称 | 安装方式 |
---|---|
OpenCV (>=3.0) |
|
ncnn | ncnn 是支持 android 平台的高效神经网络推理计算框架 目前, MMDeploy 支持 ncnn 的 20220216 版本, 且必须使用 git clone 下载源码的方式安装
|
OpenJDK | 编译Java API之前需要先准备OpenJDK开发环境 请参考 Java API 编译 进行构建. |
编译选项 | 取值范围 | 缺省值 | 说明 |
---|---|---|---|
MMDEPLOY_BUILD_SDK | {ON, OFF} | OFF | MMDeploy SDK 编译开关 |
MMDEPLOY_BUILD_SDK_JAVA_API | {ON, OFF} | OFF | MMDeploy SDK Java API的编译开关 |
MMDEPLOY_BUILD_TEST | {ON, OFF} | OFF | MMDeploy SDK 的单元测试程序编译开关 |
MMDEPLOY_TARGET_DEVICES | {"cpu"} | cpu | 设置目标设备. 如果您想使用 ncnn 的 vulkan 加速功能, 您仍旧需要在这里填写 {"cpu"} 参数. 这是因为 vulkan 加速仅用于 ncnn 网络计算内部,推理过程的其他部分仍旧使用 cpu 计算. |
MMDEPLOY_TARGET_BACKENDS | {"ncnn"} | N/A | 设置推理后端. 默认情况下,SDK不设置任何后端, 因为它与应用场景高度相关. Android 端目前只支持ncnn一个后端 构建时,几乎每个后端,都需传入一些路径变量,用来查找依赖包. 1. ncnn: 表示 ncnn. 需要设置 ncnn_DIR .
|
MMDEPLOY_CODEBASES | {"mmcls", "mmdet", "mmseg", "mmedit", "mmocr", "all"} | N/A | 用来设置 SDK 后处理组件,加载 OpenMMLab 算法仓库的后处理功能. 已支持的算法仓库有'mmcls','mmdet','mmedit','mmseg'和'mmocr'. 如果选择多个codebase,中间使用分号隔开. 比如, 'mmcls', 'mmdet', 'mmedit', 'mmseg', 'mmocr'. 也可以通过 all 的方式, 加载所有codebase, 即 -DMMDEPLOY_CODEBASES=all. |
MMDEPLOY_SHARED_LIBS | {ON, OFF} | ON | MMDeploy SDK 的动态库的编译开关.设置 OFF 时, 编译静态库. 目前 android 端 SDK 仅支持静态库加载, 后续会进行对动态库加载的支持. |
下文展示构建SDK的样例,用 ncnn 作为推理引擎。
- cpu + ncnn
cd ${MMDEPLOY_DIR} mkdir -p build && cd build cmake .. \ -DMMDEPLOY_BUILD_SDK=ON \ -DMMDEPLOY_BUILD_SDK_JAVA_API=ON \ -DOpenCV_DIR=${OPENCV_ANDROID_SDK_DIR}/sdk/native/jni/abi-arm64-v8a \ -Dncnn_DIR=${NCNN_DIR}/build/install/lib/cmake/ncnn \ -DMMDEPLOY_TARGET_BACKENDS=ncnn \ -DMMDEPLOY_CODEBASES=all \ -DMMDEPLOY_SHARED_LIBS=OFF \ -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-30 \ -DANDROID_CPP_FEATURES="rtti exceptions" make -j$(nproc) && make install
cd ${MMDEPLOY_DIR}/build/install/example
mkdir -p build && cd build
cmake .. \
-DOpenCV_DIR=${OPENCV_ANDROID_SDK_DIR}/sdk/native/jni/abi-arm64-v8a \
-Dncnn_DIR=${NCNN_DIR}/build/install/lib/cmake/ncnn \
-DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-30
make -j$(nproc)