1.1
简介
本文章将在《自训练Pytorch模型使用 OpenVINO 优化并部署在英特尔开发套件》文章的基础上进行扩展,将介绍如何使用 OpenVINO Python API 对 YOLOv5 模型进行优化以及部署,完成 YOLOv5 目标检测任务。
本文 Python 程序的开发环境是 Ubuntu20.04 LTS + PyCharm,硬件平台是英特尔开发套件爱克斯开发板 AIxBoard。
本文项目背景:针对 2023 第十一届全国大学生光电设计竞赛赛题 2 “迷宫寻宝”光电智能小车题目。基于该赛项宝藏样式,我通过深度学习训练出能分类四种不同颜色不同标记形状骨牌的模型,骨牌样式详见图 1.1。
图1.1 四种骨牌类型
1.2
YOLOv5 以及目标检测
YOLO (You Only Look Once) 是目标检测模型,目标检测是计算机视觉中一种重要的任务,目的是在一张图片中找出特定的物体,同时要求识别物体的种类和位置。在此之前的文章中 Pytorch 模型是用于图像分类,只要求识别画面中物体的种类。具体的区别通过图 1.2.1 直观可知。
图 1.2.1 图像分类、目标定位、目标检测
01
通过 labelImg 对图像进行数据集构建
Labelimg 是一款数据标注软件,支持输出包括 yolo, PascalVOC 等格式标注数据,这里我们选择 yolo 格式即可。
在环境中执行:
pip install labelimg -i https://mirror.baidu.com/pypi/simple
而后打开 labelimg 软件,如图 1.2.2
图 1.2.2 labelImg 软件界面
如图所示,选择好图片数据目录 (Open Dir) 和数据标注保存目录 (Choose Save Dir),就可以对想要的物体进行人工的数据标注。
02
标注好后检查保存目录中的 label 文件,查看是否无误,如图 1.2.3
图 1.2.3 标注好的文件
03
本次实验共标注 2000 张图片(单分类 500 张共 4 分类)具体训练流程在 YOLOv5 Github 有较为详细的教程,在此不作为重点讲解。得到 YOLOv5 模型后通过 OpenVINO Model Optimization 转化成 IR 模型,这样无论从处理速度还是精度都能获得一定程度的优化。
1.3
使用 OpenVINO Runtime 对 YOLOv5 模型进行推理
在这一章节里我们将在 Pycharm 中使用 OpenVINO Runtime 对我们训练的 YOLOv5 模型进行优化推理。
整个推理流程大致可以分为:
推理核心初始化 → 对输入图进行预处理 → 输入到推理引擎获得结果 → 通过置信度/NMS(非极大值抑制)过滤得到结果 → 将结果通过 OpenCV API 进行可视化
1.3.1
导入功能包
import openvino.runtime as ov import cv2 import numpy as np import openvino.preprocess as op
本次我们导入四个功能包,分别是 OpenVINO Runtime & PreProcess 、Numpy 、OpenCV。与之前不同在于我们需要使用 OpenVINO 自带的预处理 API 对我们的模型进行一个预先处理,使得模型能够正常工作在 OpenVINO 的推理引擎下。
PreProcess API 介绍:
OpenVINO PreProcess 是 OpenVINO Python API 大家庭的一员,主要是提供了一个 OpenVINO Runtime 原生用于数据预处理的 API 函数库,在不用 PreProcess 时,开发者需要用第三方库例如 OpenCV 来对其进行预处理,但是 OpenCV 作为一个开源的、广泛的功能库,数据预处理只能加载到 CPU 去进行实现,这无疑是增加对 CPU 资源的开销,并且之后需要将处理后数据再次返还到 iGPU 等计算设备进行推理。而 PreProcess 提供了一种方式,使得预处理也能直接集成到模型执行图中去,整个模型工作流程都在 iGPU 上流转,这样无需依赖 CPU,能提高执行效率。
由于输入数据的不同,我们需要预处理来将数据能够正确的进行处理。例如改变精度、改变输入颜色通道、输入数据的 Layout 等等。
整体 PreProcess 的流程大概是:
创建 PPP(PrePostProcess) 对象 → 声明输入数据信息 → 指定 Layout →设置输出张量信息 → 从 PPP 对象中构建 Model 并进行推理
可以明显得知,PreProcess 的存在使得预处理变得非常简单易懂,只需要在在转换前查看模型的输入输出信息,再比对自己环境下的输入数据,进行预处理改变即可。而且整个环境都可以在 iGPU 等计算设备上运行,减轻了 CPU 负担,可以把更多宝贵的资源留在处理其他重要事情上。
1.3.2
模型载入
将模型进行载入:
def Init(): global core global model global compiled_model global infer_request #核心创建 core = ov.Core() #读取用YOLOv5模型转换而来的IR模型 model = core.read_model("best2.xml", "best2.bin") #运用PPP(PrePostProcessor)对模型进行预处理 Premodel = op.PrePostProcessor(model) Premodel.input().tensor().set_element_type(ov.Type.u8).set_layout(ov.Layout("NHWC")).set_color_format(op.ColorFormat.BGR) Premodel.input().preprocess().convert_element_type(ov.Type.f32).convert_color(op.ColorFormat.RGB).scale( [255., 255., 255.]) Premodel.input().model().set_layout(ov.Layout("NCHW")) Premodel.output(0).tensor().set_element_type(ov.Type.f32) model = Premodel.build() compiled_model = core.compile_model(model, "CPU") #加载模型,可用CPU or GPU infer_request = compiled_model.create_infer_request() #生成推理
1.3.3
图像尺寸调整
由于输入图的尺寸不确定性,在此我们特意加入一个 Resize 环节,用来适应不同分辨率的图像,但是若输入图像尺寸较为稳定,只需要求出其变换图的长宽比例即可。
def resizeimg(image, new_shape): old_size = image.shape[:2] #记录新形状和原生图像矩形形状的比率 ratio = float(new_shape[-1] / max(old_size)) new_size = tuple([int(x * ratio) for x in old_size]) image = cv2.resize(image, (new_size[1], new_size[0])) delta_w = new_shape[1] - new_size[1] delta_h = new_shape[0] - new_size[0] color = [100, 100, 100] new_im = cv2.copyMakeBorder(image, 0, delta_h, 0, delta_w, cv2.BORDER_CONSTANT, value=color) #增广操作 return new_im, delta_w, delta_h
1.3.4
推理过程以及结果展示
在上一节中我们把输入图像所要进行的预处理图像进行了一个定义,在这一小节则是 OpenVINO Runtime 推理程序的核心。
#************************************# # 推理主程序 # def main(img,infer_request): push =[] img_re,dw,dh = resizeimg(img,(640,640)) #尺寸处理 input_tensor = np.expand_dims(img_re, 0) #获得输入张量 infer_request.infer({0: input_tensor}) #输入到推理引擎 output = infer_request.get_output_tensor(0) #获得推理结果 detections = output.data[0] #获得检测数据 boxes = [] class_ids = [] confidences = [] for prediction in detections: confidence = prediction[4].item() #获取置信度 if confidence >= 0.6: #初步过滤,过滤掉绝大多数的无效数据 classes_scores = prediction[5:] _, _, _, max_indx = cv2.minMaxLoc(classes_scores) class_id = max_indx[1] if (classes_scores[class_id] > .25): confidences.append(confidence) class_ids.append(class_id) x, y, w, h = prediction[0].item(), prediction[1].item(), prediction[2].item(), prediction[3].item() #获取有效信息 xmin = x - (w / 2) #由于NMSBoxes缘故,需要从中心点得到左上角点 ymin = y - (h / 2) box = np.array([xmin, ymin, w, h]) #记录数据 boxes.append(box) indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.5) #NMS筛选 detections = [] for i in indexes: j = i.item() detections.append({"class_index": class_ids[j], "confidence": confidences[j], "box": boxes[j]}) #储存获取的目标名称和框选位 for detection in detections: box = detection["box"] classId = detection["class_index"] confidence = detection["confidence"] if(confidence<0.88): #再次过滤 continue else : push.append(classId) rx = img.shape[1] / (img_re.shape[1] - dw) ry = img.shape[0] / (img_re.shape[0] - dh) img_re = cv2.rectangle(img_re, (int(box[0]), int(box[1])), (int(box[0] + box[2]), int(box[1] + box[3])), (0, 255, 0), 3) box[0] = rx * box[0] #恢复原尺寸box,如果尺寸不变可以忽略 box[1] = box[1] *ry box[2] = rx * box[2] box[3] = box[3] *ry xmax = box[0] + box[2] ymax = box[1] + box[3] img = cv2.rectangle(img, (int(box[0]), int(box[1])), (int(xmax), int(ymax)), (0, 255, 0), 3) #绘制物体框 img = cv2.rectangle(img, (int(box[0]), int(box[1]) - 20), (int(xmax), int(box[1])), (0, 255, 0), cv2.FILLED) #绘制目标名称底色填充矩形 img = cv2.putText(img, str(label[classId])+' '+str(int(confidence*100))+'%', (int(box[0]), int(box[1]) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0)) #绘制目标名称 cv2.imshow("d", img_re) cv2.imshow('w',img) cv2.waitKey(0)
以上推理函数编写已经完成。以下是运行主程序:
#********************主程序***********************# def MainToSolve(infer): img = cv2.imread("boundtest.jpg") #如果需要实时,只需要将输入img变成从摄像机抓取的帧画面 main(img,infer) #从这里开始,初始化以及推理 Init() MainToSolve(infer_request)
当我们运行该程序时,会得到如图 1.3.1。
图 1.3.1 图像结果
如图所示,YOLOv5 模型通过转换成IR模型,再经过 PPP 预处理以及 Runtime 引擎,成功运行在 AlxBoard。整体上性能非常不错。
1.4
模型应用场景简述:
原先的 Pytorch 模型只完成了图像分类的任务,本文通过 YOLOv5 训练并运用 OpenVINO 技术来完成了目标检测这一更高难度的任务,通过得到物块的位置我们就能更好的给予小车底盘信息,用来精确对物块进行任务(抓取或是推到)
搭载 AlxBoard 的四轮小车如图 1.4.1。
图 1.4.1 AlxBoard 智能小车
通过此小车,我们还能发挥想象去做更多的应用场景,通过 OpenVINO 赋能小车系统,我们还能实现例如空对地无图导航等等更具有特色的应用场景。
1.5
结论
自训练 YOLOv5 模型在通过 OpenVINO Model Optimizer 模型优化后用 OpenVINO PreProcess 先进行预处理,处理后用 OpenVINO Runtime 进行推理,推理过程简单清晰。推理整个过程由于加入了 PPP(PrePostProcess) 的预处理技术,整个处理可以放在 iGPU 上运行,有效减少 CPU 的开销。通过 OpenVINO 技术优化后的模型优势明显,加上 AlxBoard 开发者板,能让我们迅速构建起智能小车来验证系统。
OpenVINO 简单易上手,提供了健全的文档和 OpenVINO Notebooks 范例,帮助开发者专注在自身应用的实现和算法搭建。
-
英特尔
+关注
关注
61文章
10149浏览量
173685 -
模型
+关注
关注
1文章
3471浏览量
49866 -
开发套件
+关注
关注
2文章
165浏览量
24539 -
深度学习
+关注
关注
73文章
5549浏览量
122351
原文标题:自训练 YOLOv5 模型使用 OpenVINO™ 优化并部署在英特尔开发套件 | 开发者实战
文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
基于C#和OpenVINO™在英特尔独立显卡上部署PP-TinyPose模型
请问如何在imx8mplus上部署和运行YOLOv5训练的模型?
怎样使用PyTorch Hub去加载YOLOv5模型
英特尔BOOT Loader开发套件-高级嵌入式开发基础

