1.OpenSitUp开源项目:零基础开发基于姿态估计的源码运动健身APP
2.ncnn和pnnx和onnx
3.教程三分钟学习NCNN算法移植
4.Linux å¦ä½è¿è¡benchmark循ç¯è·
5.ncnn的使用2:onnx转ncnn模型跑resnet18
6.NCNN实现ResNet18推理---深度学习八
OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP
更多深度学习工程实践项目,请关注公众号:DL工程实践
OpenSitUp是源码一个基于姿态估计的开源项目,旨在帮助对姿态估计感兴趣的源码朋友,能够从零开始搭建一个在android手机上运行的源码仰卧起坐计数APP。这个项目主要解决了如何让计算量较大的源码人体姿态估计网络流畅的运行在手机端,并实现仰卧起坐的源码互站源码破解计数功能。掌握了这个项目的源码原理之后,可以很方便的源码迁移到类似的运动,健身APP当中。源码
项目成果展示了最终的源码APP效果,在人潮涌动的源码西湖景区,演示了如何使用该项目进行仰卧起坐计数,源码效果显著。源码
项目目录结构包含多个工程,源码包括数据采集、源码标注、训练、部署、app开发等,整体目录结构清晰。数据集存放目录内有多张标注好的,可用于训练。此外,为项目准备了一个标注工具,方便标注关键点,还有基于pytorch的nginx指数源码关键点训练工具,以及Android上的仰卧起坐计数APP。
采集的流程包括从网上搜索“仰卧起坐”的视频,下载视频片段并抽取关键帧,以及从网上搜索背景较为丰富的。标注时,使用自开发的标注工具,标注关键点,生成标签文件。算法原理涉及姿态估计(关键点检测)领域,一般采用heatmap输出关键点位置,而非直接回归坐标。
算法实现包括四个部分:配置文件、数据读取、训练引擎和网络模型。训练完成后,需要将pytorch模型转换为支持手机运行的格式,选择使用ncnn作为推理库。为简化此过程,编写了export_ncnn.py脚本,可以一键将训练出来的模型转换为ncnn模型。
APP开发包含一个Activity类,两个SurfaceView类,一个Alg类,一个Camera类。Alg类负责调用算法进行推理,ork源码分析Camera类负责摄像头的管理,SurfaceView用于展示摄像头预览和关键点信息,Activity类管理整个APP。具体代码逻辑可以在SiteUpAndroid源码中找到。
ncnn和pnnx和onnx
Pnnx作为ncnn的中间件,允许ncnn支持torchscript,简化了转换过程。它不直接是一个推理库,而是提供了一种将计算图导出为其他推理库所需文件格式的方法。
NCNN提供多种功能,包括手动修改参数、动态操作和加速技巧。这些修改通常针对与ONNX和ATEN的兼容性。通过理解和运用这些技巧,可以更好地利用NCNN的性能。
在转换过程中,涉及到一个概念叫“lower”,即使用支持的算子来模拟模型中不支持的算子。例如,如果模型包含一个带有padding的卷积,而推理库不支持padding,那么lower过程会将该卷积分解为垫阵和无padding的卷积。同样,sigmoid操作可能会被分解为多个基本操作以模拟其功能。
在将模型转换为ONNX时,jar下载源码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支持保留算术表达式的ssm设计源码整体性,优化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算法移植
本文介绍如何基于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的信息,请访问官方页面。
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的数量,其中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实现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及其对应的类别置信度。