0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在C++中使用OpenVINO工具包部署YOLOv5模型

SDNLAB 来源:英特尔物联网 2023-02-15 16:53 次阅读

01配置OpenVINO C++开发环境

配置OpenVINO C++开发环境的详细步骤,请参考《在Windows中基于Visual Studio配置OpenVINO C++开发环境》。

02下载并转换YOLOv5预训练模型

下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO2022.2和蝰蛇峡谷优化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。

完成上述步骤后,可以获得YOLOv5的IR模型文件:yolov5s.xml 和 yolov5s.bin,如下图所示:

3348155a-a3d7-11ed-bfe3-dac502259ad0.png

图 1-1YOLOv5 IR模型文件

03使用OpenVINO Runtime C++ API编写推理程序

一个端到端的AI推理程序,主要包含五个典型的处理流程:

1.采集图像&图像解码

2.图像数据预处理

3.AI推理计算

4.对推理结果进行后处理

5.将处理后的结果集成到业务流程

33555184-a3d7-11ed-bfe3-dac502259ad0.png

图 1-2端到端的AI推理程序处理流程

采集图像&图像解码

OpenCV提供imread()函数将图像文件载入内存

Matcv::imread(constString&filename, intflags=IMREAD_COLOR)

若是从视频流(例如,视频文件、网络摄像头、3D摄像头(Realsense)等)中,一帧一帧读取图像数据到内存,则使用cv::VideoCapture类,对应范例代码请参考OpenCV官方范例代码:

https://github.com/opencv/opencv/tree/4.x/samples/cpp。

33692114-a3d7-11ed-bfe3-dac502259ad0.png

图 1-3从视频流读取图像帧范例

YOLOv5的图像预处理

图像数据输入YOLOv5模型前需要做预处理,其主要工作有:使用Letterbox算法对图像进行非变形放缩,然后完成转换颜色通道、归一化数据、更改数据布局和数值精度。

直接调用OpenCV的cv::resize()函数将原始图像按照模型输入要求的尺寸进行放缩,虽然实现起来简单,但会导致图像中的被检测对象变形。Letterbox算法一种不会导致被检测对象变形的缩放,主要步骤为:

1.计算宽高缩放比例,选择较小那个缩放系数

2.计算缩放后的尺寸,原始图片的长宽都乘以较小的缩放系数

3.计算短边需要填充的灰边数,将短边的两边各自填充一半的灰行 参考YOLOv5的Letterbox算法实现方式,本文的Letterbox函数实现如下所示:

cv::Matletterbox(cv::Mat&img, std::vectornew_shape={640, 640}){

// Get current image shape [height, width]

// Refer to https://github.com/ultralytics/yolov5/blob/master/utils/augmentations.py#L111

intimg_h =img.rows;

intimg_w =img.cols;

// Compute scale ratio(new / old) and target resized shape

floatscale =std::min(new_shape[1] *1.0/img_h, new_shape[0] *1.0/img_w);

intresize_h =int(round(img_h *scale));

intresize_w =int(round(img_w *scale));

// Compute padding

intpad_h =new_shape[1] -resize_h;

intpad_w =new_shape[0] -resize_w;

// Resize and pad image while meeting stride-multiple constraints

cv::Mat resized_img;

cv::resize(img, resized_img, cv::Size(resize_w, resize_h));

// divide padding into 2 sides

floathalf_h =pad_h *1.0/2;

floathalf_w =pad_w *1.0/2;

// Compute padding boarder

inttop =int(round(half_h -0.1));

intbottom =int(round(half_h +0.1));

intleft =int(round(half_w -0.1));

intright =int(round(half_w +0.1));

// Add border

cv::copyMakeBorder(resized_img, resized_img, top, bottom, left, right, 0, cv::Scalar(114, 114, 114));

returnresized_img;

}

letterbox函数的运行结果如下图所示:

33810f5e-a3d7-11ed-bfe3-dac502259ad0.png

图 1-4letterbox放缩图片的效果

转换颜色通道、归一化数据、更改数据布局和数值精度的操作可以由OpenCV提供的 Mat cv::blobFromImage()函数实现,或者由OpenVINO的预处理API实现。为了简洁范例代码,本文选择调用cv::blobFromImage()函数。

