Real-time Inference
实时推理会在下一条输入到达前返回每个预测结果,例如在 30 FPS 下,每帧的处理时间不超过 33 ms。涵盖延迟预算和加速方法。
实时推理是指在实时输入上运行训练好的模型,并在下一次输入到达前返回每次预测结果,让系统能在信息仍然有效时采取行动。摄像头以每秒 30 帧 (FPS) 的速度流式传输时,每帧有 33.3 毫秒用于从读取图像到生成最终结果的所有操作;帧率达到 60 FPS 时,时间预算会缩短至 16.7 ms。每种应用都有自己的截止时间:汽车的感知系统、传送带检测摄像头和视频通话背景滤镜都需要实时运行,但时间预算各不相同。
延迟预算#
需要关注的是端到端推理延迟:捕获帧、通过调整尺寸和归一化进行预处理、模型前向传播,以及解码边界框和非极大值抑制 (NMS)等后处理。总时间超过帧间隔时,尚未处理的帧就会堆积起来,输出会越来越落后于实时画面,因此实时流水线通常会丢弃过时帧,始终处理最新帧。实时计算会区分硬实时系统和软实时系统:对安全气囊控制器等硬实时系统来说,错过截止时间就意味着失败;软实时系统则能容忍偶尔错过截止时间。大多数计算机视觉应用都属于软实时系统:丢帧会让输出质量短暂下降,下一帧就能恢复。
此代码片段将录制的视频流传入小型检测器,并将每帧平均耗时与 30 FPS 的时间预算进行比较:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov"
# stream=True yields each frame's result as soon as it is ready
frame_times = []
for result in model(video, stream=True):
# Preprocess, inference, and postprocess time for this frame, in milliseconds
frame_times.append(sum(result.speed.values()))
mean_ms = sum(frame_times) / len(frame_times)
print(f"{mean_ms:.1f} ms per frame ({1000 / mean_ms:.0f} FPS); a 30 FPS camera allows 33.3 ms")平均耗时低于 33.3 ms,意味着模型能在运行它的硬件上跟上 30 FPS 的摄像头。
实时推理与批量推理对比#
- 实时(在线)推理: 输入到达后立即处理,通常一次处理一张图像,评估标准是每次预测的延迟。驾驶辅助、机器人控制和实时视频分析都依赖实时推理。
- 批量(离线)推理: 收集多个输入并一并处理,评估标准是每秒处理的输入数量(吞吐量)和成本。夜间为照片档案重新编制索引或分析上个月的录像都属于批量任务;较大的批次能让 GPU 更充分地工作,但每个输入都要等待更久才能得到结果。
处理多个摄像头流的服务器通常介于两者之间:将不同摄像头的帧分成小批次,以提高吞吐量,同时确保不超出每个视频流的帧时间预算。
实际应用#
- 自动驾驶汽车: 汽车以 100 km/h 行驶时,每 100 ms 会前进 2.8 米,因此感知延迟会直接增加制动距离。
- 制造业检测: 传送带上方的摄像头会检测每个零件是否存在缺陷,并且必须在缺陷零件经过剔除装置前触发剔除机制。
- 机器人: 障碍物检测和姿态估计在机器人的控制循环中运行;感知速度越慢,机器人就必须移动得越慢。
- 视频特效和增强现实: 视频通话背景模糊和 AR 叠加效果会在每一帧上运行分割或跟踪;任何延迟都会让叠加效果落后于移动的人物。
让模型达到所需速度#
- 缩小模型或输入尺寸: 较小的模型变体每张图像所需的运算更少;由于卷积计算量大致随像素数量增长,将输入的宽度和高度减半,会使计算量降至约四分之一,但小目标准确率可能会有所下降。
- 模型量化: 使用 FP16 或 INT8 而非 FP32 存储权重和激活值,可减少内存流量并使用更快的运算单元。INT8 通常需要一组校准图像,以尽量减小准确率损失。
- 推理引擎: 针对某类硬件构建的运行时会融合层,并为设备选择经过调优的内核,例如用于 NVIDIA GPU 的 TensorRT,或用于 Apple 设备的 Core ML。
- 边缘 AI: 在摄像头或嵌入式模块上运行模型,可以免去云端调用的网络往返延迟;在连接速度较慢时,这种延迟可能超过整个帧时间预算。
运行时和硬件会让延迟相差十倍以上:nano YOLO26 模型在搭配 ONNX的CPU上处理一张 640 像素图像需要 38.9 毫秒,而在搭载 TensorRT 的 NVIDIA T4 GPU上仅需 1.7 毫秒。Ultralytics 的导出模式可将训练好的 YOLO26 模型转换为 TensorRT、OpenVINO、LiteRT等格式;其 quantize=16 或 quantize=8 参数可为目标设备生成 FP16 或 INT8 权重。










