You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YOLO v8批量推理无时间优势:问题排查与正确实现方法

YOLOv8批量推理无性能提升的问题分析与解决

问题原因

  1. 输入图像尺寸不统一:你的代码注释掉了resize操作,不同帧(或重复加载的视频源)尺寸可能存在差异,YOLOv8无法将尺寸不一致的图像打包成单个batch处理,只能逐个推理,总耗时自然等于单张耗时×数量。
  2. show=True的额外开销:实时显示64张图像会占用大量CPU/GPU资源,渲染和窗口绘制的成本远高于推理本身,直接抵消了批量推理的性能优势。
  3. 未显式配置批量参数:默认情况下predict方法可能未自动启用最优批量处理逻辑,需要显式指定batch参数来触发批量推理。

正确实现YOLOv8批量推理的步骤

1. 统一输入图像尺寸

YOLOv8默认输入尺寸为640×640,必须将所有帧resize到该尺寸(或模型训练时使用的输入尺寸),确保满足批量推理的输入格式要求。

2. 关闭实时显示

批量推理阶段优先关闭show=True,如果需要可视化,可在推理完成后统一处理结果。

3. 显式指定批量参数

在predict方法中设置batch参数,同时确保模型运行在GPU上。

修正后的代码示例

from ultralytics import YOLO
import cv2
import time
import torch

# 加载模型并指定GPU设备
model = YOLO("./Models/yolov8x.pt").to('cuda')
# 统一模型输入尺寸(YOLOv8默认640×640,可按需调整)
input_size = (640, 640)

camera_list = []
for _ in range(64):
    cap = cv2.VideoCapture(r"E:\Python_Project\demo_video.mp4")
    if not cap.isOpened():
        print("无法打开视频文件")
        exit()
    camera_list.append(cap)

try:
    while True:
        camera_frames = []
        for cap in camera_list:
            ret, frame = cap.read()
            if not ret:
                # 视频读取完毕后重置指针,循环读取
                cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
                ret, frame = cap.read()
                if not ret:
                    break
            # 统一resize到模型要求的输入尺寸
            frame_resized = cv2.resize(frame, input_size)
            camera_frames.append(frame_resized)
        
        if not camera_frames:
            break
        
        # 批量推理计时
        start_time = time.time()
        # 显式指定batch大小,关闭实时显示,强制使用GPU
        results = model.predict(source=camera_frames, batch=64, show=False, device='cuda')
        elapsed = time.time() - start_time
        
        print(f"64张图批量推理耗时: {elapsed*1000:.2f}ms")
        print(f"单张平均耗时: {(elapsed*1000)/64:.2f}ms")

finally:
    # 释放所有视频捕获资源
    for cap in camera_list:
        cap.release()
    cv2.destroyAllWindows()

额外优化建议

  • 预处理为张量:手动将图像转换为PyTorch张量并堆叠成batch,减少模型内部的预处理开销:
    # 将resize后的图像转换为RGB张量并归一化
    tensor_list = [torch.from_numpy(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)).permute(2,0,1).float()/255.0 for frame in camera_frames]
    batch_tensor = torch.stack(tensor_list).to('cuda')
    # 直接传入张量进行推理
    results = model(batch_tensor)
    
  • 简化后处理:如果不需要详细的检测结果格式,可以通过predict的参数关闭部分后处理步骤(如verbose=False),进一步提升速度。

内容的提问来源于stack exchange,提问作者Tanay Ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:46