正式开始之前插播一条硬广:
字节跳动2020届校园招聘已经正式开启,涉及研发、产品、设计、市场、销售、职能/支持、运营七大类,工作地点分布北京、上海、深圳、成都、厦门、南京、杭州、武汉、广州等热门城市,要求很简单,只要你是2020年毕业的高校学生,都可以积极参与,直接到到官网:https://job.bytedance.com/campus/position 查找自己感兴趣的职位,投递简历并填写专属内推码:GCHFTGZ 即可成功申请并享受优先处理福利。PS:1. 投递简历时填写内推码可以享受简历优先筛选、优先安排面试等一系列福利,而且根据每年的招聘经验,越早投递简历的同学拿到offer的概率越大哦~快快投起来简历吧~2. 社招以及日常实习生也一直有岗位哦,具体岗位见:https://job.bytedance.com/campus/position,内推码同样可用哦
写在前面
随着深度学习和移动互联网的不断发展,如何将深度学习和移动应用紧密结合起来成为了一个热门的研究话题,nncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。
关于ncnn有两篇文章(一篇介绍pc端使用,一篇介绍android端使用),会详细介绍ncnn从源码编译到最终在Android端的应用流程,第一篇一文带你入门腾讯出品的史上最快移动端深度学习框架ncnn主要介绍了如何基于ncnn在pc端编写相关代码,本文是ncnn系列的第二篇文章,主要介绍如何在Android上基于ncnn进行深度学习模型的部署,本文目录如下:
![4fcfe2821648e923cde6d76cb2ba41bb.png](https://i-blog.csdnimg.cn/blog_migrate/8690ab991b11687aa2cb33bd6a6d9e8c.jpeg)
环境说明
系统:Ubuntu16.04
软件:Android Studio
前期准备之ndk安装
在正式开始前我们需要先下载安装ndk,这里介绍一种简单高效的方式,打开Android Studio,然后依次点击File->Settings->Appearance&Behavior->System Settings->Android SDK,然后在SDK Tools下找到ndk,然后选中,点击apply就可以自动下载安装了,如图:
![e36fea048a5447bcd4bc373e99f8f351.png](https://i-blog.csdnimg.cn/blog_migrate/f1ea44a364235f0d1a3969d184025c74.jpeg)
完成之后在你的sdk目录下会多出一个ndk-bundle的包,这就是你ndk的路径,类似下图:
![a7a91e87edf36a1030bce3692d6b4694.png](https://i-blog.csdnimg.cn/blog_migrate/0fd5362a00d9320c224fb8f6c7116b51.jpeg)
至此,ndk已经安装完毕了,下一步是配置ndk的环境变量:
首先打开profile:sudo vim /etc/profile
打开后在profile文件的末尾加上:
export NDK_HOME=sdkroot/ndk-bundlePATH=$NDK_HOME:$PATH
sdkroot是你的sdk目录,每个人的不一样,视情况而定,下面是我的配置截图:
![0fe47cce3cb2077ea0571d8c3b7eaa6f.png](https://i-blog.csdnimg.cn/blog_migrate/0f5e00dce48ee14ed9a7bb652c10d812.jpeg)
添加完成后保存退出,使用以下命令使配置的环境变量生效:
source /etc/profile
验证ndk是否配置成功:
ndk-build -v
出现类似以下输出即说明ndk配置成功:
![e298f2d72a003c320d61587028ee3c79.png](https://i-blog.csdnimg.cn/blog_migrate/0fb3a310781991f4299367e98451a15c.jpeg)
编译ncnn sdk
我们需要将ncnn打包,这样我们才能在android ndk的代码中使用include将ncnn的相关库依赖进来:
mkdir build-androidcd build-androidcmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=android-14 ..makemake install
参数说明:
ANDROID_ABI 是架构名字,"armeabi-v7a" 支持绝大部分手机硬件ANDROID_ARM_NEON 是否使用 NEON 指令集,设为 ON 支持绝大部分手机硬件ANDROID_PLATFORM 指定最低系统版本,"android-14" 就是 android-4.0
你可以根据自己的需要设置自己的参数,具体的可以参考ncnn的官方介绍:https://github.com/Tencent/ncnn/wiki/cmake-%E6%89%93%E5%8C%85-android-sdk
完成后你就可以在ncnn/build-android下找到install了,大概如图:
![325af30683f9d8eb27d5cdf2875c24c2.png](https://i-blog.csdnimg.cn/blog_migrate/6a3583b7e361c8d8b63502167e0b77b5.jpeg)
install下有include和lib两个文件夹,这两个文件夹下的东西后面会用到。
进行ndk开发
Android可以通过ndk-build和cmake两种方式来编译c,而且官方比较推荐的是cmake的方式,但是我用cmake试了好长时间一直报各种诡异的错误,应该是我还没有学到ncnn in ndk with cmake的正确打开方式,所以这里介绍一下使用ndk-build这种方式编译c,步骤如下:
我这里新建了一个android 的demo项目,项目结构如下:
![842315134408ac2e752967651d7bf225.png](https://i-blog.csdnimg.cn/blog_migrate/b4baed707f8c31c55d2b43c509d35cea.jpeg)
主要是assets文件夹下放置你的bin和param文件,jni文件夹下放置你的cpp和两个mk文件,具体内容下面会介绍(可以直接在对应位置新建这两个文件夹),然后要修改你的app
gradle文件:
![113ce6e9607a2abaf0bdc55e341e8dec.png](https://i-blog.csdnimg.cn/blog_migrate/c377c9434699a39ed2954169050e4441.jpeg)
对应的内容你可以根据自己的情况修改,然后配置两个mk文件:
- Android.mk
![3ed3ee1b2fc9f4af61cdbf2ec3244917.png](https://i-blog.csdnimg.cn/blog_migrate/065e594fad040919395856e27d80ec1c.jpeg)
- Application.mk
![fa3124ab0a0732594cfdbe9242f8ca73.png](https://i-blog.csdnimg.cn/blog_migrate/6d84082aa629e25ff531df58810e3e4e.jpeg)
这两个.mk文件我的建议是复制粘贴到你的项目里,只改动必要的文件路径,其余的参数别动,除非你知道你改的意思是什么~
因为ndk的原理是使用java接口调用c代码,所以我们需要进行java接口的编写,给出一个示例代码:
![3f809c908e30dfffb8b5c3ae688ddc8b.png](https://i-blog.csdnimg.cn/blog_migrate/337933246b0f432b569d3dd39ab5414f.jpeg)
一共两个方法,一个是初始化,一个是执行预测,需要注意的是初始化方法调用的时候需要传入一个二进制文件路径的参数,大概思路是把bin和param文件拷贝到手机上然后让c代码读取,这里给出模板代码:
![656c5aac947eb7afe687769e10e9a6de.png](https://i-blog.csdnimg.cn/blog_migrate/294d0565c4ff064d97691d8ea7d265a5.jpeg)
直接在你需要的地方调用IniteNcnn()就可以了,需要注意的是要 进行内存卡读取权限的申请 哦
然后将你一文带你入门腾讯出品的史上最快移动端深度学习框架ncnn写的demo.cpp放在jni目录下,对里面的代码进行必要的修改,主要需要实现模型的初始化和执行预测两个函数,初始化这里给出一个模板,至于执行预测的函数直接写一个对应函数然后调用你之前写好的c代码就可以了:
初始化
这个函数是通用的,建议全部复制粘贴,具体对应的java接口代码后面会介绍
![879f1235da62975922f58cf8f45357aa.png](https://i-blog.csdnimg.cn/blog_migrate/ede0e1a125b69559e70a1bef888a679d.jpeg)
至此所有代码已经编写完毕,然后就可以build了,步骤如下:
- cd到src/main/jni目录下
- 执行ndk-build,然后就会生成.so文件
- 然后你就可以根据自己模型的实际情况进行模型的调用了
总结
本文主要介绍了如何基于ncnn将深度学习模型部署在移动(Android)端,希望大家可以通过这篇和本篇文章对ncnn有一个基础的认识,便于将其应用到自己的实际场景中。