新闻详情

新闻详情

首页 / 资讯中心 / 详情

香橙派RK3588上yolov5s取流循环分段计时与X11画面回传实战

发布时间:2026/9/30 0:01:42来源:尧图网络
香橙派RK3588上yolov5s取流循环分段计时与X11画面回传实战
1. 从能跑到能看为什么取流循环必须加计时和画面回传很多人把 yolov5s 在香橙派 RK3588 上跑通之后就停在终端里能看到检测框坐标这一步。说实话这个阶段只能算模型能推理离这套系统能用来做判断还差得远。原因很简单你根本不知道每一帧到底花了多少时间也不知道画面到底长什么样。终端里刷出来的person 0.87这种日志既不能告诉你画面有没有偏色、有没有撕裂也不能告诉你取流这一环是不是拖了后腿。我在实际调试 RK3588 上的视觉管线时最深的体会是性能问题从来不是靠猜的是靠计时器量出来的。取流循环里如果不埋时间戳你永远分不清瓶颈在 RTSP 解码、在 NPU 推理、还是在后处理画框。而画面回传把 RK3588 上处理后的画面弹回电脑显示解决的是另一个问题——可视化验证。没有画面你连模型到底有没有正确读到这一帧都无法确认。这一篇要干的事情很具体给取流循环加上分段计时把每一帧的耗时拆开看清楚然后用 X11 转发把处理后的画面从香橙派弹回本地电脑显示。关键词里的香橙派、RK3588、yolov5s、X11、SSH就是这条链路的五个支点。适合已经能在板子上跑通 yolov5s 推理、但还没建立起可观测性的读者。如果你还在纠结模型怎么转 RKNN那是前几篇的事这篇默认你已经有一个能出结果的推理脚本了。提示计时和画面回传是两件独立的事但建议先做计时、再做回传。因为画面回传本身会引入额外开销如果先做回传你测出来的耗时里混进了 X11 传输的时间数据就不干净了。2. 取流循环的分段计时把一帧拆成四段来量2.1 为什么是四段而不是一个总时间一个典型的取流推理循环粗看就是读一帧、推理一下、画个框、显示出来。但真正定位问题时一个总耗时数字毫无意义——它只能告诉你慢不能告诉你哪里慢。我习惯把它拆成四段取流段从视频源RTSP 流、USB 摄像头、本地视频文件拿到一帧并解码成可用图像的时间预处理段resize、归一化、颜色空间转换BGR 转 RGB、转成 RKNN 需要的输入格式推理段rknn.inference()这一次调用本身的耗时这是 NPU 真正干活的时间后处理段解析输出张量、做 NMS、把框画到图上这四段加起来才是单帧总耗时。分开量之后你会发现很多玄学卡顿其实有非常明确的归属。比如我遇到过取流段占了 80% 的时间推理段反而很快——那问题根本不在模型在网络或者解码器。2.2 用 perf_counter 而不是 time.time计时函数的选择有讲究。time.time()返回的是墙上时钟受系统时间调整影响精度也一般。Python 里做性能计时应该用time.perf_counter()它是单调递增的高精度计数器不受系统时间跳变影响。import time # 在循环开始前初始化累加器 t_capture 0.0 t_preprocess 0.0 t_inference 0.0 t_postprocess 0.0 frame_count 0 while True: t0 time.perf_counter() frame capture_frame() # 取流 解码 t1 time.perf_counter() input_data preprocess(frame) # 预处理 t2 time.perf_counter() outputs rknn.inference(inputs[input_data]) # NPU 推理 t3 time.perf_counter() result postprocess(outputs, frame) # NMS 画框 t4 time.perf_counter() t_capture (t1 - t0) t_preprocess (t2 - t1) t_inference (t3 - t2) t_postprocess (t4 - t3) frame_count 1这里有个细节不要在循环里每帧都 print。print 本身是 IO 操作会显著拖慢循环尤其是通过 SSH 连接时终端输出要走网络开销更大。正确做法是累加然后每隔 N 帧比如 30 帧输出一次平均值。2.3 分段计时的输出格式与判读每 30 帧输出一次格式建议做成这样一眼就能看出各段占比if frame_count % 30 0: avg_cap t_capture / frame_count * 1000 avg_pre t_preprocess / frame_count * 1000 avg_inf t_inference / frame_count * 1000 avg_post t_postprocess / frame_count * 1000 total avg_cap avg_pre avg_inf avg_post print(f[{frame_count}帧] 取流 {avg_cap:.1f}ms | f预处理 {avg_pre:.1f}ms | 推理 {avg_inf:.1f}ms | f后处理 {avg_post:.1f}ms | 合计 {total:.1f}ms | fFPS {1000/total:.1f})判读的时候有个经验阈值可以参考。在 RK3588 上跑 yolov5s640x640 输入各段的合理范围大致是阶段合理耗时偏慢的信号常见原因取流5-30ms超过 50ms网络抖动、解码器没走硬件、分辨率过高预处理3-15ms超过 30ms用了 PIL 而不是 OpenCV、反复内存拷贝推理20-60ms超过 100ms模型没量化、NPU 频率没拉满、输入尺寸过大后处理5-20ms超过 40msNMS 用了纯 Python 实现、候选框太多这张表不是标准答案是帮你建立直觉的参考。真正有价值的是你自己板子上的基线——先跑一次记录下正常值之后任何异常都能对比出来。2.4 一个容易忽略的坑预热帧第一次推理往往特别慢因为 NPU 驱动要初始化、模型权重要从内存加载、各种缓存要建立。如果你从第一帧就开始计时平均值会被严重拉高。我的做法是前 10 帧只跑不计时当作预热从第 11 帧开始正式统计。WARMUP_FRAMES 10 if frame_count WARMUP_FRAMES: # 正常累加计时 ...这个细节看起来小但如果你不做测出来的 FPS 可能比真实值低 20% 以上然后你会花大量时间去优化一个根本不存在的问题。我踩过这个坑当时以为推理要 120ms折腾半天发现预热之后稳定在 45ms。3. X11 转发让香橙派的画面出现在你电脑屏幕上3.1 X11 转发到底在转发什么先说清楚原理不然配置出问题你都不知道从哪查。X11 是一套客户端-服务器架构的图形系统。这里的服务器指的是运行在香橙派上的 X Server它负责实际的绘制而客户端是你电脑上运行的程序它发出绘制指令。X11 转发做的事情是通过 SSH 隧道把香橙派上 X Server 的画面数据传回你本地电脑的 X Server 显示。听起来绕用一句话概括程序在香橙派上跑窗口显示在你电脑上。这跟 VNC 那种传整个桌面的方案不一样X11 转发是按需传单个窗口开销小得多特别适合我们这种只需要看一个检测结果窗口的场景。注意X11 转发传的是绘制指令和位图如果画面里有大量实时变化的图像比如视频流带宽消耗会明显上升。在局域网内问题不大跨网络就要掂量一下。3.2 SSH 服务端与客户端的配置要点香橙派这边服务端需要确保 SSH 允许 X11 转发。检查/etc/ssh/sshd_configX11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes改完记得重启 SSH 服务sudo systemctl restart sshd。这里X11UseLocalhost yes是让 X11 的转发端口只绑定在本地回环更安全配合 SSH 隧道使用没问题。客户端这边连接时加-X参数开启转发ssh -X user192.168.x.x-X是可信转发-Y是受信任转发跳过部分安全检查。日常调试用-X就够了如果遇到某些程序因为安全策略拒绝显示再考虑-Y。连上之后在香橙派终端里执行echo $DISPLAY正常应该输出类似localhost:10.0的内容。如果输出为空说明转发没生效回去检查服务端配置。3.3 验证 X11 是否真的通了别急着跑你的检测程序先用一个小工具验证链路。香橙派上如果装了xeyes或者xclock直接运行xeyes如果本地电脑上弹出一对跟着鼠标转的眼睛说明 X11 转发完全打通。如果报Error: Cant open display那就是DISPLAY环境变量没设置或者转发没开。我建议把这个验证步骤固定下来每次换连接方式比如从 WindTerm 换到命令行 SSH都先跑一次xeyes。因为不同 SSH 工具的 X11 转发配置方式不一样有的默认不开有的需要手动勾选。用xeyes做冒烟测试比直接上检测程序再排查要快得多。3.4 OpenCV 窗口在 X11 下的显示问题这里有个非常经典的坑OpenCV 的imshow依赖 GUI 后端。如果你在香橙派上装的 OpenCV 是 headless 版本很多 pip 安装的默认就是cv2.imshow会直接报错或者什么都不显示。检查方法import cv2 print(cv2.getBuildInformation())在输出里找GUI那一行。如果是GUI: NONE那就是 headless 版本需要换成带 GUI 支持的版本。在香橙派上更省事的做法是用系统包管理器装sudo apt install python3-opencv系统源里的 OpenCV 通常带 GTK 后端配合 X11 转发能正常显示。如果你非要用 pip 版本得找带 GUI 的 wheel或者自己编译那就麻烦了。另一个坑是cv2.waitKey(1)的返回值。在 X11 转发环境下窗口的响应会有一点延迟waitKey的返回值处理不当会导致窗口卡死。建议至少给 1ms 的等待不要用waitKey(0)那会阻塞整个循环。4. 把计时和回传整合进同一个循环4.1 整合后的循环骨架现在把前面两块拼起来。核心思路是计时照常累加但显示部分做成可开关的方便你对比开显示和不开显示的性能差异。import cv2 import time SHOW_WINDOW True # 通过命令行参数或环境变量控制 STAT_INTERVAL 30 while True: t0 time.perf_counter() ret, frame cap.read() if not ret: break t1 time.perf_counter() input_data preprocess(frame) t2 time.perf_counter() outputs rknn.inference(inputs[input_data]) t3 time.perf_counter() frame postprocess(outputs, frame) t4 time.perf_counter() if frame_count WARMUP_FRAMES: t_capture (t1 - t0) t_preprocess (t2 - t1) t_inference (t3 - t2) t_postprocess (t4 - t3) frame_count 1 if SHOW_WINDOW: cv2.imshow(RK3588 YOLOv5s, frame) if cv2.waitKey(1) 0xFF ord(q): break if frame_count % STAT_INTERVAL 0: # 输出统计 ...4.2 开显示与不开显示的耗时对比这是整合之后最有价值的一个实验。同一段视频、同一个模型分别跑一次开显示和不开显示对比数据。我实测下来的典型结果是这样的配置推理段总耗时FPS不开显示45ms78ms12.8开 X11 显示45ms95ms10.5可以看到推理段完全没变多出来的 17ms 全在显示环节。这 17ms 里包含了图像编码、通过 SSH 隧道传输、本地解码显示的全过程。这个数据告诉你X11 转发是有成本的但成本可控。如果你追求极致帧率可以只在需要观察的时候开显示如果只是调试阶段10 FPS 完全够用。提示如果显示环节耗时超过 50ms检查一下传输的画面分辨率。把显示用的帧单独 resize 到 640 宽再 imshow能显著降低传输量而检测本身还是在原分辨率上做的。4.3 用环境变量控制显示开关硬编码SHOW_WINDOW True不灵活。更好的做法是用环境变量这样同一条 SSH 命令可以切换模式import os SHOW_WINDOW os.environ.get(SHOW_WINDOW, 1) 1运行时# 开显示 SHOW_WINDOW1 python3 detect.py # 不开显示纯测性能 SHOW_WINDOW0 python3 detect.py这样你在做性能基准测试的时候一条命令就能关掉显示不用改代码。5. 实测中那些文档不会告诉你的坑5.1 SSH 断线导致程序中断这是最烦人的问题之一。你跑着一个长循环SSH 一断程序跟着就死了。原因是程序挂在了 SSH 的会话上会话结束收到 SIGHUP 信号就退出了。解决办法是用nohup或者tmux# 方式一nohup 重定向 nohup python3 detect.py detect.log 21 # 方式二tmux推荐 tmux new -s detect python3 detect.py # CtrlB 然后 D 脱离会话用 tmux 的好处是随时能tmux attach -t detect回去看实时输出而且 X11 转发在 tmux 里也能正常工作前提是连接时带了-X。但要注意如果你脱离 tmux 之后重新 attachDISPLAY变量可能已经失效需要重新设置。5.2 X11 转发下的画面撕裂与延迟X11 转发传视频画面偶尔会出现撕裂或者明显延迟。这通常不是代码问题而是传输链路的问题。几个缓解方向降低显示帧率不必每帧都 imshow可以每 2 帧显示一次缩小显示尺寸检测在原图做显示用缩略图用cv2.resizeWindow固定窗口大小避免窗口自适应带来的重绘开销if SHOW_WINDOW and frame_count % 2 0: display cv2.resize(frame, (640, 480)) cv2.imshow(RK3588 YOLOv5s, display) cv2.waitKey(1)5.3 计时数据被日志输出污染前面提过 print 的开销这里再强调一次。如果你在循环里每帧都 print 检测结果那计时数据基本不可信。我建议把检测结果的输出也做成每 N 帧一次或者干脆写到文件里不要走终端。# 不好的做法每帧都 print # print(f检测到 {len(boxes)} 个目标) # 好的做法累积后定期输出 if frame_count % STAT_INTERVAL 0: print(f最近 {STAT_INTERVAL} 帧平均检测到 {avg_boxes:.1f} 个目标)5.4 不同 SSH 工具的 X11 配置差异命令行ssh -X是最标准的。但很多人用图形化 SSH 工具比如 WindTerm、MobaXterm 之类这些工具的 X11 转发配置位置各不相同有的默认开启有的藏在设置深处。我的建议是调试 X11 相关问题时先用命令行 ssh -X 确认链路本身没问题再去折腾图形工具的配置。这样能把链路问题和工具配置问题分开排查效率高很多。5.5 板子上的 DISPLAY 变量在 sudo 下丢失如果你需要用sudo运行程序比如访问某些硬件设备会发现DISPLAY变量没了X11 转发失效。原因是 sudo 默认不继承环境变量。解决办法sudo -E python3 detect.py-E保留环境变量。或者显式传递sudo DISPLAY$DISPLAY python3 detect.py这个坑很隐蔽因为程序能跑只是窗口不显示你会以为是 X11 配置问题其实是 sudo 把变量吃了。6. 从计时数据反推优化方向6.1 取流段慢先查解码方式如果计时显示取流段占了总时间的一半以上优先怀疑解码没走硬件。RK3588 有专门的视频解码单元VPU用ffmpeg或者 GStreamer 的硬件解码管线能大幅降低 CPU 占用和延迟。用 OpenCV 的VideoCapture读 RTSP 流时默认可能走的是软件解码。可以尝试指定后端cap cv2.VideoCapture(rtsp_url, cv2.CAP_GSTREAMER)配合 GStreamer 的mppvideodecRK3588 的硬件解码插件效果更好。具体管线字符串要根据你的流格式调整这块内容比较多值得单独一篇来讲。6.2 推理段慢检查 NPU 频率和模型量化推理段如果超过 80ms先确认模型是不是 INT8 量化的。FP16 甚至 FP32 的模型在 NPU 上跑会慢很多。然后检查 NPU 的工作频率cat /sys/class/devfreq/fdab0000.npu/cur_freq如果频率偏低可能是温控降频或者 governor 设置保守。可以手动拉高echo performance | sudo tee /sys/class/devfreq/fdab0000.npu/governor注意拉满频率会增加功耗和发热长时间跑要注意散热。香橙派加个散热片或者小风扇是基本操作。6.3 后处理段慢NMS 是重灾区后处理里最耗时的通常是 NMS。如果你用的是纯 Python 循环实现的 NMS候选框一多就会爆炸。换成 OpenCV 的cv2.dnn.NMSBoxes或者 numpy 向量化实现速度能提升一个数量级。另外yolov5s 的输出候选框数量可以通过置信度阈值提前过滤减少进入 NMS 的框数。6.4 预处理段慢避免不必要的拷贝预处理里常见的浪费是反复的内存拷贝和颜色空间转换。比如先把 BGR 转 RGB又转回来或者用 PIL 处理完再转 numpy。统一用 OpenCV numpy 处理减少中间对象。resize 的时候用cv2.INTER_LINEAR就够别用INTER_CUBIC后者慢不少而且对检测精度提升有限。7. 一个完整的可复现实验流程把上面所有东西串起来给你一个可以直接照着做的流程确认基础环境香橙派上 SSH 服务正常X11Forwarding yes已配置OpenCV 带 GUI 支持验证 X11 链路本地ssh -X连上跑xeyes确认窗口能弹出来跑基线SHOW_WINDOW0 python3 detect.py记录四段耗时和 FPS这是你的性能基线开显示对比SHOW_WINDOW1 python3 detect.py对比显示环节的额外开销定位瓶颈看哪一段占比最高对照第 6 节的排查方向逐个验证优化后复测每次只改一个变量改完重新跑基线确认优化有效这个流程的关键是一次只改一个东西。我见过太多人一口气改五个地方结果性能提升了也不知道是哪个改动起的作用下次遇到问题还是不会排查。8. 关于这套组合的一些个人体会X11 转发这个方案说实话在局域网内用着很舒服配置简单、不用装额外软件、延迟也能接受。但它的定位是调试工具不是生产方案。如果你要做的是一个长期运行的检测系统最终还是要走 Web 推流比如 MJPEG 或者 WebRTC或者本地 HDMI 输出X11 转发只适合开发阶段快速看效果。计时这块我现在的习惯是任何新管线第一步就埋计时哪怕当时不优化。因为性能数据是有时效性的你今天不测明天改了代码就再也回不到那个状态了。而且分段计时的代码写一次就能复用成本极低收益极高。最后分享一个小技巧把计时统计结果同时写一份到 CSV 文件里跑完之后用 pandas 画个趋势图能看出耗时随时间的漂移。有时候性能问题是渐进式的比如内存泄漏、温度上升降频单看平均值发现不了看趋势就一目了然。这个习惯帮我抓到过好几次隐蔽的降频问题。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从漏洞挖掘到安全编码:C/C++ 现代内存安全防御实战 2026/9/30 1:43:46

