博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ncnn上把玩mobileNet
阅读量:2445 次
发布时间:2019-05-10

本文共 2842 字,大约阅读时间需要 9 分钟。

ncnn是腾讯优图最近开源的适合移动端的深度学习框架。mobileNet是谷歌在2017年4月份发表的论文MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications中提出的网络。由于引入了depthwise convolution,mobileNet的模型非常小,1000类的分类模型只有16.9M,很适合在移动端部署。本文尝试在Mac上用ncnn来运行mobileNet。

1. 下载并编译ncnn

git clone https://github.com/Tencent/ncnncd ncnnmkdir build && cd buildcmake ..make -jmake install

编译完成后在ncnn/build/tools 目录下,可以看到已经生成了 caffe2ncnn和ncnn2mem这两个可执行文件。caffe2ncnn可的作用是将caffe模型生成ncnn 模型,ncnn2mem可对模型进行加密。

2. 下载MobileNet的caffe模型和配置文件

可从中下载,下载后得到mobilenet_deploy.prototxt和mobilenet.caffemodel两个文件。

3. 旧版caffe模型转新版caffe模型

因为ncnn只支持转换新版的caffe模型,所以需要先把第二步下载的caffe模型转换为新版的caffe模型。新版caffe框架中自带了转换的工具,使用姿势如下。

$ ~/caffe/build/tools/upgrade_net_proto_text mobilenet_deploy.prototxt mobilenet_deploy_new.prototxt$ ~/caffe/build/tools/upgrade_net_proto_binary mobilenet.caffemodel mobilenet_new.caffemodel

4. 新版caffe模型转ncnn模型

在第一步生成的ncnn/build/tools目录下用caffe2ncnn来转换新版的mobileNet模型。

$./caffe2ncnn mobilenet_deploy_new.prototxt mobilenet_new.caffemodel mobilenet.param mobilenet.bin

注意生成的ncnn格式的模型中,.param可以理解为网络的配置文件,.bin可以理解为网络的参数(各种权重)文件。

若需要对模型进行加密,可用如下命令

$./ncnn2mem mobilenet.param mobilenet.bin mobilenet.id.h mobilenet.mem.h

最后可生成 mobilenet.param.bin 这样的二进制加密文件。ncnn对加密和非加密两种文件的读取方式不一样。

//load非加密的ncnn模型ncnn::Net net;net.load_param("mobilenet.param");net.load_model("mobilenet.bin");//load加密的ncnn模型ncnn::Net net;net.load_param_bin("mobilenet.param.bin");net.load_model("mobilenet.bin");

5. 开工:使用Xcode编写代码运行

使用Xcode新建一个工程,并把第一步中编译完成的ncnn库导入工程中。编译完成的ncnn lib在ncnn/build/install目录下。

配置好ncnn库后,可以借鉴example下面的squeezenet.cpp代码进行mobileNet模型的部署。修改后的代码如下

static int detect_mobileNet(const cv::Mat& bgr, std::vector
& cls_scores){ ncnn::Net mobileNet; mobileNet.load_param("/Users/Guigu/Documents/projects/ncnn_mobileNet/mobilenet.param"); mobileNet.load_model("/Users/Guigu/Documents/projects/ncnn_mobileNet/mobilenet.bin"); ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 224, 224); const float mean_vals[3] = {
103.94f, 116.78f, 123.68f}; const float norm_vals[3] = {
0.017f,0.017f,0.017f}; in.substract_mean_normalize(mean_vals, norm_vals); ncnn::Extractor ex = mobileNet.create_extractor(); ex.set_light_mode(true); ex.input("data", in); ncnn::Mat out; ex.extract("fc7", out); //此处与squeezenet不同 cls_scores.resize(out.c); for (int j=0; j

在main函数中调用该接口就OK了。

下面这张图是我测试的图

这里写图片描述

mobileNet识别的结果如下:

detection time: 852ms917 = 13.889417 ( comic book)643 = 13.157956 ( mask)921 = 7.961194 ( book jacket, dust cover, dust jacket, dust wrapper)Program ended with exit code: 0

细心的人可能观察到耗时比较长,原因是用Mac自带的编译器编ncnn的时候不能把openmp编进去。另外,Mac上也不能通过arm neon来加速(毕竟平台不一样嘛)。

完整的工程地址:

Bonus

如果想编译源代码,可以把ncnn中src目录下的文件加上build/src下的platform.h layer_registry.h 和layer_declaration.h放到一起替换上面的ncnn lib进行源码的编译研究。

Reference:

你可能感兴趣的文章
qnx 开发十步_十步实现应用程序本地化
查看>>
ML.NET模型构建器更新
查看>>
windows终端终端_Windows终端介绍
查看>>
小额免密_如何在您的应用中进行小额付款
查看>>
用开源代码如何建立网站_建立全球开源法律网络
查看>>
c&c++语言参考手册_C ++值类别快速参考:第2部分
查看>>
javascript优化_优化性能的十大JavaScript技巧
查看>>
ruby on rails_Ruby on Rails在市场开发中的重要地位
查看>>
react 编程式路由_如何做React式编程。 第2部分:副作用
查看>>
传统网络面临问题_我们每天都面临的最流行的计算机问题
查看>>
pxe无盘启动_使用pxe通过http / ftp服务器启动Ubuntu(无盘启动)
查看>>
.NET docs新功能(2019年12月)
查看>>
aws cmake .._如何将Hyperledger Fabric 1.4部署到AWS
查看>>
机器人学数学理论_基于格理论的机器学习数学
查看>>
字符串插值_让我们帮助QueryProvider处理插值字符串
查看>>
数据科学 python_Python还是R:对于数据科学来说,哪个是更好的选择?
查看>>
c#async await_通过C#中的async / await来“也许” monad(无任务!)
查看>>
unity 场景优化_Unity优化:您的场景层次正在抢劫您
查看>>
头脑风暴面试_进行有效头脑风暴的5种方法
查看>>
会计凭证自动化_贵公司会计自动化前后的生活
查看>>