在英特尔独立显卡上部署YOLOv5 v7.0版实时实例分割模型
在C++中使用OpenVINO工具包部署YOLOv5模型
基于OpenVINO在英特尔开发套件上实现眼部追踪
使用英特尔哪吒开发套件部署YOLOv5完成透明物体目标检测


半导体芯片需要做哪些测试
首先我们需要了解芯片制造环节做⼀款芯片最基本的环节是设计->流片->封装->测试,芯片成本构成⼀般为人力成本20%,流片40%,封装35%,测试5%(对于先进工艺,流片成本可能超过60%)。测试其实是芯片各个环节中最“便宜”的一步,在这个每家公司都喊着“CostDown”的激烈市场中,人力成本逐年攀升,晶圆厂和封装厂都在乙方市场中“叱咤风云”,唯独只有测试显

解决方案 | 芯佰微赋能示波器:高速ADC、USB控制器和RS232芯片——高性能示波器的秘密武器!
示波器解决方案总述:示波器是电子技术领域中不可或缺的精密测量仪器,通过直观的波形显示,将电信号随时间的变化转化为可视化图形,使复杂的电子现象变得清晰易懂。无论是在科研探索、工业检测还是通信领域,示波器都发挥着不可替代的作用,帮助工程师和技术人员深入剖析电信号的细节,精准定位问题所在,为创新与发展提供坚实的技术支撑。一、技术瓶颈亟待突破性能指标受限:受模拟前端

