当前位置: 首页 > news >正文

RK3576 Android14 rknn_yolov5_demo使用

一、背景

工作中需要测到NPU的VDD电压,然而已知npu做推理的时候vdd_npu电源才会打开,那么想办法让NPU跑起来。RK官方提供的是rknn_yolov5的demo。

二、开发环境

OS:Android14

Platform:RK3576

Linux Version:6.1.99

SDK Version:android-14.0-mid-rkr6

三、介绍

简单捋一捋吧,如下:

NPU:所谓NPU(Neural network Processing Unit), 即神经网络处理器。用电路模拟人类的神经元和突触结构,是一种专门设计用于加速人工智能(AI)和机器学习(ML)任务的处理器。它主要用于处理与神经网络相关的计算,例如深度学习模型的训练和推理。NPU通过优化矩阵运算、卷积运算等神经网络中的核心操作,显著提升了AI任务的执行效率。

Yolo:YOLO(You Only Look Once)是一种one-stage目标检测算法,即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov5是由Alexey Bochkovskiy等人在YOLO系列算法的基础上进行改进和优化而开发的,使其性能与精度都得到了极大的提升。

Yolov5推出了Yolov5s、Yolov5m、Yolov5l、Yolov5x等四个版本的目标检测网络。四个模型的结构基本一致,区别主要在于模型深度depth_multiple和模型宽度width_multiple这两个参数,如下图所示。

RKNN:是 Rockchip npu 平台使用的模型类型,以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换 Python 工具,方便用户将自主研发的算法模型转换成 RKNN 模型,同时 Rockchip 也提供了C/C++Python API 接口。

RKNN软件栈可以帮助用户快速将AI模型部署到瑞芯微芯片上。总体框架如下:

为了使用RKNPU,用户需要先在计算机上运行RKNN-Toolkit2工具,将训练好的模型转换为RKNN格式的模型,然后使用RKNN C API或Python API在开发板上进行推理。

  • RKNN-Toolkit2 是一款软件开发套件,供用户在 PC 和瑞芯微 NPU 平台上进行模型转换、推理和性能评估。

  • RKNN-Toolkit-Lite2 为瑞芯微 NPU 平台提供 Python 编程接口,帮助用户部署 RKNN 模型,加速 AI 应用的落地。

  • RKNN Runtime为瑞芯微NPU平台提供C/C++编程接口,帮助用户部署RKNN模型,加速AI应用的落地。

  • RKNPU 内核驱动程序负责与 NPU 硬件交互。它已经开源,可以在瑞芯微内核代码中找到。

当然,在下目前在Android平台下作demo测试,直接采用rknpu2项目跑可执行文件的方法即可快速实现。另外其他编译的方式,参考原项目介绍即可:

rknpu2/examples/rknn_yolov5_demo at master · rockchip-linux/rknpu2https://github.com/rockchip-linux/rknpu2/tree/master/examples/rknn_yolov5_demo

四、测试方法

如官方演示一样:

1、编译与构建

根据目标平台,在“build-android_<TARGET_PLATFORM>.sh”上修改 Android NDK 的路径

例如

ANDROID_NDK_PATH=~/opt/tool_chain/android-ndk-r17

然后,运行以下脚本:

./build-android_<TARGET_PLATFORM>.sh

2、将所有构建输出文件推送到板上

adb root
adb remount
adb push install/rknn_yolov5_demo /data/

3、运行

adb shell
cd /data/rknn_yolov5_demo/

export LD_LIBRARY_PATH=./lib
./rknn_yolov5_demo model/<TARGET_PLATFORM>/yolov5s-640-640.rknn model/bus.jpg

4、实际演示效果

