【YOLO 入门到精通 08】推理预测完全指南:多数据源、流式推理与性能优化
标签:
YOLO推理流式推理predict性能优化Results对象
难度:⭐⭐⭐ | 阅读时长:约 60 分钟 | 系列:第 08/12 集
前置:07 验证评估 | 下一集:09 目标跟踪

写在前面
训练评估之后,模型要真正「干活」——处理图片、视频、摄像头、RTSP 流。本集是 推理的工程实战手册:不只教 model(img),更教你怎么在生产环境稳定、高效地跑推理。
本集学习目标
- 掌握全部推理数据源及用法
- 使用 stream 模式处理长视频
- 调优 conf/imgsz/batch 等参数
- 集成到 Flask 等应用
文章目录
8.1 推理模式概览
| 特点 | 说明 |
|---|---|
| 多源 | 图/视频/摄像头/URL/流 |
| 流式 | stream=True 省内存 |
| 批量 | batch=N 提吞吐 |
| 可定制 | conf/iou/imgsz/classes |
8.2 推理数据源大全
| 来源 | 示例 | stream | 说明 |
|---|---|---|---|
| 图片 | 'img.jpg' | ❌ | 单张 |
| 目录 | 'images/' | ✅ | 批量 |
| 视频 | 'v.mp4' | ✅ | MP4/AVI |
| URL | 'https://...' | ❌ | 网络图 |
| 摄像头 | 0 | ✅ | 设备索引 |
| PIL | Image.open() | ❌ | RGB |
| OpenCV | cv2.imread() | ❌ | BGR ndarray |
| RTSP | 'rtsp://...' | ✅ | 监控流 |
| YouTube | 'https://youtu.be/...' | ✅ | 在线视频 |
| Glob | '*.jpg' | ✅ | 通配符 |
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model("img.jpg") # 路径
model("images/") # 目录
model("video.mp4") # 视频
model(source=0) # 摄像头
model("rtsp://ip/stream") # RTSP
8.3 流式推理
长视频必须用
stream=True,否则所有帧结果堆在内存里会 OOM。
results = model.predict(source="long_video.mp4", stream=True, save=True)
for result in results:
n = len(result.boxes)
# 处理完即释放,内存稳定
实时摄像头
import cv2
results = model.predict(source=0, stream=True, show=False)
for r in results:
frame = r.plot()
cv2.imshow("YOLO", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
8.4 推理参数详解
| 参数 | 默认 | 说明 | 调优 |
|---|---|---|---|
conf | 0.25 | 置信度阈值 | 误检↑conf,漏检↓conf |
iou | 0.7 | NMS IoU | 重复框↓iou |
imgsz | 640 | 输入尺寸 | 小目标↑imgsz |
max_det | 300 | 最大检测数 | 密集场景调大 |
classes | None | 过滤类别 | [0,2] 只检人/车 |
half | False | FP16 | GPU 加速 |
device | auto | 设备 | 0/cpu |
batch | 1 | 批次 | 目录推理可增大 |
rect | True | 最小矩形填充 | 导出模型匹配用 False |
results = model.predict(
source="street.jpg",
conf=0.5,
classes=[0, 2, 5],
imgsz=1280,
save=True,
save_txt=True,
save_crop=True,
line_width=2,
)
8.5 Results 对象深入
r = results[0]
# 属性
r.orig_img, r.orig_shape, r.path, r.speed
r.boxes # 检测
r.masks # 分割
r.keypoints # 姿态
# 提取数据
xyxy = r.boxes.xyxy.cpu().numpy()
conf = r.boxes.conf.cpu().numpy()
cls = r.boxes.cls.cpu().numpy()
# 可视化
r.show()
r.save("out.jpg")
img = r.plot() # BGR ndarray
8.6 性能优化
| 技巧 | 方法 | 效果 |
|---|---|---|
| GPU | device=0 | 5~10x |
| FP16 | half=True | 1.5~2x |
| 小模型 | yolo26n | 2~5x |
| 小尺寸 | imgsz=320 | 2~4x |
| 批量 | batch=8 | 1.5~2x |
| 导出 | TensorRT | 2~5x |
import time
model = YOLO("yolo26n.pt")
model("warmup.jpg", verbose=False)
times = []
for _ in range(100):
t0 = time.time()
model("test.jpg", verbose=False)
times.append(time.time() - t0)
print(f"平均: {sum(times)/len(times)*1000:.1f}ms, FPS: {len(times)/sum(times):.1f}")
8.7 应用集成示例
Flask API
from flask import Flask, request, jsonify
from ultralytics import YOLO
import cv2, numpy as np, base64
app = Flask(__name__)
model = YOLO("best.pt")
@app.route("/detect", methods=["POST"])
def detect():
img_b64 = request.json["image"]
arr = np.frombuffer(base64.b64decode(img_b64), np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
results = model(img, conf=0.5)
dets = [{
"class": model.names[int(b.cls[0])],
"conf": float(b.conf[0]),
"bbox": b.xyxy[0].tolist(),
} for b in results[0].boxes]
return jsonify({"detections": dets})
# uvicorn 用户可换 FastAPI,逻辑相同
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
视频处理管道
def process_video(inp, out, model_path="yolo26n.pt"):
model = YOLO(model_path)
cap = cv2.VideoCapture(inp)
fps = int(cap.get(cv2.CAP_PROP_FPS)) or 30
w, h = int(cap.get(3)), int(cap.get(4))
writer = cv2.VideoWriter(out, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
for r in model.predict(inp, stream=True):
writer.write(r.plot())
cap.release(); writer.release()
8.8 踩坑指南
| 坑 | 解决 |
|---|---|
| 长视频 OOM | stream=True |
| 无 GUI 无法 show | save=True |
| RTSP 断流 | 加重连逻辑 |
| 导出模型尺寸不匹配 | rect=False, imgsz=固定值 |
| 推理比训练慢很多 | 检查是否在用 CPU |
8.9 常见问题 FAQ
Q1:model() 和 model.predict()?
A:完全等价。
Q2:能并发处理多路流吗?
A:可以,每路独立 model 实例或线程池。
8.10 本集小结
| 场景 | 推荐 |
|---|---|
| 单图 | model("img.jpg") |
| 批量 | model("dir/", batch=16) |
| 长视频 | stream=True |
| 监控 | stream=True + RTSP |
| ← 第07集 | 第09集:目标跟踪 → |
|---|
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_43025151/article/details/167039389




