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

【计算机视觉】Openvino给yolov5目标检测提速实战

1.摘要

目标检测是计算机视觉主要应用方向之一。目标检测通常包括两方面的工作,首先是找到目标,然后就是识别目标。常用的目标检测方法分为两大流派:一步走(one_stage)算法:直接对输入的图像应用算法并输出类别和相应的定位,典型的算法有yolo,ssd;两步走(two_stage)算法:先产生候选区域,然后在进行CNN分类,代表的算法有R-CNN。其中一步走目标检测算法检测速度快,实时性好,在模型的快速部署上有着很强的优势,被广泛应用在各行各业中。本文也将选择yolov5算法对目标物体进行目标预测。训练好模型要部署在不同的边缘端,才会产生价值,本文将采用Openvino(Open Visual Inferencing and Neural Network Optimization/ 开放视觉推理和神经网络优化)来部署目标检测模型,Openvino是一个用于解决在intel硬件平台上进行深度学习部署的方案,支持windows、linux和macOS,有效地避免了不同软硬件平台兼容性的问题。

2.yolov5如何实现目标检测?

如何采用yolov5训练自己的数据,我已经在之前的博客里详细讲了训练过程,参照博客:【计算机视觉】目标检测—yolov5自定义模型的训练以及加载-https://blog.csdn.net/qq_43018832/article/details/128054360?spm=1001.2014.3001.5502。本文为了方便起见,不再进行训练自己的数据,将yolov5官方的预训练模型进行Openvino加速,查看加速效果。首先,去yolov5官网(https://github.com/ultralytics/yolov5)进行下载官方文件,也可以通过克隆地址(git clone https://github.com/ultralytics/yolov5.git)进行获取,并且下载预训练权重文件,放到yolov5文件下。结果如图:
在这里插入图片描述
运行下面的代码detection_show.py,在运行之前,首先安装yolov5文件下的requirements里面的依赖包,命令:pip install -r requirements.txt,运行后可以看到yolov5的官方预训练模型的检测结果,我使用的是笔记本,帧率只有2,3,如下图所示:

import cv2
import numpy as np
import torch
import time# local repo
model = torch.hub.load('./yolov5', 'custom', 'weights/yolov5n.pt',source='local')
model.conf = 0.4cap = cv2.VideoCapture(0)fps_time = time.time()while True:ret,frame = cap.read()# frame = cv2.flip(frame,1)img_cvt = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# Inferenceresults = model(img_cvt)result_np = results.pandas().xyxy[0].to_numpy()for box in result_np:l,t,r,b = box[:4].astype('int')       cv2.rectangle(frame,(l,t),(r,b),(0,255,0),5)cv2.putText(frame,str(box[-1]),(l,t-20),cv2.FONT_ITALIC,1,(0,255,0),2)now = time.time()fps_text = 1/(now - fps_time)fps_time =  nowcv2.putText(frame,str(round(fps_text,2)),(50,50),cv2.FONT_ITALIC,1,(0,255,0),2)cv2.imshow('demo',frame)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

在这里插入图片描述

3.Openvino如何加速模型?

3.1.原理简介

要使用它,你需要一个预先训练好的深度学习模型,支持的格式有:TensorFlow、PyTorch、PaddlePaddle、MXNet、Caffe、Kaldi或ONNX,本文选用的是yolov5官方预训练模型yolov5n.pt,读者可以训练自己的预训练模型。模型优化器将模型转换为OpenVINO中间表示格式(IR),稍后您可以使用OpenVINO™运行时进行推断。注意,模型优化器不推断模型。下图说明了部署经过训练的深度学习模型的典型工作流。
在这里插入图片描述
模型优化器通过以下机制来优化模型:
  1. 对模型进行修剪:移除部分在训练时候需要的,而推理时候不需要的网络;DropOut 就是这种网络层的一个例子;
  2. 融合操作:有些时候多步操作可以融合成一步,模型优化器检测到这种就会进行必要的融合;
优化过程结束后会生成一个 IR model / 中间表示模型,模型可以被分成两部分:
  1. model.xml: XML 文件包含网络架构;
  2. model.bin: bin 包含 Weights / 权重 和 Biases / 误差的二进制数据。

3.2.环境配置

首先,我们在安装openvino之前,使用conda创建自己的虚拟环境,安装pytorch CPU版本,命令:pip install torch torchvision torchaudio。接下来,将pytorch预训练模型转化为ONNX,安装依赖的环境ONNX,命令:pip install onnx==1.11.0,最后将转换为的onnx文件转换为openvino需要的.bin和.xml文件,安装依赖包:pip install openvino-dev[onnx],pip install openvino。

3.3.预训练模型.pt转ONNX文件

接下来,开始吧!将预训练模型yolov5n.pt转换为ONNX文件,可以直接使用yolov5中的文件export.py文件,此文件的作用是将yolov5 pytorch模型转换为各种格式(onnx,tensorrt,coreml,tensorflow等等)的文件。
执行命令为:

