RDKx5上python部署yolov10模型较高帧率的实现

CLIP-GmP-ViT-L-14编码模型

CLIP-GmP-ViT-L-14编码模型` 是一个图文双塔编码模型,适合做图文匹配、零样本分类和跨模态检索演示。本镜像已经完成 Web 部署,打开页面即可上传图片并测试图文表征能力

0、前言

在上篇整完yolov10的部署后去玩别的东西了,直到最近有x5的使用需求了又跑回来乐。这次就好好看看为什么这家伙的帧率这么感人……

一开始的方案本来是去在官方的tros实例上进行修改得到一个高帧率部署的方案,结果死活没啃明白代码,出现了幽灵编译的问题(我倒.jpg)
最后还是转战回自己比较熟悉的python(其实也就仅限于看得懂代码)靠着AI东拼西凑出来一个勉强实现了需求的乐色代码(你就说跑没跑起来吧.jpg)
而且由于这只蒟蒻在解决这个问题上走了很多的弯路,所以代码里会出现很多奇怪乃至冗余的代码……
而我们都知道的,如果一个代码能跑那就不要动它

在结尾会把我的代码附上,实在想偷懒直接用的按照上篇yolov10部署文章里提到的要修改的部分按照你的实际情况改好(比如模型路径,类的个数,你的输出头顺序等)应该是能正常跑的(たぶん…)但是稳定性和各种细节上的问题的优化……就不要为难楼主这只蒟蒻可以吗orz

1、思路

这里简单讲一下提高帧率的思路,在官方给出的实例中缓慢的原因有两个,一个是线程瓶颈,另一个是OpenCV的显示的瓶颈。

官方的modelzoo中的yolov10detect代码将所有的计算环节串行进行,这就导致了一件很抽象的事情,前处理处理完摄像头的数据后,必须等模型推理,后处理,显示等环节全部进行完了才能进行下一次前处理……换言之,在前面完成的会出现一段闲置期,导致进程被整个环节完成所拖累。这严重挫伤了先进个体的积极性(胡言乱语.jpg)

至于怎么发现这个的呢……sudo hrut_somstatus这个命令可以查询当前资源的占用情况,当你在跑串行检测的yolo程序时,你再开一个终端把这个命令丢进去,你就会惊喜地发现一件有趣的事情。
没脸见人.jpg

看到ratio了吗?1代表当前使用了资源的1%,换言之10TOPS的算力你只用了0.1TOPS……这只蒟蒻发现的时候恨不得找个地儿钻进去.jpg

所以提高帧率的思路就很清晰了,提高BPU的利用率,但是如果你去翻官方的开发手册,你会发现这玩意儿似乎就没有被提到过,最起码我翻来翻去似乎都没找到哪里提到了提高BPU利用率的事情。(咱就是说藏这么死对楼主这种蒟蒻真的友好吗……如果这是某种不需讲解的常识,这只蒟蒻先钻地缝为敬)

后面在这篇文章里倒是找到了相关的说法,在此附上
(虽然但是,官方稍微在手册里提一嘴也不是不行吧)怨念深重.jpg
膜拜大佬的每一天.jpg

在很多业务场景下,模型的前后处理和模型推理过程串行进行处理,此时如果没有采用多线程技术,BPU整体上利用率较低,无法获得预期的模型推理帧率数据。

上述明确地指出了通过多线程的形式,可以提高BPU的利用率,减少对先进个体的拖累(确信.jpg)

简单而不严谨地解释一下为什么多线程好,因为在多线程的情况下,前处理的只需要管摄像头有没有扔数据进来进行了,只要那边源源不断的有数据进来,那他就可以一直干活,干完了往下一个线程一丢就好了。自己吃饱全家不饿.jpg

而线程间的数据传输我用的是队列来进行传输(先进先出嘛)
但采用多线程其实会出现一个问题,每个环节的处理时间肯定不一样,如果不做限制,那处理的快的是不是就会一直往下一个线程丢数据?但是下一个线程的计算任务比较复杂,做的没有来的快,那就出现数据堆积的情况。所以往往是需要做出一定的限制的,常见的做法是,只有等下一个线程任务处理完了往这边丢一个信号,这边才把下一个数据丢过去。

这样好像听起来跟串行差距不大?实际上差的还是很多的,串行是每一个环节都必须等待整个流程走完才能开启下一次任务,换句话来说,串行的时间限制是源自整个流程的所有环节的时间总和,相当于把所有任务的缺点都集中在了一起。
而多线程最多只会出现中间某个环节最慢,然后上下游环节都在等它这个拖后腿的,只要它解决了任务就能正常进行到下一个,这样的话时间限制就只源于这一个环节所需的时间。

综上,使用多线程完全可以有效地提高对BPU的利用率,从而加速程序的处理和显示。

那怎么实现呢?
我不会(诶嘿哒哟.jpg)
如果你是大佬,那手搓就好了嘛,还要我的代码干嘛(理不直气也不壮.jpg)
如果不会,那就请出万能的AI帮我们实现一下这个简单的功能,思路已经在这里了,也不一定要我那个东一榔头西一锤子出来的代码嘛(心虚目移.jpg)

接下来我们来讲opencv的显示瓶颈,就如果你直接用cv.imshow那多半帧率还是上不去的……因为慢,建议是直接用官方适用硬件加速过的函数,直接在显示器上显示。参考代码在板子上有,路径是/app/pydev_demo/02_usb_camera_sample/usb_camera_fcos.py

把该带的依赖库带上,把参考代码里检测usb摄像头和显示器,以及采集摄像头数据和显示器渲染的代码和多线程yolo检测的代码结合一下,就得到了一份帧率相对更高的代码。
不建议从我的代码里节选去结合,毕竟因为走的弯路有点多,毕竟很乱。

这样写出来的代码对bpu的利用率大概是20-30左右,已经是飞跃般的进步了.jpg

如果说要进一步提高帧率的话,其实可以考虑再开一个流程,就是两个完全一样的处理计算流程,都从摄像头获取数据,然后都通过官方的函数渲染到显示器上,注意两个线程数据的输入和输出的顺序不会错位就好。再压榨一波bpu,诶嘿。

上述仅是个人猜想,未经过实际测试,如果翻车了可以回来拷打,但还请手下留情.jpg

2、结语和参考资料

这次除了我的乐色代码其实没什么参考资料了.jpg
不过其实还是花了我比较长时间才琢磨明白这件事,之前一直以为是python的问题……
不知道我什么时候才能摘掉蒟蒻的名头.jpg~~(くそっ,ここまでか)~~

最后,希望这篇文章能帮到你,如果能帮助你们更顺利地进行开发就再好不过了。
后面我应该又去玩别的东西去了,这个代码的优化和幽灵编译的问题等我哪天想起来再回来研究一下,如果成功研究出来还是没有相关的教程我就再写一篇吧。
(怎么开始挖坑了?)

另,CSDN我没找到哪里放附件……那我再放一个地瓜社区的链接,那里我放了代码
社区帖子

您可能感兴趣的与本文相关的镜像

CLIP-GmP-ViT-L-14编码模型

CLIP-GmP-ViT-L-14编码模型

图像识别
CLIP

CLIP-GmP-ViT-L-14编码模型` 是一个图文双塔编码模型,适合做图文匹配、零样本分类和跨模态检索演示。本镜像已经完成 Web 部署,打开页面即可上传图片并测试图文表征能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值