前几天看到鹅厂放出了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
替换同名文件。
再次运行,就有结果了。。。虽然结果看起来不太理想,不过效果还不错。。。
编译工具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还是有一些差别的。感觉这个项目要成熟起来还有很长的路要走。
再增加一些其他平台的模型转换工具吧。
有空会写代码阅读理解报告的。。。