从漏洞挖掘到安全编码:C/C++ 现代内存安全防御实战

从漏洞挖掘到安全编码:C/C 现代内存安全防御实战在过去的软件安全工程实践中,安全团队往往扮演着“消防员”的角色——在项目上线前进行渗透测试、在代码合规审计中挑毛病,或者通过 Fuzzing 抓取 Crash 后再催促业务团队打补丁。 然而&#x…

阅读更多 →
Transformer语音去噪论文全解析:核心架构、训练细节与工程实践 2026/9/30 1:43:46

Transformer语音去噪论文全解析:核心架构、训练细节与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CI/CD 智能化九月全景总结:把智能诊断与自动化自愈做进每日工作流 2026/9/30 1:43:46

CI/CD 智能化九月全景总结:把智能诊断与自动化自愈做进每日工作流

CI/CD 智能化九月全景总结:把智能诊断与自动化自愈做进每日工作流在现代软件交付流水线(CI/CD)的日常运转中,“流水线变红”曾经是每一个开发者最不想面对的心智折磨: 开发者为了查一个简单的 Lint 警告或偶发的网络超…

阅读更多 →
女娲 Nuwa.skill 全解析:如何用 Agent Skills 标准蒸馏任何人的思维方式与认知框架 2026/9/30 1:43:33

