ncnn移植安卓踩坑日记

这几天一直在做ncnn移植安卓的相关编译,总算是搞定了。其间遇到了不少问题,都是些编译的小问题,但对我这个编译小白来说还是百度了好久,记录一下,希望能帮到有需要的同学~~

1.电脑编译及测试

首先,电脑版的编译官方文件上就有,https://github.com/Tencent/ncnn
大致就是下载文件,

cd ncnn-root
mkdir build
cd build
cmake ..
make
sudo make install

注意,如果想运行官方也就是example文件夹里的测试程序的话需要把cmakelist.txt里边的add_subdirectory(examples)行注释去掉再执行以上步骤(我并没有用那个)。

接下来是遇到的第一个问题,执行完以上步骤直接测试的时候会发现报错platform.h文件不存在,这是把/ncnn-root/build/install/inculde/platform.h复制到/ncnn-root/src/文件夹下就好。

然后大致说下测试,
首先是模型的转换,我用的是caffe模型,我们假设原网络模型为:net_deploy.prototxt 和 net_model.caffemodel
执行第一步,把caffe模型转换为新版caffe模型(因为ncnn只支持新模型):

/caffe-root/build/tools/upgrade_net_proto_binary  net_model.caffemodel new_model.caffemodel
/caffe-root/build/tools/upgrade_net_proto_text  net_deploy.prototxt new_deploy.prototxt

(转换完之后,如果你的deploy.prptotxt文件可输入测试图片数目不为1,需要改为1。如下所示,其中第一个dim需要为1)

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 224
      dim: 224  } }
  }

然后是caffe模型转换为ncnn模型:
/ncnn-root/build/tools/caffe/caffe2ncnn new_deploy.prototxt new_model.caffemodel ncnnnet.param ncnnnet.bin
执行完上述步骤会生成ncnnnet.paramncnnnet.bin两个文件,已经可以用于初步测试

ncnn::Net net;
net.load_param("ncnnnet.param");
net.load_model("ncnnnet.bin");

ncnn可以对模型加密:
/ncnn-root/build/tools/ncnn2mem ncnnnet.param ncnnnet.bin ncnnnet.id.h ncnnnet.mem.h
执行完此步骤会生成ncnnnet.id.h, ncnnnet.mem.h, ncnnnet.param.bin三个文件,使用为

net.load_param_bin("ncnnnet.param.bin");
net.load_model("ncnnnet.bin");

#include "ncnnnet.mem.h"
ncnn::Net net;
net.load_param(ncnnnet_param_bin);
net.load_model(ncnnnet_bin);

对于网络的后续使用,示例程序里都能找得到,就不详述。

2.安卓版的编译和使用

首先编译安卓静态库,下载的ncnn-root文件夹下有build.shpackage.sh两个脚本,里边有相应系统的脚本,选择自己需要的依次执行即可。我执行的是安卓版本,

#!/usr/bin/env bash

##### android armv7
mkdir -p build-android-armv7
pushd build-android-armv7
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=android-14 ..
make
make install
popd

##### android aarch64
mkdir -p build-android-aarch64
pushd build-android-aarch64
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-21 ..
make
make install
popd

NAME=ncnn
##### package android lib
ANDROIDPKGNAME=${NAME}-android-lib
rm -rf $ANDROIDPKGNAME
mkdir -p $ANDROIDPKGNAME
mkdir -p $ANDROIDPKGNAME/armeabi-v7a
mkdir -p $ANDROIDPKGNAME/arm64-v8a
mkdir -p $ANDROIDPKGNAME/include
cp build-android-armv7/install/lib/lib${NAME}.a $ANDROIDPKGNAME/armeabi-v7a/
cp build-android-aarch64/install/lib/lib${NAME}.a $ANDROIDPKGNAME/arm64-v8a/
cp build-android-aarch64/install/include/* $ANDROIDPKGNAME/include/
rm -f $ANDROIDPKGNAME.zip
zip -9 -r $ANDROIDPKGNAME.zip $ANDROIDPKGNAME

执行完会在ncnn-android-lib文件夹中找到打包好的include.a文件,用于后续使用。
其中在执行build.shcmake一行代码时如果遇到错误,可能是cmake版本或android ndk版本的问题,我使用的cmake3.13android-ndk-r16b

然后通过接口程序调用ncnn,编写android.mkapplication.mk,生成so动态库,方便手机端调用。
其中编动态库过程中,如果遇到undefined reference to '__kmpc_XXX_'类似的错误,则使用clang编译器编译(需要安装),即application.mk加上

#NDK_TOOLCHAIN_VERSION = 4.9
NDK_TOOLCHAIN_VERSION := clang

至此,ncnn移植安卓之旅完美结束。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值