前言
MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。
下面介绍在 Ubuntu20.04 环境下编译 MNN 的过程。
编译环境准备
- gcc(建议使用 4.9 或以上版本)
- cmake(建议使用 3.10 或以上版本)
- protobuf(建议使用 3.0 或以上版本)
1. gcc 安装
sudo apt update
sudo apt install build-essential
2. cmake 安装
- 从官网下载 cmake 的 linux 版本
- 在 cmake 源码所在文件夹打开命令终端,解压文件
tar -zxv -f cmake-3.24.1.tar.gz
- 进入解压后的文件夹执行
./bootstrap
可能会报错
需要安装 libssl-dev
sudo apt-get install libssl-dev
安装完成以后,再次执行 ./bootstrap
- 编译构建 cmake
make
- 安装 cmake
sudo make install
- 安装完成后可以执行 cmake --version 验证是否安装成功、
3. protobuf 安装
- 安装依赖
sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y
- 下载 protobuf 源码并解压
tar -zxv -f protobuf-cpp-3.20.0-rc-1.tar.gz
- 进入解压后的文件夹,生成配置文件
cd protobuf-3.20.0-rc-1/
./autogen.sh
- 配置环境
./configure
- 编译源码
make
- 安装
sudo make install
- 刷新动态库
sudo ldconfig
- 可以通过 protobuf --version 查看是否安装成功
Linux 本地编译 MNN
- 下载 MNN 源码并解压
unzip MNN-master.zip
- 进入解压后的文件夹执行
cd MNN-master
./schema/generate.sh
- 本地编译
mkdir build
cd build
cmake ..
make -j8
- 编译完成后本地出现 MNN 的动态库
Android 编译 MNN
1. Linux 命令行方式
- 在 https://developer.android.com/ndk/downloads/ 下载安装 NDK,建议使用最新版本
- 在 .bashrc 或者 .bash_profile 中设置 NDK 环境变量,如
export ANDROID_NDK=/home/wkx/Downloads/android-ndk-r25
- 进入 MNN 文件夹执行
cd /path/to/MNN-master
# 可选,更改 schema 文件后需要重新生成
./schema/generate.sh
# 可选,模型仅 demo 工程需要
./tools/script/get_model.sh
- 进入 android 文件夹编译动态库
cd project/android
# 编译 armv7 动态库
mkdir build_32
cd build_32
../build_32.sh
# 编译armv8动态库
mkdir build_64
cd build_64
../build_64.sh
下图为 armv8 动态库
2. Android Studio 方式
- 使用 Android Studio 打开 MNN-master/project/android/demo ,然后编译 apk
- 用 zip 解压编译好的 apk ,lib 目录下包含 MNN 的动态库
下图为编译好的 apk
用 zip 解压,进入 lib 目录
arm64-v8a 目录下的动态库
MNN 模型转换
- 进入 MNN 目录,执行
cd MNN-master
./schema/generate.sh
mkdir build
cd build
cmake .. -DMNN_BUILD_CONVERTER=true && make -j4
下图为得到的模型转换工具
- 将其它模型转换为 MNN 模型,例如将 model-mobilenet.pb 模型转换为 abc.mnn 模型
./MNNConvert -f TF --modelFile model-mobilenet.pb --MNNModel abc.mnn --bizCode biz
转换成功
转换前的模型和转换后得到的 MNN 模型