python export.py --weights yolov5n.pt --include onnx --img 640 --device 0

也可以通过执行下面代码转换为onnx格式。

if not onnx_path.exists():dummy_input = torch.randn(1, 3, IMAGE_HEIGHT, IMAGE_WIDTH)# For the Fastseg model, setting do_constant_folding to False is required# for PyTorch>1.5.1torch.onnx.export(model,dummy_input,onnx_path,opset_version=11,do_constant_folding=False,)print(f"ONNX model exported to {onnx_path}.")
else:print(f"ONNX model {onnx_path} already exists.")

转换后的结果如下。
在这里插入图片描述

3.4.ONNX文件转IR文件

使用模型优化器将ONNX模型转换为具有FP16精度的OpenVINO IR。模型被保存到当前目录。向模型中添加平均值,并使用——scale_values按标准偏差缩放输出。有了这些选项,在通过网络传播输入数据之前就没有必要对其进行规范化。有关模型优化器的更多信息,请参阅模型优化器开发人员指南https://docs.openvino.ai/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html。转换为IR文件的命令格式如下:

# Construct the command for Model Optimizer.
mo_command = f"""mo--input_model "{onnx_path}"--input_shape "[1,3, {IMAGE_HEIGHT}, {IMAGE_WIDTH}]"--mean_values="[123.675, 116.28 , 103.53]"--scale_values="[58.395, 57.12 , 57.375]"--data_type FP16--output_dir "{model_path.parent}""""
mo_command = " ".join(mo_command.split())
print("Model Optimizer command to convert the ONNX model to OpenVINO:")
display(Markdown(f"`{mo_command}`"))if not ir_path.exists():print("Exporting ONNX model to IR... This may take a few minutes.")mo_result = %sx $mo_commandprint("\n".join(mo_result))
else:print(f"IR model {ir_path} already exists.")

命令行为:

mo --input_model yolov5n.onnx --model_name openvino_yolov5n_part1 -s 255 --reverse_input_channels --output Conv294,conv245

出现这种情况,代表模型转换成功。
在这里插入图片描述

4.查看加速结果

最后使用推理引擎查看推理结果。

# Load the network in OpenVINO Runtime.
ie = Core()
model_ir = ie.read_model(model=ir_path)
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")# Get input and output layers.
output_layer_ir = compiled_model_ir.output(0)# Run inference on the input image.
res_ir = compiled_model_ir([input_image])[output_layer_ir]result_mask_ir = np.squeeze(np.argmax(res_ir, axis=1)).astype(np.uint8)
viz_result_image(image,segmentation_map_to_image(result=result_mask_ir, colormap=CityScapesSegmentation.get_colormap()),resize=True,
)

为了直观的看出加速结果,在不影响检测效果的前提下,丢弃部分小目标检测,查看加速结果提升至9.8帧。
在这里插入图片描述
本篇简单记录了作者在学习openvino加速模型的过程,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/391999.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

【计算机视觉】Openvino给yolov5目标检测提速实战

1.摘要 目标检测是计算机视觉主要应用方向之一。目标检测通常包括两方面的工作,首先是找到目标,然后就是识别目标。常用的目标检测方法分为两大流派:一步走(one_stage)算法:直接对输入的图像应用算法并输出…...

超声波测距LCD1602显示

超声波测距模块:1、采用IO口TRIG触发测距,给至少10us的高电平信号;2、模块自动发送8个40khz的方波,自动检测是否有信号返回;3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声…...

Python应用程序打包

