正式开始之前插播一条硬广:
字节跳动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主页: https://github.com/Tencent/ncnn
环境说明
系统:Ubuntu16.04
编译源码
从github下载源码
git clone https://github.com/Tencent/ncnn
下载完后的目录结构应该是这样:
然后对ncnn源码进行编译(在ncnn根目录下执行):mkdir buildcd buildcmake ..make -j4
然后就可以编译成功了,相关截图:
在电脑上实现ncnn加载caffe模型对目标进行分类
参考:https://github.com/Tencent/ncnn/wiki/ncnn-%E7%BB%84%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97-alexnet
准备caffe网络和模型
caffe 的网络和模型通常是搞深度学习的研究者训练出来的,一般来说训练完会有
train.prototxtdeploy.prototxtsnapshot_10000.caffemodel
部署的时候只需要 TEST 过程,所以有 deploy.prototxt 和 caffemodel 就足够了
alexnet 的 deploy.prototxt 可以在https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet下载
alexnet 的 caffemodel 可以在http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel下载
转换ncnn网络和模型
caffe 自带了工具可以把老版本的 caffe 网络和模型转换为新版(ncnn的工具只认识新版),这里介绍一种比较笨但是比较快捷的方法:
首先将你需要转换的prototxt和caffemodel放在你电脑的caffe/build/tools目录下,然后终端进入caffe/build/tools,执行命令:
./upgrade_net_proto_text old_deploy.prototxt new_deploy.prototxt./upgrade_net_proto_binary old.caffemodel new.caffemodel
执行完成之后你就可以在caffe/build/tools下找到你的new_deploy.prototxt和new.caffemodel文件了。
注意完成之后打开你的new_deploy.prototxt文件看一下,因为一般每次只需要做一个数据样本的识别,所以如果第一个 dim 不为1,要将其设为1,类似于这样:
layer { name: "data" type: "Input" top: "data" input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }}
使用 caffe2ncnn 工具转换为 ncnn 的网络描述和模型
终端进入ncnn/build/toos/caffe(需要提前把上面转化的new_deploy.prototxt和new.caffemodel放到ncnn/build/tools/caffe下),执行如下命令:
caffe2ncnn new_deploy.prototxt new.caffemodel demo.param demo.bin
执行完成之后在ncnn/build/tools下就可以看到生成的param和bin文件了,文件名你可以根据你的需要设置。
去除可见字符串(可选)
用nihui大神的原文介绍:
有 param 和 bin 文件其实已经可以用了,但是 param 描述文件是明文的,如果放在 APP分发出去容易被窥探到网络结构(说得好像不明文就看不到一样) 使用 ncnn2mem 工具转换为二进制描述文件和内存模型,生成
alexnet.param.bin 和两个静态数组的代码文件:
ncnn2mem demo.param demo.bin demo.id.h demo.mem.h
我下面的所有使用为了方便都使用的是没有去除可见字符串的param和bin,如果你有去除可见字符串的需求,可以在ncnn的examples中找到相应去除了可见字符串文件的使用方法。
实现在电脑上使用ncnn
编写代码
使用你喜欢的编辑器编写c语言代码,我这里不做过多语言介绍,直接给一个demo代码,我会在代码中给出关键代码的注释(保证你认真看完代码和注释就会懂ncnn的大概原理),请大家从main函数入口开始阅读,相信更多的读者喜欢这种直接show code的方式:
#include #include #include #include"gesture.id.h"#include "net.h"//使用ncnn,传入的参数第一个是你需要预测的数据,第二个参数是各个类别的得分vector,注意传入的是地址,这样才能在这个函数中改变其值static int detect_squeezenet( float *data, std::vector& cls_scores){ //实例化ncnn:Net,注意include "net.h",不要在意这时候因为找不到net.h文件而include报错,后文会介绍正确的打开方式 ncnn::Net squeezenet; //加载二进制文件,也是照写,后面会介绍对应文件应该放的正确位置 int a=squeezenet.load_param("demo.param"); int b=squeezenet.load_param_bin("demo.bin"); //实例化Mat,前三个参数是维度,第四个参数是传入的data,维度的设置根据你自己的数据进行设置,顺序是w、h、c ncnn::Mat in = ncnn::Mat(550, 8, 2, data); //实例化Extractor ncnn::Extractor ex = squeezenet.create_extractor(); ex.set_light_mode(true); //注意把"data"换成你deploy中的数据层名字 int d= ex.input("data