执行AI推理计算

基于OpenVINO Runtime C++ API实现AI推理计算主要有两种方式:一种是同步推理方式,一种是异步推理方式,本文主要介绍同步推理方式。

主要步骤有:

1.初始化Core类

2.编译模型

3.创建推理请求infer_request

4.读取图像数据并做预处理

5.将预处理后的blob数据传入模型输入节点

6.调用infer()方法执行推理计算

7.获得推理结果

基于OpenVINO Runtime C++API的同步推理代码如下所示:

// -------- Step 1. Initialize OpenVINO Runtime Core --------

ov::Core core;

// -------- Step 2. Compile the Model --------

autocompiled_model =core.compile_model(model_file, "CPU");//GPU.1 is dGPU A770

// -------- Step 3. Create an Inference Request --------

ov::InferRequest infer_request =compiled_model.create_infer_request();

// -------- Step 4. Read a picture file and do the preprocess --------

cv::Mat img =cv::imread(image_file);//Load a picture into memory

std::vectorpaddings(3); //scale, half_h, half_w

cv::Mat resized_img =letterbox(img, paddings);//resize to (640,640) by letterbox

// BGR->RGB, u8(0-255)->f32(0.0-1.0), HWC->NCHW

cv::Mat blob =cv::blobFromImage(resized_img, 1/255.0, cv::Size(640, 640), cv::Scalar(0, 0, 0), true);

// -------- Step 5. Feed the blob into the input node of YOLOv5 -------

// Get input port for model with one input

autoinput_port =compiled_model.input();

// Create tensor from external memory

ov::Tensorinput_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0));

// Set input tensor for model with one input

infer_request.set_input_tensor(input_tensor);

// -------- Step 6. Start inference --------

infer_request.infer();

// -------- Step 7. Get the inference result --------

autooutput =infer_request.get_output_tensor(0);

autooutput_shape =output.get_shape();

std::cout << "The shape of output tensor:"<

推理结果进行后处理

对于目标检测应用,后处理主要是执行NMS(非极大值抑制)算法去除多余的检测框,然后剩余的检测框中提取出检测框坐标(box)、置信度(confidence)和类别(class_id)。NMS算法本文直接使用了cv::NMSBoxes()。

经过后处理,获得了经过NMS过滤后的检测框坐标(box)、置信度(confidence)和类别(class_id)后,就可以将这些信息显示在图像上了。

04总 结

配置OpenVINO C++开发环境后,可以直接编译运行yolov5_openvino_sync_dGPU.cpp,结果如下图所示。

使用OpenVINO Runtime C++ API函数开发YOLOv5推理程序,简单方便,并可以任意部署在英特尔CPU、集成显卡和独立显卡上。

345ebdc2-a3d7-11ed-bfe3-dac502259ad0.png

图 1-5运行结果







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6990
  • OpenCV
    +关注

    关注

    31

    文章

    635

    浏览量

    41343
  • 图像解码
    +关注

    关注

    0

    文章

    5

    浏览量

    6981
  • API串口
    +关注

    关注

    0

    文章

    13

    浏览量

    4841

原文标题:基于OpenVINO 在C++中部署YOLOv5模型