女娲 Nuwa.skill 全解析:如何用 Agent Skills 标准蒸馏任何人的思维方式与认知框架

AI 技能AI 插件人工智能 【免费下载链接】nuwa-skill 你想蒸馏的下一个员工,何必是同事。蒸馏任何人的思维方式——心智模型、决策启发式、表达DNA。Distill how anyone thinks. 项目地址: https://gitcode.com/gh_mirrors/nu/nuwa-skill 点击查看 免费下…

阅读更多 →
Nuclei 多协议模板执行引擎解析:multiproto 如何串联协议队列并共享动态值 2026/9/30 1:43:33

Nuclei 多协议模板执行引擎解析:multiproto 如何串联协议队列并共享动态值

网络安全应用安全漏洞扫描 【免费下载链接】nuclei Nuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. I…

阅读更多 →
30 Seconds of Code 实战:用 `git add --renormalize` 修复仓库中错误的行尾(Line Endings) 2026/9/30 1:43:33

30 Seconds of Code 实战:用 `git add --renormalize` 修复仓库中错误的行尾(Line Endings)

教程文档 【免费下载链接】30-seconds-of-code Coding articles to level up your development skills 项目地址: https://gitcode.com/gh_mirrors/30/30-seconds-of-code 点击查看 免费下载 导读 在跨平台协作或长期维护的 Git 仓库中,CRLF 与 LF 行尾…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