当前位置: 首页 > news >正文

YOLO-V8 通过英特尔 OpenVINO 提高 CPU 推理速度

一、OpenVINO 加速 YOLO-V8 CPU 推理

在本专栏的前面几篇文章我们使用 YOLO-V8 进行了各种任务的实验,但是针对与推理速度一直使用的 PyTorch 的格式,并且很多情况下也是在 CPU 上推理的,实际运行速度其实不是非常的理想。而OpenVINO 是一款由英特尔推出的深度学习推理引擎,可以帮助开发者高效地在各种硬件平台上部署深度学习模型,特别是英特尔的 CPU 上,因此本文借助 OpenVINO 实现对 YOLO-V8 CPU 上的推理加速。

OpenVINO GitHub 地址:https://github.com/openvinotoolkit/openvino

关于 YOLO-V8 的介绍和使用,可以参考下面这篇文章:

https://xiaobichao.blog.csdn.net/article/details/137140038

本文使用 ultralytics 框架进行实验,而 ultralytics 框架针对格式的转换已经做好了封装,只需要通过 model.export 方法,便可以转到多种不同格式的模型,支持的格式如下:

格式format模型元数据论据
PyTorch-yolov8n.pt-
TorchScripttorchscriptyolov8n.torchscriptimgsz, optimize, batch
ONNXonnxyolov8n.onnximgsz, half, dynamic, simplify, opset, batch
OpenVINOopenvinoyolov8n_openvino_model/imgsz, half, int8, batch
TensorRTengineyolov8n.engineimgsz, half, dynamic, simplify, workspace, int8, batch
CoreMLcoremlyolov8n.mlpackageimgsz, half, int8, nms, batch
TF SavedModelsaved_modelyolov8n_saved_model/imgsz, keras, int8, batch
TF GraphDefpbyolov8n.pbimgsz, batch
TF 轻型tfliteyolov8n.tfliteimgsz, half, int8, batch
TF 边缘TPUedgetpuyolov8n_edgetpu.tfliteimgsz
TF.jstfjsyolov8n_web_model/imgsz, half, int8, batch
PaddlePaddlepaddleyolov8n_paddle_model/imgsz, batch
NCNNncnnyolov8n_ncnn_model/imgsz, half, batch

下面过程使用的依赖版本如下:

ultralytics==8.1.37
opencv-python==4.7.0.68
openvino==2024.3.0
openvino-dev==2024.3.0
openvino-telemetry==2024.1.0

首先我的设备 CPU 是一款比较老的 i5-10300H ,使用 yolov8n.pt 模型实时推理速度,平均 FPS 只有 8.83,平均每帧模型推理速度 0.078s ,处理过程如下:

import timeimport cv2
import supervision as sv
from ultralytics import YOLO
from supervision.assets import download_assets, VideoAssets# 如果不存在则下载视频
video_name = download_assets(VideoAssets.VEHICLES)
# 加载 YoloV8n 模型,如果不存在会自动下载
model = YOLO("yolov8n.pt")# 初始化展现对象
corner_annotator = sv.BoxCornerAnnotator(corner_length=15,thickness=2,color=sv.Color(r=255, g=255, b=0)
)
# 读取视频
cap = cv2.VideoCapture(video_name)
# 初始化计时器
prev_tick = cv2.getTickCount()
while True:# 循环读取每一帧ret, frame = cap.read()# 由于原视频帧比较大,方便处理和后面展现,缩小一些frame = cv2.resize(frame, (1280, 720))if not ret:breakt = time.time()result = model(frame,device="cpu")[0]use_time = time.time() - tdetections = sv.Detections.from_ultralytics(result)# 绘制边框frame = corner_annotator.annotate(frame, detections=detections)# 计算帧率current_tick = cv2.getTickCount()fps = cv2.getTickFrequency() / (current_tick - prev_tick)prev_tick = current_tickcv2.putText(frame, ("FPS: {:.2f}".format(fps)) + ", USE_TIME: " + str(use_time), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1,(0, 255, 0), 2)cv2.imshow('video', frame)cv2.waitKey(1)

在这里插入图片描述

下面将 yolov8n.pt 模型转为 OpenVINO 格式:

需要添加 openvino 依赖:

pip install openvino-dev -i https://pypi.tuna.tsinghua.edu.cn/simple

转换:

from ultralytics import YOLO# 加载 YoloV8n 模型,如果不存在会自动下载
model = YOLO("yolov8n.pt")# 导出 openvino 模型
model.export(format="openvino", imgsz=[640,640])

可以在当前目录下看到导出的模型:

在这里插入图片描述

使用 OpenVINO 模型推理:

import timeimport cv2
import supervision as sv
from ultralytics import YOLO
from supervision.assets import download_assets, VideoAssets# 如果不存在则下载视频
video_name = download_assets(VideoAssets.VEHICLES)model = YOLO("yolov8n_openvino_model")
# 初始化展现对象
corner_annotator = sv.BoxCornerAnnotator(corner_length=15,thickness=2,color=sv.Color(r=255, g=255, b=0)
)
# 读取视频
cap = cv2.VideoCapture(video_name)
# 初始化计时器
prev_tick = cv2.getTickCount()
while True:# 循环读取每一帧ret, frame = cap.read()# 由于原视频帧比较大,方便处理和后面展现,缩小一些frame = cv2.resize(frame, (1280, 720))if not ret:breakt = time.time()result = model(frame,device="cpu")[0]use_time = time.time() - tdetections = sv.Detections.from_ultralytics(result)# 绘制边框frame = corner_annotator.annotate(frame, detections=detections)# 计算帧率current_tick = cv2.getTickCount()fps = cv2.getTickFrequency() / (current_tick - prev_tick)prev_tick = current_tickcv2.putText(frame, ("FPS: {:.2f}".format(fps)) + ", USE_TIME: " + str(use_time), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1,(0, 255, 0), 2)cv2.imshow('video', frame)cv2.waitKey(1)

在这里插入图片描述

可以明显看到 FPS 由原先的 8.83 提高到 14.26 ,模型推理处理速度由之前 0.078s 降低到 0.039s


http://www.mrgr.cn/news/6866.html

相关文章:

  • 银行业数字化转型中知识图谱在大模型火热背景下的应用分析
  • 网络编程TCP与UDP
  • 【HarmonyOS 4.0】全局UI方法
  • 基于Kotlin Multiplatform实现静态文件服务器(四)
  • leetcode:2520. 统计能整除数字的位数(python3解法)
  • STM32 —— TIM(基本定时器)详解_stm32的tim
  • 【实现100个unity特效之25】Unity中实现二次元模型,基于光照的内置和URP管线卡通化渲染shader
  • 【Spring进阶】掌握Spring MVC框架核心注解:从基础到实战应用(实战指南)
  • TK小店引流新策略:TK系统全解析
  • 遗传算法原理与实战(python、matlab)
  • Java-BatchProcessingUtil结合CompletableFuture工具类
  • HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)
  • 守护核心命脉:国家网络安全战略下的关键基础设施保护
  • linux:进程间的通信
  • Centos7 message日志因dockerd、kubelet、warpdrive、containerd等应用迅速增长
  • 深入探索Objective-C的NSOrthography:拼写检查的艺术与科学
  • 2024-07-12 - 基于 sealos 部署高可用 K8S 管理系统
  • PPTP、L2TP、IPSec、IPS 有什么区别?
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (六)
  • 存在重复元素 III