理解 results = model(source, stream=True) 的工作原理和优势

1. 核心概念解析

(1) stream=True 的作用
  • 生成器模式:当处理视频或图像序列时,stream=True 会将结果包装成一个 生成器(Generator),逐帧生成 Results 对象,而不是一次性返回所有结果。
  • 内存优化:避免同时加载全部帧的检测结果,显著降低内存占用(尤其对长视频或高分辨率输入至关重要)。
(2) Results 对象生成器
  • 每次迭代返回一个 Results 对象,对应视频的 一帧 或输入列表中的 一个元素
  • 每个 Results 对象包含该帧的检测信息(如 boxesmasks 等)。

2. 工作流程对比

传统方式(stream=False
results = model("video.mp4")  # 一次性处理所有帧
# 所有结果存储在内存中,可能导致OOM(内存不足)
  • 内存峰值高:需缓存整个视频的检测结果。
  • 延迟高:必须等待全部处理完成才能访问结果。
流式处理(stream=True
results = model("video.mp4", stream=True)  # 生成器
for frame_results in results:  # 逐帧处理print(frame_results.boxes)  # 实时访问当前帧结果
  • 内存友好:同一时间仅处理一帧的数据。
  • 实时性:边处理边输出,适合实时分析或长时间视频。

3. 典型使用场景

(1) 视频处理
cap = cv2.VideoCapture("input.mp4")
out = cv2.VideoWriter("output.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 30, (640, 480))# 流式推理
results = model("input.mp4", stream=True)
for frame_results in results:annotated_frame = frame_results.plot()  # 绘制检测框out.write(annotated_frame)  # 写入输出视频
  • 优势:避免因视频过长导致内存爆炸。

- 值得注意,(输出视频只有1KB)通常是由于 视频编解码器配置问题 或 帧尺寸不匹配 导致的。以下是修正后的完整代码,解决写入视频无效的问题:

import cv2
from ultralytics import YOLO# 初始化模型
model = YOLO("../models/yolo11n.pt")  # pretrained YOLO11n model# 输入视频路径
input_video = "../videos/test.mp4"# 读取输入视频获取帧尺寸和FPS
cap = cv2.VideoCapture(input_video)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cap.release()# 定义视频写入器(关键修正点)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 或改用 'avc1' 兼容H.264
out = cv2.VideoWriter("output.mp4",fourcc,fps,(width, height)  # 必须与原始视频尺寸一致!
)# 流式推理
results = model(input_video, stream=True, imgsz=640)  # imgsz可调整for frame_results in results:# 获取带标注的帧(BGR格式)annotated_frame = frame_results.plot()  # 自动返回numpy数组 (H,W,3)# 确保帧尺寸与写入器匹配(额外安全检查)if (annotated_frame.shape[1], annotated_frame.shape[0]) != (width, height):annotated_frame = cv2.resize(annotated_frame, (width, height))# 写入帧out.write(annotated_frame)# 释放资源
out.release()
print(f"视频已保存至 output.mp4,尺寸: {width}x{height}, FPS: {fps}")
(2) 实时摄像头流
results = model(0, stream=True)  # 摄像头ID=0
for frame_results in results:cv2.imshow("Live", frame_results.plot())if cv2.waitKey(1) == ord('q'):  # 按Q退出break
  • 优势:低延迟,适合实时监控。

4. 内存优化原理

处理方式内存占用曲线特点
stream=False外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传内存随帧数线性增长
stream=True外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传内存恒定(仅缓存当前帧)

5. 注意事项

  1. 性能权衡

    • 优点:节省内存,适合资源受限环境。
    • 缺点:总处理时间可能略长(因无法并行处理所有帧)。
  2. 不可逆迭代

    results = model(source, stream=True)
    list(results)  # 第一次迭代后生成器耗尽,再次遍历需重新推理
    
  3. 与多线程结合

    from concurrent.futures import ThreadPoolExecutordef process_frame(frame_results):return frame_results.plot()with ThreadPoolExecutor() as executor:annotated_frames = list(executor.map(process_frame, results))
    

6. 类比解释

  • 传统方式:像一次性下载整部电影再看 → 占用硬盘空间大。
  • 流式处理:像在线边缓冲边播放 → 内存占用稳定。

通过 stream=True,YOLOv8 实现了 高效流水线处理,尤其适合嵌入式设备或大规模视频分析场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新定义“边缘”:边缘计算如何重塑人类与数据的关系

在数字化浪潮中,云计算曾是科技界的宠儿,但如今,边缘计算正在悄然改变游戏规则。它不仅是一种技术进步,更是对人类与数据关系的一次深刻反思。本文将探讨边缘计算如何从“中心化”走向“分布式”,以及它如何在效率、隐…

MCP 协议知识分享

MCP 协议知识分享 一、MCP 协议概述1.1 定义与背景1.2 核心价值1.3 与传统 API 的对比 二、技术架构与工作原理2.1 核心组件2.2 通信机制2.3 典型工作流程 三、关键技术与应用场景3.1 核心技术3.2 典型应用场景 四、与微软技术的集成4.1 Azure OpenAI 服务4.2 Playwright MCP 服…

策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?

Autowire Resource 的区别 1.来源不同:其中 Autowire 是 Spring2.5 定义的注解,而 Resource 是 Java 定义的注解 2.依赖查找的顺序不同: 依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当…

Linux》》bash 、sh 执行脚本

通常使用shell去运行脚本,两种方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引号不能省略 我们知道 -c 的意思是 command,所以 bash -c 或 sh -c 后面应该跟一个 command。

【解析】ReentrantLock锁、Syschronized锁面试点解析

面试官提问 ● 公平锁与非公平锁的区别是什么? ● 什么是可重入锁? ● 什么是死锁,怎样避免死锁? ● ReentrantLock与Syschronized实现原理是什么?两者有什么区别? ● 请说明ReentrantLock获取锁与释放…

04.Python代码NumPy-通过索引或切片来访问和修改

04.Python代码NumPy-通过索引或切片来访问和修改 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ python语法…

跨平台数据采集如何解决不同平台之间的数据兼容性问题?

在数字化时代,企业越来越依赖多个信息系统来管理业务,例如ERP(企业资源计划)、CRM(客户关系管理)、财务管理系统、电商平台等。然而,在进行跨平台数据采集时,不同系统之间的数据格式…

解决 vite.config.ts 引入scss 预处理报错

目录 报错1:[plugin:vite:css] [SASS] Error:Cant find stylesheet to import 报错2:[plugin:vite:css] [sass] Error: Undefined variable 版本号: "sass": "^1.86.3","sass-loader": "^1…

C++笔记,数学函数

参考链接&#xff1a;C中数学函数的使用方法_cpp里指数函数-CSDN博客 头文件 <cmath> 1. 基本的算数运算函数 1.1 sqrt() - 计算平方根 功能&#xff1a;计算一个非负实数的平方根。原型&#xff1a;double sqrt(double x);示例代码&#xff1a; #include <iostr…

不关“猫”如何改变外网IP?3种免重启切换IP方案

每次更换外网IP都要重启路由器&#xff1f;太麻烦了&#xff01;那么&#xff0c;不关猫怎么改变外网IP&#xff1f;无论是为了网络调试、爬虫需求&#xff0c;还是解决IP限制问题&#xff0c;频繁重启设备既耗时又影响效率。其实&#xff0c;更换外网IP并不一定要依赖“重启大…

道路运输安全员企业负责人考试内容与范围

道路运输企业主要负责人&#xff08;安全员&#xff09;考证要求 的详细说明&#xff0c;适用于企业法定代表人、分管安全负责人等需取得的 《道路运输企业主要负责人和安全生产管理人员安全考核合格证明》&#xff08;交通运输部要求&#xff09;。 考试内容与范围 1. 法律法…

深入剖析 WiFi 定位解析功能:原理、技术优势与应用场景

WiFi 定位解析功能的原理​ 信号强度与距离的关系​ WiFi 定位的核心原理基于无线信号传播过程中的一个基本特性&#xff1a;信号强度与信号发射源&#xff08;即 WiFi 接入点&#xff0c;Access Point&#xff0c;简称 AP&#xff09;和接收设备之间距离的关联。一般来说&am…

NVIDIA RTX™ GPU 低成本启动零售 AI 场景开发

零售行业正在探索应用 AI 升级客户体验&#xff0c;同时优化内部流程。面对多重应用场景以及成本优化压力&#xff0c;团队可采用成本相对可控的方案&#xff0c;来应对多重场景的前期项目预演和落地&#xff0c;避免短期内大规模投入造成的资源浪费。 客户体验 AI 场景的研究…

首次打蓝桥杯总结(c/c++B组)

目录 一、对每个题进行总结 1.填空题 2.第一个大题---可分解的正整数&#xff08;10--3&#xff09; 3.第二道大题---产值调整&#xff08;10--3&#xff09; 4.第三道大题---画展部署&#xff08;15--7&#xff09; 5.第四道大题---水质检测&#xff08;15--3&#x…

林纳斯·托瓦兹:Linux系统之父 Git创始人

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 林纳斯托瓦兹&#xff1a;Linux之父、Git创始人 一、传奇人物的诞生 1. 早年生活与家…

C语言多进程素数计算

题目描述&#xff1a; 以下代码实现了一个多进程素数计算程序&#xff0c;通过fork()函数创建子进程来并行计算指定范围内的素数。请仔细阅读代码并回答以下问题。 #include "stdio.h" #include "unistd.h" #include <sys/types.h> #include "…

uniapp-商城-27-vuex 通用方法

1 概述 上节说了vuex 的基本使用方法,分析了基本的使用方法。 在使用中,常见使用,我们要针对状态,购物车,不同类事务的管理,如果按照上节课的通用方法,那么使用和维护是会很大的难度的。 所以这里就必须要进行处理,借助 modules 进行定义不同类事务的处理手段。便于…

半导体设备通信标准—secsgem v0.3.0版本使用说明文档(4)之HSMS(SEMI E37)

文章目录 1、消息快1.1、选择 请求1.2、选择响应1.3、取消选择请求1.4、取消选择响应1.5、Linktest 请求1.6、Linktest 响应1.7、拒绝请求1.8、单独请求1.9、数据消息 2、 协议2.1、 事件 SEMI E37 HSMS 定义主机和设备之间通过 TCP 协议的通信。 它指定用于启动和终止连接的数…

通过GO后端项目实践理解DDD架构

最近在工作过程中重构的项目要求使用DDD架构&#xff0c;在网上查询资料发现教程五花八门&#xff0c;并且大部分内容都是长篇的概念讲解&#xff0c;晦涩难懂&#xff0c;笔者看了一些github上入门的使用DDD的GO项目&#xff0c;并结合自己开发中的经验&#xff0c;谈谈自己对…

Ubuntu系统连网问题

0. Preface 给一台新电脑装上Ubuntu系统后&#xff0c;接好网线&#xff0c;发现上不了网&#xff0c;右上角是有网络连接的图标的&#xff0c;也能获取到ip地址&#xff0c;就是没办法连网&#xff0c;ping www.google.com也没反应。 其实应该是网络设置有点问题&#xff0c;…