使用 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
开始实验通常是最稳妥的选择! 🚀