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

如何在YOLO8+OpenVINO车辆计数器中集成AsyncInferQueue实现异步推理

基于YOLO8与OpenVINO的车辆计数器异步推理集成方案

核心思路:最小侵入式集成AsyncInferQueue

无需重构现有检测、计数逻辑,仅在模型加载与推理环节替换同步推理为异步队列,保留原有预处理、后处理、计数代码完全不变。

分步实现代码示例

1. 初始化AsyncInferQueue(替换原同步推理准备)

原同步推理初始化代码(参考):

from ultralytics import YOLO
from openvino.runtime import Core

# 加载YOLO8模型并转换为OpenVINO格式
model = YOLO("yolov8n.pt")
ov_model = model.export(format="openvino", dynamic=True)

# 同步推理初始化
core = Core()
compiled_model = core.compile_model(ov_model, "CPU")
infer_request = compiled_model.create_infer_request()

替换为异步队列初始化,保留模型加载、导出、编译逻辑:

from openvino.runtime import Core, AsyncInferQueue

# 保留原有模型加载、导出、编译代码
core = Core()
compiled_model = core.compile_model(ov_model, "CPU")

# 初始化异步推理队列,并发数建议设为CPU核心数的1-2倍
async_queue = AsyncInferQueue(compiled_model, jobs=4)

# 绑定回调函数:直接复用原有后处理+计数逻辑
def post_process_callback(request, userdata):
    # userdata传入原始帧,调用你已有的后处理与计数函数
    frame = userdata
    results = request.get_output_tensor().data
    processed_frame, vehicle_count = your_existing_post_process(frame, results)
    # 此处可添加结果展示、存储逻辑
    return processed_frame, vehicle_count

async_queue.set_callback(post_process_callback)

2. 替换同步推理为异步入队

原同步推理流程(参考):

for frame in video_stream:
    # 复用原有预处理逻辑
    input_tensor = your_existing_preprocess(frame)
    # 同步推理
    infer_request.infer(input_tensor)
    results = infer_request.get_output_tensor().data
    # 后处理+计数
    processed_frame, vehicle_count = your_existing_post_process(frame, results)

替换为异步入队,预处理逻辑完全保留:

for frame in video_stream:
    # 复用原有预处理逻辑
    input_tensor = your_existing_preprocess(frame)
    # 将原始帧作为用户数据传入队列,异步执行推理
    async_queue.start_async(input_tensor, userdata=frame)
    # 可选:等待队列空闲,避免内存溢出,可根据视频帧率调整
    async_queue.wait_for_all()

关键注意事项

  • 并发数调整:jobs参数过高会增加CPU上下文切换开销,建议设为CPU核心数的1-2倍。
  • 数据安全:若帧在入队后会被覆盖,可在start_async前对帧做浅拷贝(如frame.copy())。
  • 动态形状适配:YOLO8导出时启用dynamic=True后,AsyncInferQueue会自动适配不同尺寸的输入帧,无需额外处理。
  • 异常捕获:在回调函数中添加异常处理,避免单个推理失败导致队列崩溃:
def post_process_callback(request, userdata):
    try:
        frame = userdata
        results = request.get_output_tensor().data
        processed_frame, vehicle_count = your_existing_post_process(frame, results)
        return processed_frame, vehicle_count
    except Exception as e:
        print(f"Inference error: {e}")
        return userdata, 0

低侵入性说明

  • 原有预处理、后处理、车辆计数逻辑完全复用,无需修改。
  • 仅改动模型初始化和推理循环两个小模块,不影响整体代码架构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:55:53