NCNN源码编译及Android Demo跑通

前几天看到鹅厂放出了NCNN源码,去GITHUB上搞下来,一堆CMAKE的脚本和几段源码,还有一个CAFFEMODEL和几个不知名文件。README里是一堆吹牛逼的废话,对编译src、tools和example完全没有指导意义。看来要自己摸索了。

其实编译src里的东西不难,这里就写一下在Linux系统下的源码编译过程和Android Demo跑通过程。(Windows用户可以开启Linux子系统然后一块编译,其实我就是受人鄙视的Windows用户。)

需要编译的目标有4个(括号内为所需工具):

1. src源码(cmake make gcc g++)

2. Android/iOS所需的链接库(cmake make gcc g++ zip NDK)

3. example源码(gradle/ant NDK Android-SDK)

4. tools源码(protobuf ncnn)

如果没有protobuf,那么需要先去github上把Protobuf的源码给搞下来,然后根据Protobuf安装指南安装这个工具。

安装了protobuf以后上述工具基本上都已经齐备。

编译源码SRC

进入src目录,创建build目录,然后执行cmake,具体执行顺序如下

mkdir build

cd build

cmake ..

make

sudo make install

在build目录下就可以得到一个大小1.4M不到的libncnn.a静态库

此外,默认的SRC编译是不会把ncnn的完整属性打入包内的(少了一些方法),这时编译tools中的转换工具会出现错误。如果需要编译加入这些方法,在cmake中……不知道咋办,在cmake之后build目录中有platform.h文件,把其中

#define NCNN_STDIO 0

#define NCNN_STRING 0

#define NCNN_OPENCV 0

改为

#define NCNN_STDIO 1

#define NCNN_STRING 1

#define NCNN_OPENCV 1

即可

编译Android链接库

这部分比较简单,直接在ncnn的根目录执行

bash build.sh

bash package.sh

就行

在执行完一堆编译(编译过程中如果没有配置IOS专门的OC编译器,IOS库无法产出,不过没关系,咱们说的是Android Demo跑通嘛。)后会得到:build-android-aarch64 build-android-armv7两个文件夹

以及ncnn.framework.zip ncnn-android-lib.zip两个压缩包

我们只要把ncnn-android-lib.zip这个压缩包搞出来就行了

编译example源码

Example里的squeezencnn是一个Ant工程,这里以WIndows编译为例,Mac用户雷同(Linux可以直接下载ant编译工具,修改ant.properties然后编译):

直接备份导入到Android Studio中,升级为Gradle工程(AS会自动创建build.gradle等文件)

咱们采用原始方法加入NDK支持:

经过一系列等待,会告诉你NDK错误

在根目录下创建

gradle.properties

内容为

android.useDeprecatedNdk=true

修改根目录中的build.gradle里gradle的版本到一个比较新的版本

修改app/build.gradle的内容(AS会自动调整目录结构)

主要修改两项内容,增加两项内容:

修改

compileSdkVersion 9

compileSdkVersion 14或者更高

修改

buildToolsVersion XXX

buildToolsVersion '24.0.2'或更高

增加

sourceSets {

   main {

      jniLibs.srcDirs = ['libs']

   }

}

增加

dependencies {

   compile fileTree(dir: 'libs', include: ['*.so'])

}

然后进入app/src/main/jni

修改

Android.mk中

NCNN_INSTALL_PATH到你编译出的build-android-XXX目录的install目录下

修改Application.mk中

APP_ABI := all

APP_PLATFORM := android-14

然后在jni目录下直接执行

ndk-build

就会在上层目录得到一个libs文件夹,里面包含了所有编译输出的so库

我们把libs文件夹移动到app的目录下

然后直接gradle build install

跑起来,应该就没问题了。

这是一个图片分类的demo,启动后会发现无论什么图片都不能识别分类(显示一个神秘路径)

反查app\src\main目录下的asserts中放的squeezenet_v1.1.bin文件内容是一个路径,synset_words.txt也是所以我们要用原始example目录下

squeezenet_v1.1.bin

squeezenet_v1.1.param

以及

synset_words.txt

替换同名文件。

再次运行,就有结果了。。。虽然结果看起来不太理想,不过效果还不错。。。


NCNN源码编译及Android Demo跑通_第1张图片
运行效果

编译工具TOOLS

工具的编译也非常简单,去tools目录下直接创建build文件夹然后:

cd build

cmake ..

make

sudo make install

即可得到caffe2ncnn和ncnn2mem这两个工具,

caffe2ncnn接受2个、4个或者5个参数

依次是:

caffe的模型prototxt文件

caffe的模型caffemodel文件

输出的

ncnn模型bin文件名

ncnn模型的param文件名

以及量化深度

支持(0,256,65536)三种,默认是0(完全)

结尾

从执行的效果和代码的快速浏览来看,NCNN的目标在于轻量级的更注重CPU运算优化的方向(包括这两天的更新都是在针对不同的硬件架构进行代码优化),和TensorFlow on Android还是有一些差别的。感觉这个项目要成熟起来还有很长的路要走。

再增加一些其他平台的模型转换工具吧。

有空会写代码阅读理解报告的。。。

你可能感兴趣的:(NCNN源码编译及Android Demo跑通)