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
相关产品推荐
相关产品推荐

