皮皮网
皮皮网

【简单安卓项目及其源码】【wetool企业源码】【上门宠物源码】ncnn源码分析

来源:gdal vs编译源码 发表时间:2024-11-30 01:10:20

1.Linux 如何运行benchmark循环跑
2.ncnn的源码使用2:onnx转ncnn模型跑resnet18
3.ncnn和pnnx和onnx
4.NCNN实现ResNet18推理---深度学习八
5.教程三分钟学习NCNN算法移植

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导出的分析简单安卓项目及其源码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的wetool企业源码数量,其中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值记录了推理框架的萌趣源码版本号,表示模型文件的特定信息。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的信息,请访问官方页面。

相关栏目:百科