作者:贾志刚 英特尔物联网创新大使
目录
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实时实例分割模型的全流程,并提供完整范例代码供读者使用。
YOLOv5是AI开发者友好度最佳的框架之一,与其它YOLO系列相比:
2022年11月22日,YOLOv5 v7.0版正式发布,成为YOLO系列中第一个支持实时实例分割(Real Time Instance Segmentation)的框架。从此,YOLOv5框架不仅具有实时目标检测模型,还涵盖了图像分类和实例分割。
图片来源: https://github.com/ultralytics/yolov5/releases
与实时实例分割SOTA性能榜中的模型相比,YOLOv5作者发布的YOLOv5-Seg模型数据,无论是精度还是速度,都领先于当前SOTA性能榜中的模型。
2022年英特尔发布了代号为Alchemist的第一代消费级锐炫™桌面独立显卡,当前英特尔京东自营旗舰店里销售的主要型号为A750和A770,其典型参数如下图所示。OpenVINO™ 从2022.2版开始支持英特尔独立显卡,包括英特尔® 数据中心 GPU Flex 系列和英特尔® 锐炫™系列。
在英特尔独立显卡上部署YOLOv5-seg模型的完整流程主要有三步:
本文将按照上述三个步骤,依次详述。
最近的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
执行完上述命令后,运行命令
python segment\predict.py --source data\images
执行结果如下图所示,说明YOLOv5开发环境和OpenVINO部署环境已搭建成功。
使用命令:
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。
使用Netron(https://netron.app/),查看yolov5s-seg.onnx模型的输入和输出,如下图所示:
从图中可以看出:yolov5s-seg模型
由于yolov5s-seg模型是在yolov5模型的基础上增加了掩膜输出分支,所以图像数据的预处理部分跟yolov5模型一模一样。
整个推理程序主要有五个关键步骤:
整个代码框架如下所示:
# 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
YOLOv5 的实时实例分割程序通过OpenVINO 部署在英特尔独立显卡上,可以获得高速度与高精度。读者还可以将程序通过OpenVINO异步API升级为异步推理程序或者用OpenVINO C++ API改写推理程序,这样可以获得更高的AI推理计算性能。