Python应用程序打包 PyInstaller将Python应用程序及其所有依赖项捆绑到一个包中。 用户可以运行打包的应用程序,而无需安装 Python 解释器或任何模块。 项目结构: Python应用程序打包项目示例 demo data students.json [{"name": "花千…...

软件设计师(软考中级)_下午题Java题总结

创建型设计模式 创建模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象;创建模式的主导思想为,将系统使用的具体类封装起来,隐藏这些具体类的实例创建和结合的方式。 创建型设计模式主要有:抽象…...

OAuth2(3)

目录 一、利用redis集成jwt 1.认证服务器 2.资源所有者 3.资源服务器 4.主要了解client(客户) 一、利用redis集成jwt 目的: 1.将grant code变成动态的 2.将授权流程进行界面化展示 客户:京东(关联跳转第三方授权…...

在Nginx中让所有HTTP请求转发到HTTPS

title: 在Nginx中让所有HTTP请求转发到HTTPS date: 2017-10-23 20:50:24 tags: nginxhttphttps categories:运维 背景 在启用HTTPS协议的网站上,通常会让用户始终以 https:// 访问,那怎样来实现这个需求呢?首次想到的是在应用代码中实现&am…...

LeetCode 2176. 统计数组中相等且可以被整除的数对

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k &#xff0c;请你返回满足 0 < i < j < n &#xff0c;nums[i] nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。 示例 1&#xff1a; 输入&#xff1a;nums [3,1,2,2,2,1,3], k 2 输出&…...

【Spark分布式内存计算框架——Spark 基础环境】3. 快速入门(下)案例:词频统计、 运行圆周率

词频统计WordCount 大数据框架经典案例&#xff1a;词频统计WordCount&#xff0c;从文件读取数据&#xff0c;统计单词个数。 MapReduce WordCount 首先回顾一下MapReduce框架如何实现&#xff0c;流程如下图所示&#xff1a; 第一步、Map阶段&#xff1a;读取文件数据&…...

Python issubclass和isinstance函数:检查类型

Python 提供了如下两个函数来检查类型&#xff1a;issubclass(cls, class_or_tuple)&#xff1a;检查 cls 是否为后一个类或元组包含的多个类中任意类的子类。isinstance(obj, class_or_tuple)&#xff1a;检查 obj 是否为后一个类或元组包含的多个类中任意类的对象。通过使用上…...

仲裁期间投的简历竟被转发给原公司,原公司HR给我发截图,并转达老板威胁:老板行业圈子广,仲裁公司,以后投简历都是这个下场!...

论某些公司能有多恶心&#xff1f;下面是一位网友的遭遇&#xff1a;仲裁期间投的简历竟然被原公司HR发给自己截图&#xff0c;看来是投递简历的公司又转给了原公司&#xff0c;还转达老板原话威胁他&#xff1a;老板行业圈子广&#xff0c;仲裁公司&#xff0c;以后投的简历都…...

技术面面试高频考点总结-C++篇

文章目录技术面面试高频考点总结-C篇一、C常考考点枚举二、C基础推荐学习资料三、小结技术面面试高频考点总结-C篇 大家好呀&#xff0c;这里是小黛&#xff01; 在技术面面试中&#xff0c;除了考察一些基础的计算机知识外&#xff0c;对语言掌握情况的考察&#xff0c;也是…...

Docker搭建php开发环境

1. 第一步拉去需要的镜像(根据个人需要, 获取对应版本) 2. 创建自己的docker网络, 默认桥接模式 ➜ ~ docker network create mynet 32c681d46c036dd9450e45f8930d7520f47f9fbb2df83c6348752d56683bcee5 ➜ ~ docker network ls NETWORK ID NAME DRIVER SCOPE 4a…...

运动蓝牙耳机哪个品牌好?运动型蓝牙耳机推荐

国内运动耳机品牌的兴起对外国品牌带了不小的冲击。在国内运动消费市场快速增长的今天&#xff0c;运动耳机市场的竞争也是相当的激烈。谁能吃下这块大蛋糕&#xff0c;当然是要用实力说话了。今天小编就来盘点一下市场上的明星产品&#xff0c;是骡子是马拉出来溜溜。 1、南卡…...

深度学习初识

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

基于Java+SpringBoot+SpringCloud+vue的智慧养老平台设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、…...

02_Python 学习基础

1\ 核心汇总更新python更新的通知 PEP 1 : PEP 1 – PEP Purpose and Guidelines | peps.python.org PEP 0 : PEP 0 – Index of Python Enhancement Proposals (PEPs) | peps.python.org​​​​​​ PEP 8 &#xff1a;编码规范 PEP 8 – Style Guide for Python Code | pep…...

elasticsearch7.17.3 实现类似mysql的like查询

前言&#xff1a;现在想要实现在elasticsearch中类似于mysql的like查询方式&#xff0c;有下面几种方法可以参考 建议&#xff1a;wildcard方法是纯纯的like查询方式平替&#xff0c;但是性能差&#xff0c;上百GB的数据量后就会很慢。根据自己业务量需求&#xff0c;前面两种方…...

IT知识百科:什么是802.1X?

一、引言 网络安全是企业和个人必须关注的问题。随着网络技术的发展&#xff0c;网络安全威胁也日益增加。802.1X是一个基于端口的网络访问控制协议&#xff0c;可以保护企业网络安全。在本文中&#xff0c;我们将介绍802.1X的基本原理、应用场景以及未来的发展方向。 二、802…...

IOC/DI注解开发管理第三方bean

IOC/DI注解开发管理第三方bean4&#xff0c;IOC/DI注解开发管理第三方bean4.1 环境准备4.2 注解开发管理第三方bean步骤1:导入对应的jar包步骤2:在配置类中添加一个方法步骤3:在方法上添加Bean注解步骤4:从IOC容器中获取对象并打印4.3 引入外部配置类4.3.1 使用包扫描引入步骤1…...

适合新手使用的视频模版制作工具 操作简单易上手

在现代社会&#xff0c;短视频已经成为了人们表达自己、传达信息的重要方式之一。随着社交媒体和短短视频平台的流行&#xff0c;越来越多的人开始将短视频作为自己的创作方式。为了制作出有创意的短视频&#xff0c;除了创意和想象力&#xff0c;好的视频模版制作工具也是不可…...