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

在英特尔独立显卡上部署YOLOv5 v7.0版实时实例分割模型

作者:贾志刚 英特尔物联网创新大使 

        

目录

1.1 YOLOv5实时实例分割模型简介

1.2 英特尔®消费级锐炫™ A 系列显卡简介

1.3  在英特尔独立显卡上部署YOLOv5-seg模型的完整流程

1.3.1 搭建YOLOv5开发环境和OpenVINO部署环境

1.3.2 验证YOLOv5开发环境和OpenVINO部署环境

1.3.3 导出yolov5s-seg OpenVINO IR模型

1.3.4 使用Netron工具查看yolov5s-seg.onnx 模型的输入和输出

1.3.5 使用OpenVINO Runtime API 编写yolov5s-seg推理

1.4 结论


        本文将介绍在基于OpenVINO在英特尔独立显卡上部署YOLOv5实时实例分割模型的全流程,并提供完整范例代码供读者使用。

1.1 YOLOv5实时实例分割模型简介

 YOLOv5是AI开发者友好度最佳的框架之一,与其它YOLO系列相比:

  • 工程化水平好,工程应用时“坑”少
  • 文档详实友好,易读易懂
  • 既容易在用户的数据集上重训练又容易在不同的平台上进行部署
  • 社区活跃度高(截至2022-11-27有33.2k GitHub星, 287个贡献者)
  • 项目演进速度快
  • 默认支持OpenVINO部署
  • 在典型行业(制造业、农业、医疗、交通等)有广泛应用。

                2022年11月22日,YOLOv5 v7.0版正式发布,成为YOLO系列中第一个支持实时实例分割(Real Time Instance Segmentation)的框架。从此,YOLOv5框架不仅具有实时目标检测模型,还涵盖了图像分类和实例分割。

图片来源: https://github.com/ultralytics/yolov5/releases

        与实时实例分割SOTA性能榜中的模型相比YOLOv5作者发布的YOLOv5-Seg模型数据,无论是精度还是速度,都领先于当前SOTA性能榜中的模型。

1.2 英特尔®消费级锐炫™ A 系列显卡简介

        2022年英特尔发布了代号为Alchemist第一代消费级锐炫™桌面独立显卡,当前英特尔京东自营旗舰店里销售的主要型号为A750A770,其典型参数如下图所示。OpenVINO™ 从2022.2版开始支持英特尔独立显卡,包括英特尔® 数据中心 GPU Flex 系列和英特尔® 锐炫™系列。

1.3  在英特尔独立显卡上部署YOLOv5-seg模型的完整流程

在英特尔独立显卡上部署YOLOv5-seg模型的完整流程主要有三步:

  1. 搭建YOLOv5开发环境和OpenVINO部署环境
  2. 运行模型优化器(Model Optimizer)优化并转换模型
  3. 调用OpenVINO Runtime API函数编写模型推理程序,完成模型部署

本文将按照上述三个步骤,依次详述。

1.3.1 搭建YOLOv5开发环境和OpenVINO部署环境

        最近的YOLOv5 Github 代码仓,即YOLOv5 v7.0,已经将openvino-dev[onnx]写入requirement.txt文件,当执行pip install -r requirements.txt,会安装完YOLOv5开发环境和OpenVINO部署环境。

git clone https://github.com/ultralytics/yolov5  # clonecd yolov5

cd yolov5

pip install -r requirements.txt

1.3.2 验证YOLOv5开发环境和OpenVINO部署环境

        执行完上述命令后,运行命令

python segment\predict.py --source data\images

        执行结果如下图所示,说明YOLOv5开发环境和OpenVINO部署环境已搭建成功。

1.3.3 导出yolov5s-seg OpenVINO IR模型

        使用命令:

python export.py --weights yolov5s-seg.pt --include onnx

        获得yolov5s-seg ONNX格式模型:yolov5s-seg.onnx。

        然后运行命令:

mo -m yolov5s-seg.onnx --data_type FP16

    获得yolov5s-seg IR格式模型:yolov5s-seg.xml和yolov5s-seg.bin。