RK3576:/data/rknn_yolov5_demo_Android # ./rknn_yolov5_demo ./model/RK3576/yolov5s-640-640.rknn ./model/bus.jpg                                                 <
post process config: box_conf_threshold = 0.25, nms_threshold = 0.45
Loading mode...
sdk version: 2.3.2 (429f97ae6b@2025-04-09T09:08:16) driver version: 0.9.8
model input num: 1, output num: 3index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, w_stride = 640, size_with_stride=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, w_stride = 0, size_with_stride=1638400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, w_stride = 0, size_with_stride=491520, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, w_stride = 0, size_with_stride=163840, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
model is NHWC input fmt
model input height=640, width=640, channel=3
Read ./model/bus.jpg ...
img width = 640, img height = 640
once run use 28.806000 ms
loadLabelName ./model/coco_80_labels_list.txt
person @ (209 243 286 510) 0.879723
person @ (479 238 560 526) 0.870588
person @ (109 237 232 534) 0.828112
bus @ (93 129 553 464) 0.700761
person @ (79 353 122 517) 0.307297
save detect result to ./out.jpg
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
i: 11
i: 12
i: 13
i: 14
i: 15
i: 16
i: 17
i: 18
i: 19
i: 20
i: 21
i: 22
i: 23
i: 24
i: 25
i: 26
i: 27
i: 28
i: 29
i: 30
i: 31
i: 32
i: 33
i: 34
i: 35
i: 36
i: 37
i: 38
i: 39
i: 40
i: 41
i: 42
i: 43
i: 44
i: 45
i: 46
i: 47
i: 48
i: 49
i: 50
i: 51
i: 52
i: 53
i: 54
i: 55
i: 56
i: 57
i: 58
i: 59
i: 60
i: 61
i: 62
i: 63
i: 64
i: 65
i: 66
i: 67
i: 68
i: 69
i: 70
i: 71
i: 72
i: 73
i: 74
i: 75
i: 76
i: 77
i: 78
i: 79
i: 80
i: 81
i: 82
i: 83
i: 84
i: 85
i: 86
i: 87
i: 88
i: 89
i: 90
i: 91
i: 92
i: 93
i: 94
i: 95
i: 96
i: 97
i: 98
i: 99
loop count = 100 , average run  34.743400 ms

如运行结果所示,这个rknn_yolov5_demo程序成功100次跑过了YOLOV5模型,对这个bus.jpg图片进行了推理,检测出图片中有4个人物和一辆公共汽车。

自然而然,在这个模型跑测的过程中利用到NPU,对应VDD电压也能获取到动态值。

五、参考来源

1、Yolov5原理详细解析!一文看懂-CSDN博客

2、【智能硬件】初识RKNN-CSDN博客

3、rknpu2/examples/rknn_yolov5_demo at master · rockchip-linux/rknpu2

4、Rockchip NPU模型-RKNN - 知乎

http://www.dtcms.com/a/389108.html

相关文章:

  • LeetCode算法日记 - Day 45: 为高尔夫比赛砍树、矩阵
  • LeetCode:18.矩阵置零
  • android安卓定制自动点赞软件--android.apk安装包/点赞脚本
  • 数据存储架构怎么选?一文分清数据仓库、数据湖、湖仓一体
  • 【线性代数:从基向量理解线性变换与矩阵】附Python代码
  • MCP与企业数据深度融合—ERP、CRM及数据仓库的统一接入架构与实践
  • MySQL高级语法
  • rust编写web服务04-数据库初体验
  • 芋道开源框架应用的小问题。细节!!
  • PyQt6之QDateEdit和QTimeEdit格式设置
  • FTP协议在国产化环境下的最佳替代方案是什么?
  • C语言(长期更新)第18讲:数据在内存中的存储
  • 模块三 进阶微服务
  • Vue3 组件封装原则与实践指南
  • Git合并冲突
  • 部署K8S集群
  • K8S配置管理:ConfigMap与Secret
  • 奥威BI+ChatBI:数据智能时代的一体化解决方案
  • 微服务与云原生实战:Spring Cloud Alibaba 与 Kubernetes 深度整合指南
  • 从慕尼黑到新大陆:知行科技「智驾」与「机器人」的双行线
  • VINTF中manifest.xml和compatibility_matrix.xml的作用
  • AI时代云原生数据库一体机的思考
  • 配置manifest.xml和compatibility_matrix.xml
  • Prometheus高可用监控架构性能优化实践指南
  • 低代码平台与云原生开发理念是否契合?
  • 红队测试手册:使用 promptfoo 深入探索大语言模型安全
  • el-date-picker设置默认值
  • 结语:Electron 开发的完整路径
  • 数据结构系列之线性表
  • Vue2 生命周期钩子详解:beforeCreate、created、mounted、beforeDestroy 用法顺序与坑点指南