You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YOLOv5读取YouTube直播流每隔n帧做目标检测的配置方法

YOLOv5直播流隔帧检测实现方案

你要的每隔10帧取1帧做推理的需求,LoadStreams类本身已经内置了跳帧逻辑,只是默认硬编码为逐帧读取,没有开放配置入口,两种实现方式按需选就行:

方案1:修改源码(性能最优,无额外开销)

直接修改utils/dataloaders.py下的LoadStreams类,三步就能搞定:

  • 第一步:修改类初始化方法的定义,新增跳帧间隔参数,把__init__方法头改成:
def __init__(self, sources='streams.txt', img_size=640, stride=32, auto=True, frame_interval=10):

frame_interval传10就是每10帧处理1帧,你可以根据自己的需求改默认值。

  • 第二步:在__init__方法内self.auto = auto这行的下方,加一行代码把间隔参数存为类属性:
self.frame_interval = frame_interval
  • 第三步:修改update方法里的硬编码跳帧值,找到update方法内这行:
n, f, read = 0, self.frames[i], 1  # frame number, frame array, inference every 'read' frame

把里面硬编码的1换成self.frame_interval,改完是:

n, f, read = 0, self.frames[i], self.frame_interval  # 每read帧取1帧做推理

改完之后,后台读流线程会自动跳过不需要的帧,只把间隔到的帧存到缓存供推理使用,不会产生无效的内存占用,也不会因为跳帧导致流连接中断、帧堆积的问题。
如果你是用官方的detect.py脚本跑,只需要在脚本的命令行参数配置里加一个--frame-interval的参数,就能在启动命令里自定义间隔帧数,不用每次改源码。

方案2:不修改源码,外层逻辑跳帧

如果不想改动官方源码避免后续升级冲突,可以直接在推理循环外层加帧计数,跳过不需要推理的帧即可:

# 配置隔10帧处理1次
frame_interval = 10
frame_idx = 0

# 正常初始化流加载器
dataset = LoadStreams(sources=youtube_live_url, img_size=640, stride=32, auto=True)
for path, img, im0s, _, _ in dataset:
    frame_idx += 1
    # 没到间隔帧数直接跳过,不做推理
    if frame_idx % frame_interval != 0:
        continue
    # 下方写正常的模型推理、后处理、结果绘制逻辑
    # pred = model(img)
    # ...

这个方案的缺点是后台读流线程还是会逐帧读取直播流到内存,只是跳过了推理步骤,相比方案1会多消耗一点CPU和内存资源,但是改动量最小,完全不碰官方源码。

内容的提问来源于stack exchange,提问作者Abhishake A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:45:33