一:适用方面:
正如标题的描述,本文章是在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的依赖,如下:
4.2.2 推理代码
模型初始化
推理前处理
推理:
推理后处理:
五: 如何使用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里面包含了模型转换环境的搭建和模型推理环境的搭建,模型转换环境参考:
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代码
5.2 模型的推理
5.2.1 推理环境的准备:
新建一个android c++工程把rknn-toolkit2-2.3.2.zip中下图中的文件
拷贝到你的工程目录下,在c++ Native端实现一个so,so的CMakeList.txt文件中加上对rknn sdk的依赖,如下:
5.2.2 模型的推理
模型的推理C++代码参考官方的Demo,这里需要说明几点:
5.2.2.1:推理模型的输入张量和输出张量的格式可以通过rknn sdk API获取,如下图一:yolo11 obb的模型输入输出张量格式:
一个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是否正常启动了(如下图)
六: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 双模型