1.Linux å¦ä½è¿è¡benchmark循ç¯è·
2.ncnn的源码使用2:onnx转ncnn模型跑resnet18
3.ncnn和pnnx和onnx
4.NCNN实现ResNet18推理---深度学习八
5.教程三分钟学习NCNN算法移植
Linux å¦ä½è¿è¡benchmark循ç¯è·
Linux å¦ä½è¿è¡benchmark循ç¯è·å¦ä¸
benchmarkä¸å å«äºè·benchmarkçæºç benchncnn.cppï¼æå ´è¶£çå¯ä»¥å çä¸ä¸éé¢çå 容ãå¨Linuxçæä»¶æ ¹ç®å½ä¸ï¼æ°å»ºä¸ä¸ªbuildæ件夹并è¿å ¥ï¼å½ç¶ä¹å¯ä»¥ä¸å«buildï¼éä¾¿ä½ èªå·±èµ·ãmkdir build && cd buildè¿å ¥ä¹åå°±å¯ä»¥è¿è¡ç¼è¯äºï¼ç¼è¯ä¹åå¨buildæ件夹ä¸ä¼çæä¸ä¸ªå«benchmarkçæ件夹ï¼ä¹åçå·¥ä½ä¼å¨è¿éè¿è¡ãç¼è¯ç¨çæ¯cmakeï¼è¿éå¦ææé®é¢çè¯å¯ä»¥æ³¨æä¸ä¸cmakeççæ¬ï¼æç¨ççæ¬æ¯3..3ãå ·ä½å½ä»¤å¦ä¸:cmake .
make -j8è¿écmakeç¼è¯å®é ä¸æ¯è¦æ ¹æ®ä¸ä¸å±æ件夹çCMakeLists.txtçææ¬æ¥çï¼è¿éç..å ¶å®å°±æ¯è¡¨ç¤ºçä¸ä¸å±æ件夹ã Make -jåé¢çæ°åæ¯å¼å ä¸ªæ ¸ï¼æ ¹æ®èªå·±çµèçå®é æ åµæ¥ãæ§è¡å®æä¹åå°±å¯ä»¥çå°buildéæäºbenchmarkçæ件夹ã
å ¥è¿ä¸ªæ件夹ï¼å¯ä»¥çå°ä¸ä¸ªbenchncnnçå¯æ§è¡æ件已ç»ç¼è¯å¥½äºï¼è¿è¡è¿ä¸ªå¯æ§è¡æ件就å¯ä»¥æµè¯æ¨¡åçé度ãä½æ¯è¿ä¸ªå¯æ§è¡æ件é»è®¤çæ¯æ¾å°å½åæ件夹ä¸çparamæ ¼å¼çæ件ã
ææèªå¸¦ç模åæ件é½å¨ncnnæ ¹ç®å½ä¸çbenchmarkçæ件夹ä¸ï¼æéé¢ææçparamæ件é½æ·è´å°ç°å¨çbenchmarkæ件夹ï¼ç¶åæ§è¡å¦ä¸å½ä»¤./benchncnn 4 2 0 -1
第ä¸ä¸ªæ°å表示æµè¯æ¬¡æ°ï¼ç¬¬äºä¸ªè¡¨ç¤ºå¼ç线ç¨æ°ï¼è¿ä¸ç¹ncnnåçä¸éï¼ï¼æåä¸ä¸ªæ°å-1表示åªæµcpuãNCNN交åç¼è¯å°rk(armv7æ¶æ)årk(armv8æ¶æï¼çæ¹æ³ã
ncnn的使用2:onnx转ncnn模型跑resnet
NCNN的使用教程:将ONNX模型转换为运行ResNet
NCNN提供了强大的模型转换工具,便于将Caffe、分析ONNX等模型转换为ncnn格式。源码在编译后的分析ncnn build/tools目录下,我们找到了onnx2ncnn工具。源码本文将展示如何使用它将PyTorch导出的分析vberp源码下载ResNet的ONNX模型转换为ncnn适用的模型。
项目的源码结构如下:src存放源代码,python包含脚本,分析model_param存放模型文件,源码image存放推理,分析bin存放可执行文件。源码在bin目录下,分析我们拷贝了来自ncnn/build/tools/onnx的源码onnx2ncnn工具。
在python脚本export_res.py中,分析通过给定示例输入,源码我们导出resnet的ONNX模型至model_param目录。然后,我们使用ncnn官方提供的工具onnx2ncnn进行转换,生成resnet.param和resnet.bin文件,分别存储模型结构和参数。
resnet.param文件包含(magic number)和层与blob的配送比价源码数量,其中blob用于存储中间数据。Blob的数量通常比层多,因为每个层可能有多个输入和输出。例如,Convolution层有输入和输出blob,而Split算子则有多个输入和输出。
在推理代码中,我们参考ncnn/examples/squeezenet.cpp编写,首先创建Net实例,加载模型参数(resnet.param和resnet.bin),并确保输入转换为RGB格式,因为OpenCV默认为BGR。此外,还需对进行归一化处理,以适应模型的输入要求。
CMakeLists.txt文件中,我们设置了ncnn库的搜索路径,并将可执行文件输出到bin目录下,同时链接ncnn和OpenCV库。
通过以上步骤,好看跳转源码你已经学会了如何使用ncnn将ONNX格式的ResNet模型转换并进行推理。
ncnn和pnnx和onnx
Pnnx作为ncnn的中间件,允许ncnn支持torchscript,简化了转换过程。它不直接是一个推理库,而是提供了一种将计算图导出为其他推理库所需文件格式的方法。
NCNN提供多种功能,包括手动修改参数、动态操作和加速技巧。这些修改通常针对与ONNX和ATEN的兼容性。通过理解和运用这些技巧,可以更好地利用NCNN的性能。
在转换过程中,涉及到一个概念叫“lower”,即使用支持的算子来模拟模型中不支持的算子。例如,如果模型包含一个带有padding的卷积,而推理库不支持padding,那么lower过程会将该卷积分解为垫阵和无padding的卷积。同样,伏羲方圆(源码sigmoid操作可能会被分解为多个基本操作以模拟其功能。
在将模型转换为ONNX时,lower操作会重复进行两次。从python代码到torchscript再到ONNX,这会导致计算图变得庞大且细碎,不利于推理优化和模型理解。此外,这种转换可能会引入额外的算子,如Gather、Unsqueeze,这些在NCNN中可能不被支持。
Pnnx位于torchscript之下,提供了一种从torchscript导出ncnn模型的新途径,从而实现模型部署。Pnnx的算子定义与python代码的接口保持一致,支持类似于python的API。通过保留原始模型的算子定义和参数,Pnnx模型可以被轻松转换回原始python代码或导出为Pnnx。
在NCNN源码中,magic值记录了推理框架的源码 商业 java版本号,表示模型文件的特定信息。Pnnx参考了NCNN的模型写法,支持更灵活的参数键,如字符串,以与python API保持一致。此外,Pnnx支持保留算术表达式的整体性,优化GPU和可编程硬件的性能,并提供自定义算子的导出和优化功能。
在将模型转换为Pnnx时,可以指定模块操作,如Focus,以合并多个小操作为一个大操作,提高效率。Pnnx还支持量化感知训练的算子导出,并在转换过程中记录量化参数,解决了量化模型导出的问题。此外,Pnnx允许在模型中指定输入形状,有助于优化表达式和常量折叠过程,同时支持静态和动态形状。
在Pnnx的内部图优化过程中,使用模板匹配技术从torchscript ir中找到对应的封闭子图,并将其替换为目标操作,从而优化模型结构。Pnnx提供了一个完整的框架,包括加载torchscript、转换为Pnnx ir、进行图优化和转换为python代码的过程。
当前Pnnx项目兼容PyTorch 1.8、1.9和1.版本,支持种PyTorch上层操作中种转换为NCNN对应的操作。Pnnx已经实现了自动单元测试和代码覆盖率,对于常用CNN模型如ResNet和ShuffleNet,转换和推理结果与原始python版本一致。未来计划增加更多PyTorch算子支持、增强单元测试、测试端到端RNN和Transformer模型,并编写使用教程和开发文档。
NCNN实现ResNet推理---深度学习八
实现NCNN框架下ResNet推理,需遵循以下步骤。首先,准备NCNN环境,包括源码编译与安装,参考文档以确保顺利构建。
其次,模型转换是关键步骤。需将训练好的模型从ONNX格式转换为NCNN适用的*.param和*.bin格式。ONNX模型转换至NCNN格式的教程可参考相关资料,此过程通常会优化模型大小与参数量,通过合并优化等手段提升效率。
模型加载阶段,需依据不同的转换格式选择对应加载方法。加载后,检查输出的blobs数量与layers数量与param文件对应,以此确认加载成功。
数据预处理采用NCNN自带工具,将原始数据通过C++代码进行转换。例如,使用`from_pixels_resize`接口将图像通道由BGR转换为RGB,并调整至指定大小。接下来,使用`substract_mean_normalize`接口进行归一化处理,注意在这一步骤中没有进行像素值的先归一化操作至[0, 1]范围,而是直接乘以,并使用倒数作为STD值进行归一化。
完成数据预处理后,进行模型推理。已加载的模型与转换处理过的数据进行计算,结果存储于`ncnn::Mat out`中。最后,对推理结果应用`sigmoid`函数,得到输出的outPtr及其对应的类别置信度。
教程三分钟学习NCNN算法移植
本文介绍如何基于EASY EAI Nano移植NCNN部署库,以及如何成功运行yolov4的Demo。NCNN是由腾讯优图实验室开发的高性能神经网络前向计算框架,专为手机端优化,支持多输入、多分支结构的卷积神经网络计算,并且无第三方库依赖,支持跨平台操作。NCNN基于C++实现,支持ARM NEON汇编级优化,内存管理精细,支持多核并行计算,以及基于Vulkan API的GPU加速。支持8bit量化和半精度浮点存储,可导入多种框架的模型。
NCNN广泛应用于图像分类、风格迁移、目标检测、人脸检测等领域,并已被多款APP使用。接下来,我们通过以下步骤完成NCNN算法的移植学习。
1. 下载与编译NCNN源码
从百度网盘获取NCNN源码包,使用解压命令展开NCNN库。
执行编译指令,生成NCNN库文件。
2. 运行yolov4的Demo
下载包含yolov4基于NCNN运行的Demo,解压并执行编译指令。
将编译后的可执行程序文件通过Ubuntu推送至EASY EAI Nano板卡的指定目录。
在EASY EAI Nano板卡执行程序,观察执行结果。
在Ubuntu端获取识别成功的,并查看实际效果。
至此,NCNN算法移植学习完成。更多教程请持续关注我们。欲了解更多关于EASY EAI Nano的信息,请访问官方页面。