目录

认识:

关于NCNN的模型转换:

关于NCNN模型文件的认识:

在c++下的推理:

认识:

ncnn是腾讯优图推出的在手机端极致优化的高性能神经网络前向计架框架,适用于手机端的CPU计算且无需依赖第三方计算库,ncnn只用作推理而非边训练边推理。

ncnn (GitHub地址:GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform  ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

同时由于NCNN模型是全部用c++来写的,所以它可以跨平台,比如常见的嵌入式设备上可以通用,另外我了解到它的负责人是nihui大佬,nihui群里更是大佬云集。

关于NCNN的模型转换:

先附上脚本转换网站(daquexian前辈):

一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (convertmodel.com)

这是一个在线的模型转换网站

对于Pytorch模型:

一种是可以通过PNNX直接转ncnn,pnnx是一个工具,支持动态尺寸输入,目前只支持torchscript转ncnn,且只支持torch.trace的torchscript。这种网上资料较少。

另一种则是通过中间模型onnx转ncnn,这种网上资料比起pnnx转ncnn更多。

关于NCNN模型文件的认识:

param和bin

param是网络结构文件,而bin则是参数文件

查看网络结构是不是同一个可用netron.app在线网站查看

以打开mobiefacenet的param

第一行的7767517为magic num

第二行的的160为网络层数,从第三行开始数,172为blob数量,相当于一个数据节点,带输入和输出。

从第三行开始为网络层,第一列为网络层类型,第二列为网络层名,第三列为bottom_count,第四列为top_count,bottom_count为该层在多少个网络层之下(相当于输入的blob数),top_count为该层在多少个网络层之上(理解为输出的blob数),后面的列依次为bottom_name,blob_name 以及该层的所带的参数,如果bottom_count为0则可以省略正如input那一层。

在c++下的推理:

前提,在电脑上装好环境,比如已经编译好了的ncnn库,protobuf,opencv库

ncnn环境配置参照:

Windows下ncnn环境配置(VS2019)_逮仔的博客-CSDN博客_ncnn vs2019

以经典的分类网络为例

// 网络加载
ncnn::Net squeezenet;
squeezenet.load_param("squeezenet_v1.1.param");
squeezenet.load_model("squeezenet_v1.1.bin");// 数据预处理
ncnn::Mat in = ncnn::Mat::from_pixels_resize(image.data, ncnn::Mat::PIXEL_BGR, image.cols, image.rows, 227, 227);
const float mean_vals[3] = { 104.f, 117.f, 123.f };
in.substract_mean_normalize(mean_vals, 0);// 网络推理
ncnn::Extractor ex = squeezenet.create_extractor();
ex.input("data", in);
ncnn::Mat out;
ex.extract("prob", out);

具体步骤

  1. 网络加载

    1. load_param
    2. load_model
  2. 数据预处理
    1. from_pixels_resize
    2. substract_mean_normalize
  3. 网络推理
    1. create_extractor
    2. input
    3. extract
  4. 每一层的推理(隐含在模型内的)

注意的地方:

作为初学者可以把ncnn的推理看做是一个黑盒子,只关注网络的输入和输出,本例子网络中的data则是输入层的名字,prob则是输出层的名字,关于怎么知道不同训练过程的输入和输出网络层的名字?用netron可视化观察,同时还能看到它输出的通道数知道自己该用什么样的数据结构去接受输出内容。

在netron的可视化下

最后输出名为518,输出通道数量为512

最后,整体看来确实简单,推理实际上是forward的一个递归的过程。

Ncnn框架在c++的推理及其认识相关推荐

  1. 【项目实战课】基于ncnn框架与KL散度的8bit对称模型量化与推理实战

    欢迎大家来到我们的项目实战课,本期内容是<基于ncnn框架与KL散度的8bit对称模型量化与推理实战>. 所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题, ...

  2. 【视频课】模型部署课程更新!ncnn框架快速实践!

    前言 欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下: 第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用. 第2层 ...

  3. Caffe学习系列(十):腾讯ncnn框架

    Caffe学习系列(十):腾讯ncnn框架 <手把手AI项目>七.MobileNetSSD通过Ncnn前向推理框架在PC端的使用(目标检测 objection detection) 1.n ...

  4. 阿里 深度学习推理框架_如何通过Knative无服务器框架构建深度学习推理

    阿里 深度学习推理框架 在某些学术界和行业界,深度学习正在获得巨大的动力. 推理(基于预训练模型从现实世界数据中检索信息的能力)是深度学习应用程序的核心. 深度学习推理可用于在图像到达对象存储时对其进 ...

  5. ncnn 框架分析 openmp多核加速 缓存 仿存 cache 快速矩阵乘法 单指令多数据指令SIMD

    ncnn 框架分析 本文github链接 博文末尾支持二维码赞赏哦 _ 在ncnn中建立新层 ncnn 下载编译使用 参考1 参考2 1. param 和 bin 文件分析 param 7767517 ...

  6. ##haohaohao#######蘑菇街自研服务框架如何提升在线推理效率?

    Online Serving 简介 从本质而言,在线服务就是提供 (http, rpc) 等接口,用户输入 X, X 经过 pre-process 处理成符合模型输入的参数,经由模型推理后得到 Y,Y ...

  7. 重构ncnn,腾讯优图开源新一代移动端推理框架TNN

    来源 | 腾讯优图 从学界到工业界,"开源"已经成为AI领域的一个关键词.一方面,它以"授人以渔"的方式为AI构建了一个开放共进的生态环境,帮助行业加速AI应用 ...

  8. 如何阅读一个前向推理框架?以NCNN为例

    0x00. 想法来源 CNN从15年的ResNet在ImageNet比赛中大放异彩,到今天各种层出不穷的网络结构被提出以解决生活中碰到的各种问题.然而,在CNN长期发展过程中,也伴随着很多的挑战,比如 ...

  9. 如何阅读一个前向推理框架?以NCNN为例。

    [GiantPandaCV导语]自NCNN开源以来,其它厂商的端侧推理框架或者搭载特定硬件芯片的工具链层出不穷.如何去繁从简的阅读一个深度学习推理框架十分重要,这篇文章记录了我是如何阅读NCNN框架的 ...

最新文章

  1. 阿里转衰!百度没落!字节跳动崛起!未来的互联网是腾讯和字节跳动的世界!这样的言论你相信吗?...
  2. 【Python】Python视频制作工具Manim入门,基础形状详细介绍
  3. java用while循环语句输出1-100内的奇数和
  4. hp服务器装xp系统,教你惠普笔记本一键装xp系统的方法
  5. 【Elasticsearch】索引和查询性能调优的21条建议-以及调优参数
  6. ad用户和计算机无法启动,windows 2008AD计算机启动脚本无法执行
  7. Java集合框架源码解读(4)——WeakHashMap
  8. vscode快捷键的修改
  9. Android获取手机型号
  10. java 万年历 农历_万年历(java实现)
  11. java代码混淆加密_关于Java加壳和代码混淆
  12. 嵌入式系统硬件构成-基于ARM的嵌入式开发板介绍
  13. 数据库设计规范(详细)
  14. vc调试总是提示项目已过期
  15. 汇总15位身份证号和18位身份证号的区别
  16. Ansible Inventory内置参数
  17. DOOM之父约翰·卡马克
  18. 使android桌面图标变大
  19. 石墨笔记,Onenote和Effie哪个适合SMZDM开箱评论者?
  20. VS 一个解决方案里面建立多个项目

热门文章

  1. ASIC芯片的龙头fabless公司比特大陆究竟是做什么的?
  2. 【蓝桥模板】——迷宫迷雾重重,小蓝带你拨云见日(DFS地图模板)
  3. MotionBuilder-bvh绑定(三)
  4. ssh可以登录,但是scp不行,解决方案
  5. JAVA对接企业微信,实现文本消息推送
  6. Http 历险记之 Nginx、Tomcat(上)
  7. Ubuntu 20.04 Gazebo安装 及模型库下载
  8. 聚划算超级聚享日为当代青年人打造理想家居空间
  9. 小而美 | Mac上鲜为人知,但极大提升效率的小工具
  10. 微信小程序 - 超详细 “长按说话“ 实时语音录制与播放功能,仿微信发语音 “按住说话,松开取消“ 录音功能效果(详细示例源码,一键复制开箱即用!)