1.简介
基于RKNPU2 SDK 1.6.0版的安卓YOLOv5演示应用程序,选择图片进行对象检测并显示识别结果。
GitHub源码地址:https://github.com/shiyinghan/rknn-android-yolov5
2.实现过程
参考RKNN官方库RKNN Model Zoo提供的YOLOv5对象检测demo,该demo是二进制的可执行程序,没有整合成app,但是代码结构比较清晰,整合成安卓应用,可以熟悉一下流程。
App相关的功能,例如加载asset下面的rknn模型文件等,参考了ncnn-android-yolov5软件库。
调用模型推理和后处理逻辑参考rknn_model_zoo/examples/yolov5/cpp下面的demo源码。
3.运行效果
先选择图片,然后点击识别,效果如下:
4.注意事项
运行该demo之前需要保证开发板端已经配置好了RKNN环境,/vendor/bin/rknn_server和/vendor/lib64/librknnrt.so的版本都是1.6.0。
RKNN官方已经有使用摄像头的实时数据进行yolov5对象检测并显示识别结果的demo,有需要的可以直接参考rknn_yolov5_android_apk_demo。
5.关于零拷贝API
相比于通用API,官方更推荐零拷贝API,在代码里面可以直接设置是否使用零拷贝API,代码如下:
在RK3568开发板上面实际测试之后发现,零拷贝API相对于通用API,在单线程的实现逻辑下面,运行量化模型可以快1ms左右,优势并不大。而如果运行非量化模型,零拷贝API甚至可能比通用API更慢。究其原因,可能是因为零拷贝API只是减少一次内存拷贝,而一些操作(比如数据的归一化、量化、反量化等)本来运行在CPU上面,使用零拷贝API会导致这些操作运行在NPU上面。相比于CPU,NPU除了推理,其他操作并不一定有优势。
当然如果想要充分利用NPU,CPU更多的用作其他用途的话,还是推荐使用零拷贝API的。在RK3568开发板上面,运行于多线程模型下,通用API的NPU使用率最多95%,而零拷贝API的NPU使用率则可以达到99%。
6.参考
rknn_model_zoo
ncnn-android-yolov5