使用 运行 YOLOv5 推理

1.0 简介

本文档介绍了一种将带 .pt 扩展名的 YOLOv5 PyTorch 权重文件转换为 ONNX* 权重文件,以及使用模型优化器将 ONNX 权重文件转换为 IR 文件的方法。该方法可帮助 OpenVINO™ 用户优化YOLOv5,以便将其部署在实际应用中。此外,本文档提供了一个关于如何运行 YOLOv5 推理的 Python 推理演示,以帮助加快 YOLOv5
的开发和部署速度。在最后一部分,针对使用 NCS2 运行推理引擎引发的 YOLOv5 模型准确度下降问题,本文亦提供了解决方案 - 修改与重建 libmyriadplugin.so,以使其适应 YOLOv5 模型。

1.1. 术语

使用 运行 YOLOv5 推理_第1张图片

1.2. 参考文档

使用 运行 YOLOv5 推理_第2张图片

2.0 将权重转换为 ONNX 文件

需要以下组件。
OpenVINO™ - 在本文档中,我们使用 OpenVINO™ Linux* 版本 2021.1 版进行验证
系统 – CPU 处理器。在 Linux Ubuntu* 18.04.1 上使用 Sky Lake 对本指南进行验证
Python* – 在本文档中,我们使用 Python 3.6.9 进行验证
ONNX – 在本文档中,我们使用 ONNX 1.6.0 进行验证
PyTorch – 在本文档中,我们使用 PyTorch 1.6.0 进行验证
Netron* – 在本文档中,我们使用 Netron 4.4.3 进行验证。

2.1. 从 GitHub 复制 YOLOv5 存储库

在 Linux 终端运行以下命令(在本文档中,提交 4d3680c 用于验证)。
在这里插入图片描述

2.2. 设置 YOLOv5 的环境

若要设置 YOLOv5 的环境,需要运行以下命令来安装一些必要组件:
在这里插入图片描述

2.3. 下载 PyTorch 权重

到目前为止,YOLOv5 存储库中有 3 个标签。由于骨干网的不同,YOLOv5 分为 YOLOv5s、
YOLOv5m、YOLOv5l 和 YOLOv5x。此处,我们使用来自标签 v3.0 的 YOLOv5s 进行说明。运行以下命令,以下载 yolov5s.pt:
在这里插入图片描述

2.4. 将 PyTorch 权重转换为 ONNX 权重

YOLOv5 存储库提供了 models/export.py 脚本,您可以使用该脚本将带 *.pt 扩展名的 PyTorch权重导出为带 *.onnx 扩展名的 ONNX 权重由于 OpenVINO™ 2021.1 还未全面支持 ONNX opset 版本 11,因此我们需要将models/export.py 脚本的第 69 行修改为 opset 版本 10:
使用 运行 YOLOv5 推理_第3张图片
然后保存脚本并运行以下命令:
在这里插入图片描述
随后,我们将在 yolov5-v3 文件夹中得到 yolov5s.onnx。

3.0 将 ONNX 文件转换为 IR 文件

从上一节中得到 ONNX 权重文件后,我们可以使用模型优化器将其转换为 IR 文件。
运行以下脚本,以临时设置 OpenVINO™ 环境和变量:
在这里插入图片描述
在使用模型优化器转换 YOLOv5 模型时,我们需要指定 IR 的输出节点。
使用 运行 YOLOv5 推理_第4张图片
YOLOv5 中有 3 个输出节点。我们使用 Netron 查看 YOLOv5 ONNX 权重。然后通过在 Netron中搜索关键词“Transpose”找到输出节点。随后,我们可以查找卷积节点,该节点在图 1. 中被标记为椭圆形。双击节点后,我们可以在属性面板中读取其名称“Conv_455”,名称在 图 1 中被标记为矩形。图 1 显示大小为 1x3x80x80x85 的输出节点和分辨率为 1x3x640x640 的输入图像,用于检测小型对象。 我们使用卷积节点的名称“Conv_455”来指定模型优化器参数。
使用 运行 YOLOv5 推理_第5张图片
我们可以采用类似的方式获取另外两个卷积节点的名称。图 2 显示大小为 1x3x40x40x85 的输出节点和分辨率为 1x3x640x640 的输入图像,用于检测中型对象。 读取被标记为矩形的卷积名“Conv_471”。图 3 显示大小为 1x3x20x20x85 的输出节点和分辨率为1x3x640x640 的输入图像,用于检测大型对象。 读取被标记为矩形的卷积名称“Conv_487”。然后运行以下命令,以生成 YOLOv5 模型的 IR:
在这里插入图片描述
其中,–input_model 定义预训练模型,参数 --model_name 是生成的 IR 和 output .xml/.bin 文件中的网络名称,-s 表示来自原始网络输入的所有输入值都将除以该值,–reverse_input_channels 可将输入通道顺序从 RGB 转变为 BGR(或者从 BGR 转变为 RGB),–
output 表示模型输出运算的名称。随后,我们将在 yolov5-v3 文件夹中得到 YOLOv5s 的 FP32 格式 IR。
使用 运行 YOLOv5 推理_第6张图片

