下载MNN仓库
- clone你需要的MNN版本,我这里需要的是2.9.0
Cmake编译
执行转换程序
./MNNConvert -f TF/ONNX/TFLITE --modelFile XXX.pb/XXX.onnx/XXX.tflite --MNNModel XXX.XX --bizCode XXX
// 例子
./MNNConvert -f ONNX --modelFile model.onnx --MNNModel model.mnn --bizCode MNN
./MNNConvert -f ONNX --modelFile model.onnx --MNNModel model.mnn --fp16 --bizCode MNN
构建armv82动态库
- 这个mnn动态库可以起到提速的作用,提速在20%到30%左右。可能会用到map和unmap,因为推理得到的fp16数据,很可能会出现nan,一般是数据预处理的结果需要map一下

- 那就开始编译这个库吧。直接在CmakeList.txt修改MNN_ARM82为ON是不可行的,必须在那个脚本文件里面进行增加条目修改,可以参考我的
#!/bin/bash
cmake ../../../ \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_STL=c++_static \
-DMNN_USE_LOGCAT=false \
-DMNN_BUILD_BENCHMARK=ON \
-DMNN_USE_SSE=OFF \
-DMNN_BUILD_TEST=ON \
-DMNN_ARM82=ON \
-DANDROID_NATIVE_API_LEVEL=android-21 \
-DMNN_BUILD_FOR_ANDROID_COMMAND=true \
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $*
make -j4
- map和unmap简单实用例子
auto input = interpreter->getSessionInput(session, NULL);
void* host = input->map(MNN::Tensor::MAP_TENSOR_WRITE, input->getDimensionType());
// 数据预处理,处理数据传入到host那块地址
input->unmap(MNN::Tensor::MAP_TENSOR_WRITE, input->getDimensionType(), host);
// mnn模型推理
//mnn后处理
// 对于拿到的output,可以使用copyToHostTensor,可以自动fp16到fp32的转换,也可以使用createHostTensorFromDevice。当然也可以使用map和unmap