leafqycc / rknn-cpp-Multithreading

A simple demo of yolov5s running on rk3588/3588s using c++ (about 142 frames). / 一个使用c++在rk3588/3588s上运行的yolov5s简单demo(142帧/s)。
Apache License 2.0
472 stars 87 forks source link

RK3588 无法复现最高FPS130+,实际不到83FPS #32

Closed 1qingfeng-1 closed 10 months ago

1qingfeng-1 commented 10 months ago

修改的部分请看:https://github.com/1qingfeng-1/rknn-cpp-Multithreading.git

./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn output.mp4

output.mp4 是640*640 60帧的视频

各个步骤耗时 测试结果: pre_process: 491 us infer: 19065 us post_process: 403 us get show: 13960 us pre_process: 183 us infer: 19784 us post_process: 366 us get show: 11874 us pre_process: 298 us infer: 18670 us post_process: 415 us get show: 11531 us pre_process: 475 us infer: 19163 us post_process: 369 us get show: 12630 us pre_process: 222 us infer: 19813 us post_process: 377 us get show: 13391 us

可以看到 前处理 不到1ms,推理不到20ms,后处理不到1ms, get show 是13ms(平均) 采用多线程加速,实际帧率是看get show,也就是平均13ms一帧, fps 76帧

leafqycc commented 10 months ago

修改的部分请看:https://github.com/1qingfeng-1/rknn-cpp-Multithreading.git

./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn output.mp4

output.mp4 是640*640 60帧的视频

各个步骤耗时 测试结果: pre_process: 491 us infer: 19065 us post_process: 403 us get show: 13960 us pre_process: 183 us infer: 19784 us post_process: 366 us get show: 11874 us pre_process: 298 us infer: 18670 us post_process: 415 us get show: 11531 us pre_process: 475 us infer: 19163 us post_process: 369 us get show: 12630 us pre_process: 222 us infer: 19813 us post_process: 377 us get show: 13391 us

可以看到 前处理 不到1ms,推理不到20ms,后处理不到1ms, get show 是13ms(平均) 采用多线程加速,实际帧率是看get show,也就是平均13ms一帧, fps 76帧

跑之前定频了嘛,运行的时候可以查看一下NPU的使用率cat /sys/kernel/debug/rknpu/load 如果您希望跑到理论最大值的话,需要去增大src/main.cc下的threadNum变量,扩容线程池。仓库内threadNum=3的情况下我测试大概是98fps这样 之前测试的时候,图形界面的接口GTK和QT也会对结果产生影响,印象中一个比另一个强10%左右,反映到Ubuntu上大抵是wayland和xorg下的差异。不过fork中并没有用到显示,对于实际表现应该没啥影响?

YCG1 commented 10 months ago

修改的部分请看:https://github.com/1qingfeng-1/rknn-cpp-Multithreading.git

./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn 输出.mp4

输出.mp4 是640*640 60帧的视频

各个步骤耗时 测试结果: pre_process: 491 US 推断: 19065 US post_process: 403 US 获取显示: 13960 US pre_process: 183 US 推断: 19784 US post_process: 366 US 获取显示: 11874 US pre_process: 298 US 推断: 18670 US post_process: 415 US 获取显示: 11531 US pre_process: 475 US 推断: 19163 US post_process: 369 美国 GET 显示:12630 US pre_process:222 US 推断:19813 US post_process:377 US GET 显示:13391 US

可以看到 前处理 不到1ms,推理不到20ms,后处理不到1ms, get show 是13ms(平均) 采用多线程加速,实际帧率是看get show,也就是平均13ms一帧, fps 76帧

首先定频

1qingfeng-1 commented 10 months ago

@leafqycc 定频拉到最高频率,三个npu每个负载42% 修改threadNum=3,6,8,12,实际不会有太大帧率提高,12和3相差不大 单个npu处理时间在22ms, 理论上rk3588最高帧率可以达到 45*3 136帧的

YCG1 commented 10 months ago

@leafqycc 定频拉到最高频率,三个npu每个负载42% 修改threadNum=3,6,8,12,实际不会有太大帧率提高,12和3相差不大 单个npu处理时间在22ms, 理论上rk3588最高帧率可以达到 45*3 136帧的

我自己写了一套实现的 定频 v5s relu 单核npu可以拉到92%定死92 FPS 60左右 模型越大效果越好 v5m v7可以超过官方的测速

YCG1 commented 10 months ago

@leafqycc 定频拉到最高频率,三个npu每个负载42% 修改threadNum=3,6,8,12,实际不会有太大帧率提高,12和3相差不大 单个npu处理时间在22ms, 理论上rk3588最高帧率可以达到 45*3 136帧的

有兴趣可以加我QQ 1281854907
304AAECE8F4E13B3F167541C21F58458 A5AE9323626166BF60C437703AB1E849

1qingfeng-1 commented 10 months ago

@YCG1 npu就是跑不满,不知道是什么问题 image

1qingfeng-1 commented 10 months ago

@YCG1 你可以拉一下我修改的,测一下,多线程加跑不满npu

leafqycc commented 10 months ago

@YCG1 npu就是跑不满,不知道是什么问题 image

会是视频解码效率低导致推理阻塞吗?直接使用opencv播放视频看看解码效率呢?(就不进行推理直接返回结果)