如何在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
相关产品推荐
相关产品推荐

