本文介绍如何在安卓端利用caffe模型进行识别。caffe mobile库已经有环境搭建说明,但是自己搭建的时候还是遇到了点问题,于是就进行了下总结,减少踩坑。
1. caffe mobile库
https://github.com/solrex/caffe-mobile
2. Win7, 搭建caffe mobile环境,进行编译(仅安卓端)
1)环境配置(以下链接在 caffe mobile github工程里能直接连接)
- Git for Windows: A shell environment(MinGW64) to run the build.
- tdm64-gcc-5.1.0-2.exe: The GNU toolchain, remember to copy
/path/to/TDM-GCC-64/bin/mingw32-make.exe
to/path/to/TDM-GCC-64/bin/make.exe
. - cmake-3.8.2-win64-x64.msi: Cmake
2)编译
$ git clone --recursive https://github.com/solrex/caffe-mobile.git
$ export NDK_HOME=/path/to/your/ndk # C:/path/to/your/ndk on MinGW64 (/c/path/to/your/ndk not work for OpenBLAS)
$ ./tools/build_android.sh
注意, a. 用git下载,直接打包下载,包会不完整。(在想要下载的文件目录下,右击打开git bash键入命令)
b.export NDK的路径斜杠需要用右斜杠!
export NDK_HOME=D:/Android/android-ndk-r10
c.特特特别注意!!!编译前要修改【caffe-mobile\src\jni\caffe_jni.cpp】文件,将里面的Java_com_hiscene_zn_mycaffesample_CaffeMobile_setBlasThreadNum替换成调用native方法的类所在的包名。
JNIEXPORT void Java_com_example_something_MyClass_getMyString(JNIEnv * env, jobject obj) {
其中:com_example_something为 package名的分解,MyClass为调用该.so的class
3)编译结果
4. Android Studio 加载caffe mobile库
1)找到caffe mobile库文件。
编译好的caffe mobile已经把caffe封装好了,在.os文件里。
编译后的caffe mobile文件结构如下,我们需要的os文件在画红框的文件夹的lib目录里。
2)在安卓工程里加载caffe mobile 库。
法一: 将各目录(caffe-mobile\build_arm64-v8a\lib)下的os文件(libcaffe-jni.so)整理成如下,
【新建一个jniLibs文件夹,再新建armeabi等三个文件夹,复制入os文件】
然后直接将jniLibs文件夹复制到Android Studio工程里(也就是【D:\MyProject\MyCaffeSample\app\src\main】目录下)
法二:a. 直接将armeabi等三个文件夹复制到【D:\MyProject\MyCaffeSample\app\libs】目录里
b. 更改build.gradle文件夹,添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
更改后的build.gradle文件内如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.yangwenbo.caffesimple"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.0'
// Specifid for MNIST grayscale png file reading. You can remove it as you need.
//compile 'ar.com.hjg:pngj:2.0.1'
testCompile 'junit:junit:4.12'
}
至此,caffe mobile库加载入安卓工程里了。
参考:http://blog.csdn.net/wxz1179503422/article/details/74974421
5.产生caffe mobile需要调用的文件。
Android Studio调用caffe mobile需要三个文件:weight.caffemodel,test_image.jpg,net.protobin。
net.protobin生成需要caffe-mobile\tools\prototxt2bin.py文件,直接运行python文件就能生成。
tools/prototxt2bin.py net.prototxt
6. Android 使用caffe mobile库
1)在MainActivity.java类里需要加入:
// Used to load the 'caffe-jni' library on application startup.
static {
System.loadLibrary("caffe-jni");
}
这段代码就是调用caffe mobile库,其中 caffe-jni就是libcaffe-jni.so文件去除lib以及.so的剩下的字符串,作为库的名字。
2)CaffeMobile.java类,MainActivity.java类, activity_main.xml可以参照caffe-mobile\examples\android\CaffeSimple里的相应文件
3)在运行加载入caffe mobile库的安卓工程前,需要进行取消勾选NDK支持。
file ->settings->Plugins->取消勾选 Android NDK Support.
4)Android Studio连接真机
点击红框1,设置成红框2.
5)利用ADB将模型,测试图片加载入手机sdcard。
a.需要安装ADB,下载ADB文件后,解压即安装。
解压后得到除了红框里的其它四个文件,cmd.exe文件要从C:\Windows\System32拷贝到ADB目录里
b.打开cmd.exe键入
adb shell
得到如下,则adb安装成功。注意,此时需要手机连接到电脑,要不然会找不到device。
c.将caffe模型以及测试图片放入手机sdcard内。
$ adb push $CAFFE/examples/mnist/lenet_iter_10000.caffemodel \
/sdcard/weight.caffemodel
$ adb push $CAFFE_MOBILE/examples/ios/simple/CaffeSimple/data/net.protobin \
/sdcard/net.protobin
$ adb push $CAFFE_MOBILE/examples/ios/simple/CaffeSimple/data/test_image.jpg \
/sdcard/test_image.jpg
前一个路径为模型、图片等的路径【D:\MyProject\data\test_image.jpg】。
6. 运行安卓应用程序,得到结果。
注意,确保手机开启了开发者模式,以及赋予了相应权限。(手机设置里可以开启开发者模式,手机管家里可以赋予各种权限)