关闭

在ncnn上把玩mobileNet

标签: ncnnmobilenet
2682人阅读 评论(0) 收藏 举报
分类:

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/ncnn
cd ncnn
mkdir build && cd build
cmake ..
make -j
make install

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

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

可从https://github.com/shicai/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<float>& 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<out.c; j++)
    {
        const float* prob = out.data + out.cstep * j;
        cls_scores[j] = prob[0];
    }

    return 0;
}

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

下面这张图是我测试的图
这里写图片描述

mobileNet识别的结果如下:

detection time: 852ms
917 = 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来加速(毕竟平台不一样嘛)。

完整的工程地址:https://github.com/Revo-Future/ncnn_mobileNet

Bonus

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

Reference:
http://blog.csdn.net/best_coder/article/details/76201275

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

NCNN在RK3288 Linux系统的原生编译问题解决

NCNN默认支持Android和iOS,使用Android NDK编译时会自动定义__ARM_NEON宏,从而获得较高的处理性能。在RK3288 Ubuntu Linux系统上编译时,默认是不开启__...
  • dasheng_604
  • dasheng_604
  • 2017-11-04 10:26
  • 300

ncnn编译使用(一)

ncnn前向框架简介以下介绍来自官网介绍 ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快...
  • Iriving_shu
  • Iriving_shu
  • 2017-12-17 22:45
  • 158

Win端搭建基于ncnn框架的MTCNN人脸检测

前言ncnn是腾讯优图在七月份开源的,一款手机端极致优化的前向计算框架;开源有几个月了,仍然是开源里的扛把子(给nihui大佬递茶)。之前也测试移植过,这次主要做个整理,鉴于很多人只想在window下...
  • qq_35587861
  • qq_35587861
  • 2017-12-20 23:41
  • 164

深度学习框架的比较(MXNet, Caffe, TensorFlow, Torch, Theano)

1. 比较表 2.详细描述
  • MyArrow
  • MyArrow
  • 2016-07-29 14:22
  • 31637

腾讯开源ncnn:示例程序运行

本博记录为卤煮使用时的记录,属于事后回忆记录,如有疏漏,请指正。 卤煮:非文艺小燕儿 本博地址:ncnn:示例程序运行 感谢开源共享的各位大牛们,让我们能够站在巨人的肩膀上前行。 ncnn g...
  • fuwenyan
  • fuwenyan
  • 2017-07-26 10:06
  • 5357

腾讯开源ncnn:caffemodel转化为.param和.bin文件

本博记录为卤煮使用时的记录,属于事后回忆记录,如有疏漏,请指正。 卤煮:非文艺小燕儿 本博地址:腾讯开源ncnn:caffemodel转化为.param和.bin文件 感谢开源共享的各位大牛们,让...
  • fuwenyan
  • fuwenyan
  • 2017-07-26 15:23
  • 2473

ncnn安卓搭建并使用自己的模型

ncnn安卓搭建并使用自己的模型github上面已经给了一个ncnn的安卓例子,地址:https://github.com/dangbo/ncnn-mobile clone 这个项目后用Androi...
  • linmingan
  • linmingan
  • 2017-09-15 10:03
  • 1527

Ubuntu16.04---腾讯NCNN框架入门到应用

Ubuntu16.04—腾讯NCNN框架入门到应用前言两天前腾讯发布NCNN深度学习框架后,发现可能有些同学对如何使用这些框架并不是十分的了解,一方面这是一个新的框架,另一方面Tencent出的文档对...
  • Best_Coder
  • Best_Coder
  • 2017-07-27 17:06
  • 7292

腾讯优图开源项目ncnn

GitHub地址:https://github.com/Tencent/ncnn 如何在windows pc上跑example: http://blog.csdn.net/fuwenyan/artic...
  • huang_yx005
  • huang_yx005
  • 2017-09-01 12:08
  • 504

mobilenet

mobilenet
  • mao_feng
  • mao_feng
  • 2017-07-17 22:20
  • 12554
    个人资料
    • 访问:182634次
    • 积分:2760
    • 等级:
    • 排名:第15013名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:73条
    文章分类
    最新评论