文章出处:【微信号:SDNLAB,微信公众号:SDNLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别

    今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5
    的头像 发表于 03-20 16:36 2669次阅读
    手把手教你使用LabVIEW ONNX Runtime<b class='flag-5'>部署</b> TensorRT加速,实现<b class='flag-5'>YOLOv5</b>实时物体识别

    Yolov5算法解读

    yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然不断进行升级迭代。 Yolov5YOLOv5s、
    的头像 发表于 05-17 16:38 9084次阅读
    <b class='flag-5'>Yolov5</b>算法解读

    YOLOv5】LabVIEW+TensorRT的yolov5部署实战(含源码)

    今天主要和大家分享LabVIEW中使用纯TensoRT工具包快速部署并实现yolov5的物体识别
    的头像 发表于 08-21 22:20 1318次阅读
    【<b class='flag-5'>YOLOv5</b>】LabVIEW+TensorRT的<b class='flag-5'>yolov5</b><b class='flag-5'>部署</b>实战(含源码)

    如何使用OpenVINO C++ API部署FastSAM模型

    象的位置和边界。本文将介绍如何使用 OpenVINO C++ API 部署 FastSAM 模型,以实现快速高效的语义分割。在前文中我们发表了《基于
    的头像 发表于 11-17 09:53 920次阅读
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API<b class='flag-5'>部署</b>FastSAM<b class='flag-5'>模型</b>

    C++中使OpenVINO工具包部署YOLOv5-Seg模型

    YOLOv5兼具速度和精度,工程化做的特别好,Git clone到本地即可在自己的数据集上实现目标检测任务的训练和推理,产业界中应用广泛。开源社区对YOLOv5支持实例分割的呼声高涨,YOL
    的头像 发表于 12-21 10:17 2120次阅读
    <b class='flag-5'>在</b><b class='flag-5'>C++</b><b class='flag-5'>中使</b>用<b class='flag-5'>OpenVINO</b><b class='flag-5'>工具包</b><b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>-Seg<b class='flag-5'>模型</b>

    龙哥手把手教你学视觉-深度学习YOLOV5

    利用labview部署yolov5导出的模型,能利用摄像头动态检测输出目标检测结果。根据工业视觉外观检测的速度和准确性要求,龙哥视觉结合labview编程平台推出了labview+yolov5
    发表于 09-03 09:39

    怎样使用PyTorch Hub去加载YOLOv5模型

    Python>=3.7.0环境中安装requirements.txt,包括PyTorch>=1.7。模型和数据集从最新的 YOLOv5版本自动下载。简单示例此示例从
    发表于 07-22 16:02

    如何在OpenVINO工具包中使用带推理引擎的blob?

    无法确定如何在OpenVINO工具包中使用带推理引擎的 blob。
    发表于 08-15 07:17

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

    本文将介绍基于 OpenVINO 英特尔独立显卡上部署 YOLOv5 实时实例分割模型的全流
    的头像 发表于 12-20 11:32 4085次阅读

    使用旭日X3派的BPU部署Yolov5

    本次主要介绍旭日x3的BPU中部署yolov5。首先在ubuntu20.04安装yolov5,并运行yolov5并使用pytoch的pt
    的头像 发表于 04-26 14:20 907次阅读
    使用旭日X3派的BPU<b class='flag-5'>部署</b><b class='flag-5'>Yolov5</b>

    OpenVINOC++ API编写YOLOv8-Seg实例分割模型推理程序

    本文章将介绍使用 OpenVINO 2023.0 C++ API 开发YOLOv8-Seg 实例分割(Instance Segmentation)模型的 AI 推理程序。本文
    的头像 发表于 06-25 16:09 1596次阅读
    用<b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>C++</b> API编写<b class='flag-5'>YOLOv</b>8-Seg实例分割<b class='flag-5'>模型</b>推理程序

    三种主流模型部署框架YOLOv8推理演示

    深度学习模型部署OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5
    的头像 发表于 08-06 11:39 2735次阅读

    NNCF压缩与量化YOLOv8模型OpenVINO部署测试

    OpenVINO2023版本衍生出了一个新支持工具包NNCF(Neural Network Compression Framework – 神经网络压缩框架),通过对OpenVINO IR格式
    的头像 发表于 11-20 10:46 1607次阅读
    NNCF压缩与量化<b class='flag-5'>YOLOv</b>8<b class='flag-5'>模型</b>与<b class='flag-5'>OpenVINO</b><b class='flag-5'>部署</b>测试

    基于QT5+OpenCV+OpenVINO C++的应用打包过程

    我用QT C++写了一个YOLOv5模型推理演示应用。
    的头像 发表于 01-26 10:17 1249次阅读
    基于QT<b class='flag-5'>5+OpenCV+OpenVINO</b> <b class='flag-5'>C++</b>的应用打包过程

    树莓派上部署YOLOv5进行动物目标检测的完整流程

    卓越的性能。本文将详细介绍如何在性能更强的计算机上训练YOLOv5模型,并将训练好的模型部署到树莓派4B上,通过树莓派的摄像头进行实时动物目标检测。 一、
    的头像 发表于 11-11 10:38 956次阅读
    <b class='flag-5'>在</b>树莓派上<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>进行动物目标检测的完整流程