理解 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.pswp.cn/pingmian/77032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77032.shtml
英文地址,請注明出處:http://en.pswp.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;…