Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

06-01 944阅读

一:适用方面:

        正如标题的描述,本文章是在Android11系统,rk3566芯片上的实际验证的结果,大家在参考的时候rk3566是最重要的,android系统是次要的,另外笔者用于推理的模型是:yolo11n-obb(自己训练)、yolo11n-pose(官方)、yolo11s-pose(官方)。

二:背景:

        基于CV(计算机视觉)+AI的技术已经相当成熟,加上终端算力的不断提高,使得之前很多需要特殊硬件才能实现的某些功能,现在只需要一个摄像头+AI+算法就可以实现,比如医疗养老行业的摔倒报警,输液报警,在离床检测等等。

三:目的:

        提供给在相关领域做研究或者做工作的同行一些经过验证的并且具有指导意义的信息,不至于像我刚开始接触类似的技术一样对某个技术细节不确定,难以把握,另外也通过对文章的编写完成对相关技术的总结、整理、提炼、消化,以备以后查阅。

四:如何使用NCNN推理yolo11模型:

 4.1 模型的转换:

  4.1.1转换环境准备:

 大家参考:让模型从Pytorch到NCNN——Pytorch模型向NCNN框架部署的小白向详细流程(PNNX模型转换、Linux模型使用)-CSDN博客

 4.1.2 先吧pytorch格式的模型转换成torchscript格式:

    Python 代码如下:

     from ultralytics import YOLO

     model = YOLO('best.pt')

     success = model.export(format="torchscript", imgsz=640)

     上面的代码会输出:best.torchscript文件

     Model.export中的参数:

     Format指的是导出的格式,这里配置成torchscript格式(也可导出其他格式,如onnx)            

     Imgsz表明模型的推理分辨率是640*640的

 4.1.3 再把torchscript格式转换为ncnn格式:

    Python代码如下:

       pnnx best.torchscript inputshape=[1,3,640,640]

       上面的代码会输出:best.ncnn.bin和best.ncnn.param

       Inputshape的参数表明推理的输入张量的格式是batchSize为1,通道为3,分辨率640*640

4.2 模型的推理:

4.2.1 推理环境准备:

GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform下载ncnn的sdk,本人下载的是ncnn-20230816-android-vulkan版本

建立一个android c++项目,在c++ Native端实现一个so,so的CMakeList.txt文件中加上对ncnn sdk的依赖,如下:

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

4.2.2 推理代码

模型初始化

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

推理前处理

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

推理:

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

推理后处理:

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

五: 如何使用RKNN推理yolo11模型:

5.1 模型的转换:

5.1.1 转换环境的准备:

Rk3566, rk3568, rk3576等型号下载rknn-toolkit2/rknpu2 at master · airockchip/rknn-toolkit2 · GitHub对应的rknn-toolkit2,作者下载的版本是rknn-toolkit2-2.3.2.zip里面包含了模型转换环境的搭建和模型推理环境的搭建,模型转换环境参考:Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

5.1.2 模型的转换

5.1.2.1 先把pytorch格式转换为onnx格式

from ultralytics import YOLO

model = YOLO('best.pt')

success = model.export(format="onnx",imgsz=640,opset=12)

代码会输出:'best.onnx文件

参数format="onnx"表明输出onnx格式

参数,imgsz=640表明推理分辨率是640*640

参数opset=12表明onnx的操作符版本号,如果后面的转换过程中有异常,可以往下调低这个版本号,作者就遇到过这个问题(之前配置了opset=13)

5.1.2.2 再把onnx格式转换为rknn格式

        把第一步输出的best.onnx 拷贝到转换环境的对应目录下,执行下面的Python代码

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

5.2 模型的推理

5.2.1 推理环境的准备:

新建一个android c++工程把rknn-toolkit2-2.3.2.zip中下图中的文件

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

拷贝到你的工程目录下,在c++ Native端实现一个so,so的CMakeList.txt文件中加上对rknn sdk的依赖,如下:

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

5.2.2 模型的推理

模型的推理C++代码参考官方的Demo,这里需要说明几点:

5.2.2.1:推理模型的输入张量和输出张量的格式可以通过rknn sdk API获取,如下图一:yolo11 obb的模型输入输出张量格式:

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

一个input0的输入张量,batchSize为1,row=640,col=640,channel=3(NHWC),精度FP16

一个output0的输出张量,batchSize为1,row=11, col = 8400, 精度FP16

对于输入张量这里我们只需要输入3通道RGB(每个通道8Bits)图像就行,rknn推理框架内部会自动做归一化处理并且转换成FP16精度

对于输出张量,我们需要做FP16到FP32的转换,并且需要大家了解模型的输出结构,写出对应的代码,这边就不在累述了。

5.2.2.2 关于rknpu驱动:

如果要运行rknn sdk,需要系统底层的npu驱动正常工作,可以通过dmesg | grep rknpu来判断

rknpu是否正常启动了(如下图)

Android11-rk3566平台上采用NCNN,RKNN框架推理yolo11官方模型的具体步骤以及性能比较

六:NCNN和RKNN的性能比较:

6.1 测试数据:

               3566 rknn的测试数据(640*640推理)

1. yolo11n-obb 240ms/次 + yolo11n-pose 260ms/次 (cpu idle 240%,共400%CPU)

2. yolo11n-obb 240ms/次 + yolo11s-pose 450ms/次 (cpu idle 240%,共400%CPU)

     3566 ncnn的测试数据(640*640推理)

1. yolo11n-obb 500ms/次 + yolo11n-pose 600ms/次 (cpu idle 0-20%,共400%CPU)

2. yolo11n-obb 500ms/次 + yolo11s-pose 1600ms/次 (cpu idle 0-20%,共400%CPU)

        从上面的结果可以看出在3566芯片上面如果采用ncnn的推理框架CPU基本消耗完了,CPU一直在高负荷运转,会导致其温度升高,进而降频,最后系统,应用卡顿,因此在3566芯片上面ncnn只能应用于对实时检测要求不高的场合,比如几秒一次检测,而rknn其单模型一秒可以处理4帧,而且其CPU消耗也不高,可以应用于需要相对实时检测的场合。另外在使用ncnn的时候可以打开GPU的开关,但是通过测试发现,开了GPU 推理性能反而下降了,不知道为什么。

6.2 演示视频(隐私,摄像头预览被有意不显示了,抱歉!)

3566 rknn运行yolo11n 单模型

3576 rknn 运行自训练yolo11n-obb+ 官方yolo11n-pose 双模型

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码