use ncnn with alexnet.zh

wiki-sync-bot edited this page 11 hours ago · 1 revision

首先,非常感谢大家对 ncnn 组件的关注 为了方便大家使用 ncnn 组件,up主特意写了这篇使用指北,以烂大街的 alexnet 作为例子

准备caffe网络和模型

caffe 的网络和模型通常是搞深度学习的研究者训练出来的,一般来说训练完会有

train.prototxt
deploy.prototxt
snapshot_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的工具只认识新版

upgrade_net_proto_text [老prototxt] [新prototxt]
upgrade_net_proto_binary [老caffemodel] [新caffemodel]

输入层改用 Input,因为每次只需要做一个图片,所以第一个 dim 设为 1

layer {name: "data"type: "Input"top: "data"input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }
}

使用 caffe2ncnn 工具转换为 ncnn 的网络描述和模型

caffe2ncnn deploy.prototxt bvlc_alexnet.caffemodel alexnet.param alexnet.bin

去除可见字符串

有 param 和 bin 文件其实已经可以用了,但是 param 描述文件是明文的,如果放在 APP 分发出去容易被窥探到网络结构(说得好像不明文就看不到一样 使用 ncnn2mem 工具转换为二进制描述文件和内存模型,生成 alexnet.param.bin 和两个静态数组的代码文件

ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h

加载模型

直接加载 param 和 bin,适合快速验证效果使用

ncnn::Net net;
net.load_param("alexnet.param");
net.load_model("alexnet.bin");

加载二进制的 param.bin 和 bin,没有可见字符串,适合 APP 分发模型资源

ncnn::Net net;
net.load_param_bin("alexnet.param.bin");
net.load_model("alexnet.bin");

从内存引用加载网络和模型,没有可见字符串,模型数据全在代码里头,没有任何外部文件 另外,android apk 打包的资源文件读出来也是内存块

#include "alexnet.mem.h"
ncnn::Net net;
net.load_param(alexnet_param_bin);
net.load_model(alexnet_bin);

以上三种都可以加载模型,其中内存引用方式加载是 zero-copy 的,所以使用 net 模型的来源内存块必须存在

卸载模型

net.clear();

输入和输出

ncnn 用自己的数据结构 Mat 来存放输入和输出数据 输入图像的数据要转换为 Mat,依需要减去均值和乘系数

#include "mat.h"
unsigned char* rgbdata;// data pointer to RGB image pixels
int w;// image width
int h;// image height
ncnn::Mat in = ncnn::Mat::from_pixels(rgbdata, ncnn::Mat::PIXEL_RGB, w, h);const float mean_vals[3] = {104.f, 117.f, 123.f};
in.substract_mean_normalize(mean_vals, 0);

执行前向网络,获得计算结果

#include "net.h"
ncnn::Mat in;// input blob as above
ncnn::Mat out;
ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.input("data", in);
ex.extract("prob", out);

如果是二进制的 param.bin 方式,没有可见字符串,利用 alexnet.id.h 的枚举来代替 blob 的名字

#include "net.h"
#include "alexnet.id.h"
ncnn::Mat in;// input blob as above
ncnn::Mat out;
ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.input(alexnet_param_id::BLOB_data, in);
ex.extract(alexnet_param_id::BLOB_prob, out);

获取 Mat 中的输出数据,Mat 内部的数据通常是三维的,c / h / w,遍历所有获得全部分类的分数

ncnn::Mat out_flatterned = out.reshape(out.w * out.h * out.c);
std::vector<float> scores;
scores.resize(out_flatterned.w);
for (int j=0; j<out_flatterned.w; j++)
{scores[j] = out_flatterned[j];
}

某些使用技巧

Extractor 有个多线程加速的开关,设置线程数能加快计算

ex.set_num_threads(4);

Mat 转换图像的时候可以顺便转换颜色和缩放大小,这些顺带的操作也是有优化的 支持 RGB2GRAY GRAY2RGB RGB2BGR 等常用转换,支持缩小和放大

#include "mat.h"
unsigned char* rgbdata;// data pointer to RGB image pixels
int w;// image width
int h;// image height
int target_width = 227;// target resized width
int target_height = 227;// target resized height
ncnn::Mat in = ncnn::Mat::from_pixels_resize(rgbdata, ncnn::Mat::PIXEL_RGB2GRAY, w, h, target_width, target_height);

Net 有从 FILE* 文件描述加载的接口,可以利用这点把多个网络和模型文件合并为一个,分发时能方便些,内存引用就无所谓了

$ cat alexnet.param.bin alexnet.bin > alexnet-all.bin

#include "net.h"
FILE* fp = fopen("alexnet-all.bin", "rb");
net.load_param_bin(fp);
net.load_model(fp);
fclose(fp);

转自:https://github.com/Tencent/ncnn/wiki/use-ncnn-with-alexnet.zh

ncnn的使用(初学必看)相关推荐

  1. 【人工智能“六步走”学习路线】(初学必看)

    [人工智能"六步走"学习路线](初学必看) 学习笔记第三篇 1.学习并掌握一些数学知识 高等数学是基础中的基础,一切理工科都需要这个打底,数据挖掘.人工智能.模式识别此类跟数据打交 ...

  2. (初学必看)deep graph library(dgl)库的入门引导

    文章目录 前言 简单? 内置数据集 定义模型 定义dgl中的一个图 附录 前言 下载这个库要去官方网站:https://www.dgl.ai/,网站上会给你下载命令,这有点像下载pytorch的时候. ...

  3. 零基础学python用哪本书好看-6个Python超酷技巧,原来还能这样用!初学必看

    0.引言 不管学什么,我个人是非常喜欢小技巧(tricks)的,Python 也不例外.著名 Python 技巧大师 Dan Bader 是这样定义 Python Tricks 的. A Python ...

  4. 【C语言初学必看】猜数字游戏背后的知识

    目录 前言: 1.先看主体部分(大体逻辑的部分) a.为什么用do...while循环: b.switch语句: c.关于scanf ( ) 中的 %d %s 和 printf ( ) 的关系 d.m ...

  5. html表单最全详解,初学必看

    大家去面试,去开户都要填各式各样的表单,填好之后给工作人员,他们会按照表单项目与你填的内容来帮你完成业务. 同样的,在互联网冲浪也需要填各种各样的表单,比如用户问卷调查,新注册账号等.那么我们填好的表 ...

  6. 二叉树的基本原理和性质(初学必看)

    二叉树 binaryTree 节点度最大为2 ,可以为空 左子树和右子树有序 某节点只有一棵子树,区分左右子树 二叉树的性质: 非空二叉树的第i层,最多有 2^(i-1) 个节点 (i>=1) ...

  7. 【C语言初学必看】之多组输入的玄机

  8. 【C语言初学必看】一知半解的for循环嵌套for循环

  9. Matlab图像处理(1)彩色图像转换为灰度图像(初学必看)

    手把手教你用Matlab实现彩色图像转换为灰度图像 RGB = imread('F:/1/tuxiang.jpg');%将图像读入工作区 Y = rgb2gray(RGB);%将图像灰度化 imsho ...

最新文章

  1. 关联规则挖掘算法_#数据挖掘初体验 使用weka做关联规则
  2. 深度学习开源库tiny-dnn的使用(MNIST)
  3. 挨踢项目求生法则-战略篇
  4. 普通PC安装ESXI6.0无法识别网卡驱动问题
  5. XX管理包括哪些功能
  6. django14:CBV加入装饰器
  7. lstm网络_LSTM(长短期记忆网络)
  8. 关于IE无法打开flex程序的问题
  9. 在 里面_适合县城里面加盟的鞋店推荐
  10. java 发送邮件多个人,java 发送邮件(支持多附件,抄送人等功能)
  11. cass连接复合线命令 lisp_在cass中如何使两个多段线合为一条
  12. MapReduce实操5-1数据预处理——巴西利亚历史气温数据分析
  13. java 网页版通讯_JavaWeb网页聊天室(WebSocket即时通讯)
  14. 写论文时引用作者名字
  15. css的after右箭头,偷师成功,纯CSS绘制右箭头及其他——灵动外卖开发笔记
  16. 如何将c语言程序变成应用,C语言代码转换为应用程序
  17. Jupyter Notebook与Pycharm代码连接Docker容器中的远程服务器运行
  18. RK987A 机械键盘快捷键说明---仅供自己使用
  19. Java之~~包(package)
  20. html页面长按保存图片,h5长按保存图片

热门文章

  1. rxjs 放缓移动事件流
  2. BaiduMap---百度地图官方Demo之公交线路查询功能(介绍查询公交线路功能)
  3. easyui combotree 只允许选中部分节点
  4. WLAN二层旁挂组网与三层旁挂组网
  5. 通过Hadoop命令执行jar包
  6. 最新版50个 Kubernetes(k8s) 生态工具
  7. 公众号可以优化排名吗
  8. 移动端的touch事件详解
  9. 【hdu6072】Logical Chain
  10. c语言 touch新建文件,C 语言实现 Linux touch 命令