使用 Ultralytics 的 YOLO 模型對視頻進行逐幀目標檢測非常簡單,以下是完整的實現方法:
我們的輸入視頻是這樣的
視頻目標檢測輸入視頻
這里是天津市和平區天津大學附近,感興趣的小伙伴來天津玩哈!!
1. 安裝依賴
確保已安裝最新版 ultralytics
和 opencv-python
:
pip install ultralytics opencv-python
2. 基礎代碼實現
以下代碼將讀取輸入視頻,逐幀檢測并保存結果視頻:
from ultralytics import YOLO
import cv2# 加載YOLO模型(可選模型:yolov8n.pt, yolov8s.pt, yolov8m.pt等)
model = YOLO('yolov8m.pt') # 會自動下載預訓練模型# 輸入輸出視頻路徑
input_video = 'input1.mp4'
output_video = 'output1.mp4'# 打開視頻文件
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))# 創建VideoWriter對象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video, fourcc, fps, (width, height))# 逐幀處理
while cap.isOpened():ret, frame = cap.read()if not ret:break# 使用YOLO檢測當前幀results = model(frame)# 在幀上繪制檢測結果annotated_frame = results[0].plot() # 自動繪制邊界框和標簽# 寫入輸出視頻out.write(annotated_frame)# 釋放資源
cap.release()
out.release()
print(f"處理完成!結果已保存到 {output_video}")
3. 關鍵功能擴展
(1) 只檢測特定類別
results = model(frame, classes=[0, 14]) # 只檢測人(class 0)和鳥(class 14)
(2) 調整置信度閾值
results = model(frame, conf=0.5) # 只顯示置信度≥50%的檢測
(3) 保存檢測數據(JSON/CSV)
for result in results:boxes = result.boxes # 邊界框信息for box in boxes:class_id = box.cls # 類別IDconf = box.conf # 置信度xyxy = box.xyxy # 框坐標[x1,y1,x2,y2]print(f"Class: {class_id}, Confidence: {conf}, Box: {xyxy}")
(4) 處理攝像頭實時流
cap = cv2.VideoCapture(0) # 0表示默認攝像頭
4. 性能優化技巧
(1) 使用GPU加速
model = YOLO('yolov8n.pt').to('cuda') # 如果有NVIDIA GPU
(2) 跳幀處理(提升速度)
frame_count = 0
while cap.isOpened():ret, frame = cap.read()frame_count += 1if frame_count % 3 != 0: # 每3幀處理1次continue# 檢測代碼...
(3) 降低分辨率
small_frame = cv2.resize(frame, (640, 360)) # 縮小幀尺寸
results = model(small_frame)
5. 完整案例:車輛檢測并計數
from collections import defaultdictvehicle_classes = [2, 3, 5, 7] # 汽車、摩托車、公交車、卡車
counter = defaultdict(int)while cap.isOpened():ret, frame = cap.read()results = model(frame, classes=vehicle_classes)for result in results:for box in result.boxes:class_id = int(box.cls)class_name = model.names[class_id]counter[class_name] += 1# 在幀上顯示計數for i, (name, count) in enumerate(counter.items()):cv2.putText(frame, f"{name}: {count}", (10, 30*(i+1)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)out.write(frame)
6. 常見問題解決
Q1: 視頻輸出無法播放
- 確保安裝了正確的視頻編碼器(如
fourcc = cv2.VideoWriter_fourcc(*'avc1')
) - 嘗試輸出為
.avi
格式
Q2: 檢測速度慢
- 換用更小的模型(如
yolov8n.pt
→yolov8n-seg.pt
) - 啟用半精度推理:
model = YOLO('yolov8n.pt', half=True) # FP16加速
Q3: 如何檢測自定義對象?
- 準備標注好的數據集(YOLO格式)
- 訓練自定義模型:
model.train(data='custom.yaml', epochs=100)
檢測結果如下
視頻目標檢測結果
YOLOv8 提供的不同模型(如 yolov8n.pt
、yolov8s.pt
、yolov8m.pt
)主要在 模型大小、計算量 和 檢測精度 之間進行權衡。以下是它們的詳細區別和適用場景:
核心區別對比
模型代號 | 全稱 | 參數量 (Parameters) | 計算量 (FLOPs) | 推理速度 (FPS) ? | 精度 (mAP50-95) 🎯 | 適用場景 |
---|---|---|---|---|---|---|
n | Nano | ~3.2M | ~8.7G | 最高 | 較低 | 移動端/嵌入式設備、實時性要求高的場景 |
s | Small | ~11.4M | ~28.6G | 高 | 中等 | 平衡速度和精度(最常用) |
m | Medium | ~26.3M | ~78.9G | 中等 | 較高 | 對精度有要求的中等算力設備 |
l | Large | ~43.7M | ~165.2G | 較低 | 高 | 服務器/高性能GPU環境 |
x | XLarge | ~68.2M | ~257.8G | 最低 | 最高 | 學術研究或極端精度需求 |
性能直觀對比
(1) 精度(mAP50-95)
yolov8n < yolov8s < yolov8m < yolov8l < yolov8x
- 示例:在COCO數據集上,
yolov8x
比yolov8n
的 mAP 高約 15-20%,但速度慢 5-10 倍。
(2) 推理速度(FPS)
yolov8n > yolov8s > yolov8m > yolov8l > yolov8x
- 實測數據(RTX 3090, 640x640輸入):
yolov8n
: 300+ FPSyolov8s
: 150-200 FPSyolov8x
: 50-80 FPS
如何選擇模型?
選擇依據:
-
硬件能力:
- 手機/樹莓派 → 選
n
或s
- 中等GPU(如GTX 1660) → 選
s
或m
- 高端GPU(如RTX 4090) → 選
l
或x
- 手機/樹莓派 → 選
-
應用場景:
- 實時視頻檢測(如攝像頭監控) →
n
/s
- 高精度需求(如醫學圖像分析) →
m
/l
- 學術論文對比實驗 →
x
- 實時視頻檢測(如攝像頭監控) →
-
延遲 vs 精度:
- 如果允許 100ms 延遲:
m
是理想選擇 - 要求 <30ms 延遲:必須用
n
或s
- 如果允許 100ms 延遲:
模型文件大小對比
模型 | 文件大小(.pt格式) | 備注 |
---|---|---|
yolov8n | ~6MB | 適合資源嚴格受限的環境 |
yolov8s | ~22MB | 通用場景的性價比之選 |
yolov8m | ~50MB | 需要更高精度的移動端部署 |
yolov8l | ~87MB | 服務器端應用 |
yolov8x | ~134MB | 極少用于生產環境 |
實際效果示例
場景:行人檢測(COCO數據集)
模型 | 檢測到的人數 | 誤檢數 | 漏檢數 |
---|---|---|---|
yolov8n | 85 | 5 | 10 |
yolov8s | 92 | 3 | 3 |
yolov8m | 94 | 2 | 1 |
進階建議
- 量化壓縮:對
n
/s
模型使用 TensorRT 或 ONNX 量化,可進一步提升速度。 - 自定義訓練:小模型(如
n
)在數據量少時容易欠擬合,建議至少 10,000+ 標注數據再用m
/l
。 - 任務類型:同一模型有不同任務版本(如
yolov8n-seg.pt
用于分割,比檢測版略慢)。
總結
yolov8n.pt
:極致輕量,適合邊緣設備。yolov8s.pt
:最佳平衡,推薦大多數項目首選。yolov8m.pt
:需要精度但算力有限的場景。yolov8l/x.pt
:除非有極端精度需求,否則謹慎選擇。
根據你的硬件和需求,從 s
或 m
開始實驗通常是最穩妥的選擇! 🚀