1.3.4 使用Netron工具查看yolov5s-seg.onnx 模型的输入和输出

        使用Netron(https://netron.app/),查看yolov5s-seg.onnx模型的输入和输出,如下图所示:

从图中可以看出:yolov5s-seg模型

  • 输入节点名字:“images”;数据: float32[1,3,640,640]
  • 输出节点1的名字:“output0”;数据:float32[1,25200,117]。其中117的前85个字段跟YOLOv5定义完全一致,即检测框信息;后32个字段用于计算掩膜数据。
  • 输出节点2的名字:“output1”;数据:float32[1,32,160,160]。Output1的输出与output0后32个字段做矩阵乘法后得到的数据,即为对应目标的掩膜数据。

1.3.5 使用OpenVINO Runtime API 编写yolov5s-seg推理

        由于yolov5s-seg模型是在yolov5模型的基础上增加了掩膜输出分支,所以图像数据的预处理部分跟yolov5模型一模一样。

整个推理程序主要有五个关键步骤:

  • 第一步:创建Core对象;
  • 第二步:载入yolov5s-seg模型,并面向英特尔独立显卡编译模型
  • 第三步:对图像数据进行预处理
  • 第四步:执行AI推理计算
  • 第五步:对推理结果进行后处理,并可视化处理结果。

整个代码框架如下所示:

# Step1: Create OpenVINO Runtime Core

core = Core()

# Step2: Compile the Model, using dGPU A770m

net = core.compile_model("yolov5s-seg.xml", "GPU.1")

output0, output1 = net.outputs[0],net.outputs[1]

b,n,input_h,input_w = net.inputs[0].shape # Get the shape of input node

# Step3: Preprocessing for YOLOv5-Seg

# ...

# Step 4: Do the inference

outputs = net([blob])

pred, proto = outputs[output0], outputs[output1]

# Step 5 Postprocess and Visualize the result

# ...

其中YOLOv5-seg的前处理跟YOLOv5一样,范例代码如下:

im, r, (dh, dw)= letterbox(frame, new_shape=(input_h,input_w)) # Resize to new shape by letterbox

im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB

im = np.ascontiguousarray(im)  # contiguous

im = np.float32(im) / 255.0    # 0 - 255 to 0.0 - 1.0

        由于YOLOv5系列模型的输入形状是正方形,当输入图片为长方形时,直接调用OpenCV的resize函数放缩图片会使图片失真,所以YOLOv5使用letterbox方式,将图片以保持原始图片长宽比例的方式放缩,然后用灰色color=(114, 114, 114)填充边界,如下图所示。

Letterbox放缩效果

        YOLOv5-seg的后处理跟YOLOv5几乎一样,需要对推理结果先做非极大值抑制。本文直接使用了YOLOv5自带的non_max_suppression()函数来实现非极大值抑制,并拆解出检测框(bboxes), 置信度(conf),类别(class_ids)和掩膜(masks)。关键代码如下:

from utils.general import non_max_suppression

pred = torch.tensor(pred)

pred = non_max_suppression(pred, nm=32)[0].numpy() #(n,38) tensor per image [xyxy, conf, cls, masks]

bboxes, confs, class_ids, masks= pred[:,:4], pred[:,4], pred[:,5], pred[:,6:]

yolov5seg_ov2022_sync_dgpu.py运行结果如下图所示:

源代码链接:https://gitee.com/ppov-nuc/yolov5_infer/blob/main/yolov5seg_ov2022_sync_dGPU.py

1.4 结论

        YOLOv5 的实时实例分割程序通过OpenVINO 部署在英特尔独立显卡上,可以获得高速度与高精度。读者还可以将程序通过OpenVINO异步API升级为异步推理程序或者用OpenVINO C++ API改写推理程序,这样可以获得更高的AI推理计算性能。

相关文章:

  • 什么是闭包,Python闭包(初学者必读)
  • SpringBoot+Actuator+Prometheus+Grafana进行可视化应用监控
  • C/C++ Qt QThread 线程组件应用
  • 关于小程序订单中心页设置的公告
  • 基于Python + Requests 的Web接口自动化测试框架
  • sed命令详解及demo
  • Allegro关闭线段显示不连续效果操作指导
  • 【408篇】C语言笔记-第十五章( 考研必会的查找算法考研真题实战)
  • 【排序】详细聊聊归并排序(含非递归)
  • kafka单条消息过大导致线上OOM,运维连夜跑路了!
  • ValidateCode验证码的使用详解(初学看完都会用)
  • 肝了一周总结的SpringBoot常用注解大全,一目了然!
  • 无线电信号密钥WiFi完整版学习教程
  • Linux----paste命令使用详解
  • 【LSTM时序预测】基于灰狼算法优化长短时记忆网络GWO-LSTM实现风电功率预测附Matlab代码
  • 11111111
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • ComponentOne 2017 V2版本正式发布
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • eclipse(luna)创建web工程
  • FineReport中如何实现自动滚屏效果
  • HTML-表单
  • JavaScript学习总结——原型
  • JS变量作用域
  • learning koa2.x
  • leetcode讲解--894. All Possible Full Binary Trees
  • Meteor的表单提交:Form
  • MQ框架的比较
  • Otto开发初探——微服务依赖管理新利器
  • 阿里云购买磁盘后挂载
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 分享一份非常强势的Android面试题
  • 蓝海存储开关机注意事项总结
  • 两列自适应布局方案整理
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 为什么要用IPython/Jupyter?
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​VRRP 虚拟路由冗余协议(华为)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八)c52学习之旅-中断实验
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (接口封装)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十)c52学习之旅-定时器实验
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)c++ std::pair 与 std::make
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Mysql的优化设置
  • (转载)Linux 多线程条件变量同步
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ******IT公司面试题汇总+优秀技术博客汇总