硬件设计基础----运算放大器
1什么是运算放大器运算放大器(运放)用于调节和放大模拟信号,运放是一个内含多级放大电路的集成器件,如图所示:左图为同相位,Vn端接地或稳定的电平,Vp端电平上升,则输出端Vo电平上升,Vp端电平下降,则输出端Vo电平下降;右图为反相位,Vp端接地或稳定的电平,Vn端电平上升,则输出端Vo电平下降,Vn端电平下降,则输出端Vo电平上升2运算放大器的性质理想运算

ElfBoard技术贴|如何调整eMMC存储分区
ELF 2开发板基于瑞芯微RK3588高性能处理器设计,拥有四核ARM Cortex-A76与四核ARM Cortex-A55的CPU架构,主频高达2.4GHz,内置6TOPS算力的NPU,这一设计让它能够轻松驾驭多种深度学习框架,高效处理各类复杂的AI任务。

米尔基于MYD-YG2LX系统启动时间优化应用笔记
1.概述MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A55@1.2GHz+Cortex-M33@200MHz处理器,其内部集成高性能3D加速引擎Mail-G31GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600/DDR3L-1333内存控制器、千兆以太网控制器、USB、CAN、

运放技术——基本电路分析
虚短和虚断的概念由于运放的电压放大倍数很大,一般通用型运算放大器的开环电压放大倍数都在80dB以上。而运放的输出电压是有限的,一般在10V~14V。因此运放的差模输入电压不足1mV,两输入端近似等电位,相当于“短路”。开环电压放大倍数越大,两输入端的电位越接近相等。“虚短”是指在分析运算放大器处于线性状态时,可把两输入端视为等电位,这一特性称为虚假短路,简称