4.0 推理 Python 演示

生成 YOLOv5 模型的 IR 后,我们根据 YOLOv5 模型的推理流程编写推理 Python 演示。根据
OpenVINO™ 默认 Python 演示中提供的 YOLOv3 演示,YOLOv5 演示中主要有 3 点需要修改:

  1. 使用 letterbox 预处理输入图像
  2. 使用 Sigmoid 函数的 YOLO region 层
  3. 边界框后处理
    点击此处下载 YOLOv5 Python 演示

4.1. 使用 letterbox 预处理输入图像

YOLOv5 使用 letterbox 处理网络的输入图像。在 YOLOv5 推理 Python 演示中,我们提供了一个用于处理图像的函数:
使用 运行 YOLOv5 推理_第7张图片
使用 运行 YOLOv5 推理_第8张图片
在这里插入图片描述

4.2. 使用 Sigmoid 函数的 YOLO Region 层

在对 YOLOv5 的每个检测头执行最后的卷积后,YOLOv5 使用 Sigmoid 函数处理推理中的输出。
YOLOv5 Python 演示中的 YOLO region 层的解析函数与 YOLOv3 Python 演示中的解析函数不同。
我们在此处提供了解析 YOLO region 层的代码:
使用 运行 YOLOv5 推理_第9张图片
使用 运行 YOLOv5 推理_第10张图片
使用 运行 YOLOv5 推理_第11张图片

4.3. 边界框后处理

由于 YOLOv5 使用 letterbox 处理输入图像,因此我们需要重写边界框后处理,以得到正确的检测结果。缩放边框 (scale box) 函数如下所示:
使用 运行 YOLOv5 推理_第12张图片
使用 运行 YOLOv5 推理_第13张图片

5.0 NCS2 的准确度下降问题

相比在 CPU 上运行 FP16 推理得到的检测结果,我们注意到将 NCS2 设置为运行推理引擎的设备时,某些对象可能无法被 YOLOv5 模型检测到。这是因为图形转换工具使用的缩放比例适合大多数网络,但是有时可能不适合某些网络。为了解决该问题,需要修改 weights_analysis.cpp 中的缩放比例并重建 libmyriadPlugin.so。
首先需运行以下命令,从 GitHub 中复制 OpenVINO™ 存储库:
在这里插入图片描述
然后运行以下命令,从而切换到 OpenVINO™ 2021.1:
在这里插入图片描述
将 inference- engine/src/vpu/graph_transformer/src/middleend/passes/ 中的
weights_analysis.cpp 的第 243-248 行修改为:
使用 运行 YOLOv5 推理_第14张图片
然后运行以下命令,以构建 OpenVINO™:
使用 运行 YOLOv5 推理_第15张图片
之后,您可以在 bin/intel64/Release/lib/ 中找到 libmyriadPlugin.so。我们可以对原始的libmyriadPlugin.so 进行备份,将新创建的 libmyriadPlugin.so 复制到文件夹/opt/intel/openvino/inference_engine/lib/intel64/。然后,我们可以使用 NCS2 运行 YOLOv5推理演示,得到的检测结果与使用 CPU 得到的检测结果几乎相同。

6.0 结论

本白皮书旨在帮助客户将 YOLOv5 模型应用到其应用中。
本文档详细介绍了如何将 PyTorch 权重文件转换为 ONNX 权重文件,以及如何使用 OpenVINO™模型优化器,从 ONNX 权重文件中生成 YOLOv5 模型的 IR。此外,本文档提供了针对 YOLOv5模型的推理演示,适用于 YOLOv5s、YOLOv5m、YOLOv5l 和 YOLOv5x 模型推理。针对使用NCS2 部署 YOLOv5 模型引发的准确度下降问题,本文档还提供了解决方案。通过阅读本白皮书,客户可以更轻松地开发与部署其应用。

你可能感兴趣的:(OpenVINO,openvino,音视频,计算机视觉)