1、背景
前段时间在知乎上溜达,看到 @糖心他爸 大神的专栏-实战嵌入端的AI算法,进去一看,不得了,发现新大陆了,深度学习模型还能在安卓端这么玩的吗?
一般对我们这种初级炼丹师,要验证算法在端上的能力以及实测效果。一般是这样的, 如图1(至于你们是不是这样我是不知道),中间验证过程又臭又长,中间有些环节还得看别人有没有空(只怪自己水平差)。
那么看了大神的专栏,发现原来可以这么玩(嫌弃ing,说了半天还没告诉怎么玩)。
以mnist分类为例,先贴下大神的部分代码,详细代码看大神github。
int
看下来直接在android端就能用C++完成模型效果以及性能测试了,感觉就不用去求爷爷求爸爸了,开森啊(这里面的MNN是阿里的端上inference框架,感兴趣可以去GitHub上看看,MNN可以参考MNN文档,当然还有nihui大佬的NCNN ):
2、怎么玩
开森归开森,但是怎么玩呢?把大神的专栏翻了一遍,没看对应教程,大佬可能觉得这个so easy,大家都会,哭!!!
怎么办?看看大神代码好像有mk文件,查查mk文件干啥的呢?发现是安卓上类似makefile文件,那就查查如何用mk编译可执行文件吧,通过问问度娘以及谷歌爸爸,发现是可以实现的,那么大体方向是没错。
那么怎么编译?怎么把对应的文件传到android上?怎么在android上执行呢?(怒问自己,垃圾,你咋这么多不会呢!!!)
这个时候果断去抱安卓同学的大腿了!
大腿开始教我怎么玩啦!!!
2.1 ndk编译
这里先git clone 一下大神的github代码,前面opencv动态库,MNN动态库,mk文件大神都给你们弄好了,下下来改改或者直接用就行了。
再下载android的NDK(我是mac电脑,如果你们是其它系统,行不行我不知道,我只管挖不管埋)。
可以发现ndk下面有个ndk-build文件(安卓大腿说用着玩意编译)。
# 先设置环境
到这里基本编译结束了,那么怎么把它导到android端呢?
2.2 文件传输
下面这个得用adb工具,至于这玩意怎么安装,是什么玩意,自己百度。
搞了个rk3399,连上电脑。
# 先来条命令
adb devices
#运行结果如下,可以看到我下面有个设备了,设备号CBI9SLBNWK
List of devices attached
CBI9SLBNWK device
# 切换一下root权限
adb root
# 运行结果
”adbd is already running as root“
这样子我们待会进入adb shell就有root权限了,就可以为所欲为了。
正式push数据上去:
# 传输编译好的文件,我这边比较懒把整个目录都push上去
2.3 运行可执行文件
# 下面进入adb shell环境
adb shell
# 下面就跟我们在linux的操作差不多了
# 先查看我们上传的文件在不
ls /data
# 发现文件是在的
cd /data
cd /data/temp/MNN-APPLICATIONS/applications/mnist/onnx/libs/arm64-v8a
# 可以发现有个编译好的可执行文件 onnx_mnist
# 把 onnx_minist拷出来,拷到有图片的目录,这里可以不拷贝,只是跟cpp代码中模型文件跟测试文件相对路径保持一致就行
cp onnx_mnist ../../jni
cd ../../jni
# 看下大神的onnx_mnist.cpp文件,发现在该目录下需要mnist_test.jpg以及mnist.mnn两个文件
# 把该目录test.jpg文件名改成对应名字
mv test.jpg mnist_test.jpg
# 把graph中,MNN转换的mnist.mnn拷出来
cp ./graphs/minist.mnn ./
激动人心的时候到啦,终于可以运行了!(集齐七颗龙珠了,可以召唤神龙了)
./onnx_mnist
# 我去,出错啦
CANNOT LINK EXECUTABLE "./onnx_mnist": library "libMNN.so" not found
难道是编译目录不对?折腾了半天,把动态库移来移去,移到当前木来,看了mk文件,发现在对应的位置也有对应的动态库。
OpenCV_BASE
搞了半天没办法了,加上 @糖心他爸 大神微信,求大神指点。
大神直接贴了一行代码:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<对应动态库路径>
我去,原来没有指定对应动态库路径,,补上:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../libs/arm64-v8a
运行结果:
Invalide device for support vulkan
Invalide device for support vulkan
the result is 5
感动,终于有运行结果了!