飞凌嵌入式携手中移物联,谱写全国产化方案新生态
4月22日,飞凌嵌入式“2025嵌入式及边缘AI技术论坛”在深圳成功举办。中移物联网有限公司(以下简称“中移物联”)携OneOS操作系统与飞凌嵌入式共同推出的工业级核心板亮相会议展区,操作系统产品部高级专家严镭受邀作《OneOS工业操作系统——助力国产化智能制造》主题演讲。

ATA-2022B高压放大器在螺栓松动检测中的应用
实验名称:ATA-2022B高压放大器在螺栓松动检测中的应用实验方向:超声检测实验设备:ATA-2022B高压放大器、函数信号发生器,压电陶瓷片,数据采集卡,示波器,PC等实验内容:本研究基于振动声调制的螺栓松动检测方法,其中低频泵浦波采用单频信号,而高频探测波采用扫频信号,利用泵浦波和探测波在接触面的振动声调制响应对螺栓的松动程度进行检测。通过螺栓松动检测

MOS管驱动电路——电机干扰与防护处理
此电路分主电路(完成功能)和保护功能电路。MOS管驱动相关知识:1、跟双极性晶体管相比,一般认为使MOS管导通不需要电流,只要GS电压(Vbe类似)高于一定的值,就可以了。MOS管和晶体管向比较c,b,e—–>d(漏),g(栅),s(源)。2、NMOS的特性,Vgs大于一定的值就会导通,适合用于源极接地时的情况(低端驱动),只要栅极电压达到4V或10V就可以

压敏(MOV)在电机上的应用剖析
一前言有刷直流电机是一种较为常见的直流电机。它的主要特点包括:1.结构相对简单,由定子、转子、电刷和换向器等组成;2.通过电刷与换向器的接触来实现电流的换向,从而使电枢绕组中的电流方向周期性改变,保证电机持续运转;3.具有调速性能较好等优点,可以通过改变电压等方式较为方便地调节转速。有刷直流电机在许多领域都有应用,比如一些电动工具、玩具、小型机械等。但它也存

硬件原理图学习笔记
这一个星期认真学习了硬件原理图的知识,做了一些笔记,方便以后查找。硬件原理图分为三类1.管脚类(gpio)和门电路类输入输出引脚,上拉电阻,三极管与门,或门,非门上拉电阻:正向标志作用,给悬空的引脚一个确定的状态三极管:反向三极管(gpio输出高电平,NP两端导通,被控制端导通,电压为0)->NPN正向三极管(gpio输出低电平,PN两端导通,被控制端导通,

TurMass™ vs LoRa:无线通讯模块的革命性突破
TurMass™凭借其高传输速率、强大并发能力、双向传输、超强抗干扰能力、超远传输距离、全国产技术、灵活组网方案以及便捷开发等八大优势,在无线通讯领域展现出强大的竞争力。

RZT2H CR52双核BOOT流程和例程代码分析
RZT2H是多核处理器,启动时,需要一个“主核”先启动,然后主核根据规则,加载和启动其他内核。本文以T2H内部的CR52双核为例,说明T2H多核启动流程。

干簧继电器在RF信号衰减中的应用与优势
在电子测试领域,RF(射频)评估是不可或缺的一部分。无论是研发阶段的性能测试,还是生产环节的质量检测,RF测试设备都扮演着关键角色。然而,要实现精准的RF评估,测试设备需要一种特殊的电路——衰减电路。这些电路的作用是调整RF信号的强度,以便测试设备能够准确地评估RF组件和RF电路的各个方面。衰减器的挑战衰减器的核心功能是校准RF信号的强度。为了实现这一点,衰

ElfBoard嵌入式教育科普|ADC接口全面解析
当代信息技术体系中,嵌入式系统接口作为数据交互的核心基础设施,构成了设备互联的神经中枢。基于标准化通信协议与接口规范的技术架构,实现了异构设备间的高效数据交换与智能化协同作业。本文选取模数转换接口ADC作为技术解析切入点,通过系统阐释其工作机理、性能特征及重要参数,为嵌入式学习者爱好者构建全维度接口技术认知框架。
评论