环境
- cmake
brew install cmake
cmake --version
cmake version 3.23.1
- protobuf
brew install protobuf
protoc --version
libprotoc 3.19.4
- Android Studio 安装NDK CMake
Packages to install:
- CMake 3.18.1 (cmake;3.18.1)
- NDK (Side by side) 24.0.8215888 (ndk;24.0.8215888)
Preparing "Install CMake 3.18.1 (revision: 3.18.1)".
创建AndroidDemo项目
配置项目C++环境
编译MNN,并把产出文件导入到项目
Android NDK 配置
- 在app下的build.gradle中配置NDK的版本号即可
android {
ndkVersion "20.0.5594570"
}
错误集锦
cmake错误
- 此问题很简单,就是你的NDK环境变量配置的有问题,直接在~/.bash_profile文件中重新配置一下,即可
比如我的就是:export ANDROID_NDK=/Users/jiayuanfa/Library/Android/sdk/ndk/20.0.5594570
然后Save,然后source ~/.bash_profile 一下
编译
首先在Github下载MNN项目源码
编译MNN的Android动态库
- 在 developer.android.com/ndk/downloa…
- 在 .bashrc 或者 .bash_profile 中设置 NDK 环境变量,例如:export ANDROID_NDK=/Users/username/path/to/android-ndk-r14b
- cd /path/to/MNN
- ./schema/generate.sh
- cd project/android
- 编译armv7动态库:mkdir build_32 && cd build_32 && ../build_32.sh
- 编译armv8动态库:mkdir build_64 && cd build_64 && ../build_64.sh
- 以上的步骤配置NDK环境变量,需要注意,如果是Mac电脑,那么在Android Studio中配置过NDK以后,找到文件夹,然后在~/.bash_profile文件中配置一下路径即可,下面是Android Studio下载后的NDK路径
需要在32环境以及64环境编译出来11个so包,分别是
默认编译的话,只会输出libMNN.so和libMNN_Express.so包
所以我们要修改MNN项目下的CMakeLists.txt文件,使其具有输出11个so包的能力
backend options option(MNN_METAL "Enable Metal" OFF) option(MNN_OPENCL "Enable OpenCL" ON) option(MNN_OPENGL "Enable OpenGL" ON) option(MNN_VULKAN "Enable Vulkan" ON) option(MNN_ARM82 "Enable ARM82" ON) option(MNN_ONEDNN "Enable oneDNN" OFF) option(MNN_AVX512 "Enable AVX512" OFF) option(MNN_CUDA "Enable CUDA" OFF) option(MNN_TENSORRT "Enable TensorRT" OFF) option(MNN_COREML "Enable CoreML" OFF)
修改完毕之后,如果之前编译过,需要删掉编译的文件夹,重新编译
模型转换工具的编译
cd MNN/
./schema/generate.sh
mkdir build
cd build
cmake .. -DMNN_BUILD_CONVERTER=true && make -j4
- 以上命令走完,会得到模型转换工具MNNConvert
具体转换方法
- 首先需要下载其他机器学习的模型
- 然后使用上面模型进行转换
- bizCode为标记码,随便起个名字即可
Caffe -> MNN
./MNNConvert -f CAFFE --modelFile XXX.caffemodel --prototxt XXX.prototxt --MNNModel XXX.mnn --bizCode biz
TensorFlow -> MNN
./MNNConvert -f TF --modelFile XXX.pb --MNNModel XXX.mnn --bizCode biz
TensorFlow Lite -> MNN
./MNNConvert -f TFLITE --modelFile XXX.tflite --MNNModel XXX.mnn --bizCode biz
ONNX -> MNN
./MNNConvert -f ONNX --modelFile XXX.onnx --MNNModel XXX.mnn --bizCode biz
编译之后
使用Android Studio 创建NDK项目,如果不太懂NDK开发的相关知识,需要先学习一下
- 把生成的C++的头文件放在app/include/MNN/目录下,把生成的动态库文件放在app/src/main/jniLibs/目录下,在app/src/main/cpp/目录下编写JNI的C++代码,com.yeyupiaoling.mnnclassification.mnn包下放JNI的java代码和MNN的相关工具类,将转换的模型放在assets目录下
MNN工具
- 编写一个MNNHelper.java工具类,关于MNN的操作都在这里完成,如加载模型、预测
- 通过MNN模型路径加载模型
- 在加载模型的时候配置预测信息。如:是否使用CPU或者GPU
图像预处理的参数配置
- 图像的均值
dataConfig.mean - 标准差
dataConfig.normal - 图片的输入通道顺序
dataConfig.dest