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

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

3天内不再提示

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

英特尔物联网 来源:英特尔物联网 2023-11-17 09:53 次阅读

作者:冯浩辽宁科技大学 研究生

指导教师:张海刚英特尔边缘计算创新大使深圳职业技术大学 副教授

当今,深度学习技术在计算机视觉领域取得了巨大的突破,使得各种图像处理任务变得更加智能化。其中,Semantic Segmentation(语义分割)是一项重要的任务,它有助于计算机理解图像中不同对象的位置和边界。本文将介绍如何使用OpenVINOC++ API 部署 FastSAM 模型,以实现快速高效的语义分割。在前文中我们发表了《基于OpenVINO Python API 部署 FastSAM 模型 | 开发者实战》,在该文章中我们向大家展示了基于 OpenVINO Python API 的基本部署流程。在实际部署过程中会考虑到由效率问题,使得我们可能更倾向于采用更高效的部署方式,故今天我们将向大家展示使用OpenVINOC++ API 部署 FastSAM 模型,并且对比预处理、推理、后处理等时间的消耗。

FastSAM 官方仓库[1]

OpenVINO 官方仓库[2]

FastSAM 模型部署实现代码仓库[3]

a0c44824-8478-11ee-939d-92fbcf53809c.png

首先简单解释一下这个 C++ 版本OpenVINO的推理构建流程。首先需要一个 Core 去读取前面生成的 xml 文件(这个文件包含了模型的网络结构,与其对应的同名文件 bin 后缀的是模型的权重和偏置)。

读取完成之后他会返回一个 Model 类,可以通过这个 Model 类来生成生成最终编译完成的模型。在这里的编译不是我们常规意义上的编译代码,本质上是在模型中插入一些函数指针,也就是所谓的预处理和后处理的函数。当我们有这个 PrePostProcessor 的步骤之后在我们每次调用推理的时候就可以不用自己去手动的处理图像的一些简单操作,比如转换图像大小、转换数据排列顺序、以及颜色编码顺序等等。

拿到这个 CompiledModel 之后可以调用这个 create_infer_request 来创建最终我们需要的推理请求的类。最后调用 infer 进行模型推理。

01模型的转化和优化

在之前的文章我们已经了解到了模型的导出方式,大家可以参考《基于OpenVINO Python API 部署 FastSAM模型 | 开发者实战》,或者参考笔者的 GitHub[4] 中的导出部分。

02初始化推理引擎和加载模型

在 C++ 初始化OpenVINO推理引擎和 Python 的基本结构相似,也是使用一个 Ov::Core 来创建 Ov::Model。

m_model = m_core.read_model(xml_path);
m_ppp = std::make_shared(m_model);
 
 
m_ppp->input().tensor()
  .set_element_type(ov::f32) 
  .set_color_format(ov::RGB)
  .set_layout("NCHW");
 
/*

左滑查看更多

还可添加你模型所需要的预处理和后处理的操作

  m_ppp->input().preprocess()
       .convert_layout("NCHW"); //比如排列顺序转换
*/
     
m_model = m_ppp->build();set_shape(ov::Shape({1, 3, 640, 640}))

左滑查看更多

03预处理输入图像

本次我们采用的是手动预处理输出数据,需要预处理输入图像的大小位模型所需的输入的大小即 640 x 640,其次我们需要转换这个由 opencv 读取来的 BGR 图像位 RGB,最后需要将这个数据排列顺序由 NWHC 转换为 NCWH。实现代码如下:

ov::Tensor FastSAM::Preprocess(const cv::Mat &image)
{
  float height = (float)image.rows;
  float width = (float)image.cols;
  
  int target_size = input_height;
  float r = std::min(target_size / height, target_size / width);
  int padw = (int)std::round(width * r);
  int padh = (int)std::round(height * r);
  
    
  if((int)width != padw || (int)height != padh) 
    cv::resize(image, m_image, cv::Size(padw, padh));
  else 
    m_image = image.clone();
  
  float _dw = target_size - padw;
  float _dh = target_size - padh;
  _dw /= 2.0f;
  _dh /= 2.0f;
  int top = int(std::round(_dh - 0.1f));
  int bottom = int(std::round(_dh + 0.1f));
  int left = int(std::round(_dw - 0.1f));
  int right = int(std::round(_dw + 0.1f));
  cv::copyMakeBorder(m_image, m_image, top, bottom, left, right, cv::BORDER_CONSTANT,
            cv::Scalar(114, 114, 114));
  
  this->ratio = 1 / r;
  this->dw = _dw;
  this->dh = _dh;
  
  Normalize2Vec(m_image);
  
  return ov::f32, ov::Shape({1, 3, (unsigned long)input_height, (unsigned long)input_width}), input_data.data());  
}

左滑查看更多

04执行推理

在执行完这个 Preprocess 之后会返回一个 ov::Tensor, 将前面预处理好的 input tensor 设置为输入数据,然后执行 infer 即可进行推理。

m_request.set_input_tensor(input_tensor);
m_request.infer();

左滑查看更多

05获取和处理输出数据

在推理完成之后可以通过调用 get_output_tensor 来获取指定索引的输出指针,这里我们采用的模型只有两个维度的输出。

auto* p0 = m_request.get_output_tensor(0).data(); // 获取第一个维度输出
auto* p1 = m_request.get_output_tensor(1).data(); // 获取第二个维度输出

左滑查看更多

a0e61fee-8478-11ee-939d-92fbcf53809c.png

当拿我们到这个输出的数据之后我们需要解析后做后处理,首先是对第一个维度的数据解析做非极大抑制,将得到的 bbox 的坐标进行还原,使得这个坐标对应的是原始图像掩码的坐标而不是输入图像掩码的坐标。最后把还原后的数据的最后掩码维度和模型输出维度进行矩阵相乘后的到最终的 mask。

std::vector FastSAM::Postprocess(std::vector &preds, const cv::Mat& oriImage)
{
  std::vector result;
 
  std::vector remat;
  NMS(remat, preds[0], 100);
  cv::Mat proto = preds[1];
  cv::Mat box = remat[0];
  cv::Mat mask = remat[1];
  ScaleBoxes(box, oriImage);
 
  return ProcessMaskNative(oriImage, proto, mask, box, oriImage.size());
}

左滑查看更多

06绘制掩码到原图上

绘制掩码就比较简单了,将原始图像输入,和 mask 掩码矩阵传入进来。最后会把生成的掩码添加到 image 上。

void FastSAM::Render(cv::Mat &image, const std::vector& vremat)
{
 
  cv::Mat bbox = vremat[0];
  float *pxvec = bbox.ptr(0);
   
  for (int i = 1; i < vremat.size(); i++) {
        cv::Mat mask = vremat[i];
        auto color = RandomColor();
 
        for (int y = 0; y < mask.rows; y++) {
        const float *mp = mask.ptr(y);
    uchar *p = image.ptr(y);
    for (int x = 0; x < mask.cols; x++) {
            if (mp[x] == 1.0) {
            p[0] = cv::saturate_cast(p[0] * 0.5 + color[0] * 0.5);
      p[1] = cv::saturate_cast(p[1] * 0.5 + color[1] * 0.5);
      p[2] = cv::saturate_cast(p[2] * 0.5 + color[2] * 0.5);
      }
      p += 3;
    }
    }
  }
}

左滑查看更多

07实现效果展示

FastSAM With OpenVINO推理时间(未加渲染时间)

使用设备: xBoard、iGPU

a1356072-8478-11ee-939d-92fbcf53809c.png

审核编辑:汤梓红

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

    关注

    60

    文章

    9591

    浏览量

    169831
  • API
    API
    +关注

    关注

    2

    文章

    1434

    浏览量

    61229
  • C++
    C++
    +关注

    关注

    21

    文章

    2070

    浏览量

    73024
  • 模型
    +关注

    关注

    1

    文章

    2822

    浏览量

    48038
  • OpenVINO
    +关注

    关注

    0

    文章

    65

    浏览量

    104

原文标题:基于 OpenVINO™ C++ API 的 FastSAM 模型的部署 | 开发者实战

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用OpenVINO运行C++ API创建输入tensor并执行推理遇到的问题求解

    使用 OpenVINO™ 运行时 C++ API 创建输入 tensor 并执行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    发表于 08-15 08:22

    使用OpenVINO部署PaddleSeg模型库中的DeepLabV3+模型

          01 概述     本文是OpenVINO 工具套件与百度飞桨PaddlePaddle模型转换/部署系列的第二部。这篇文章专注于展示如何将百度飞桨PaddelSeg项目
    的头像 发表于 11-22 14:58 9216次阅读
    使用<b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>部署</b>PaddleSeg<b class='flag-5'>模型</b>库中的DeepLabV3+<b class='flag-5'>模型</b>

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

    下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5模型》,本文所使用的Open
    的头像 发表于 02-15 16:53 2387次阅读

    自训练Pytorch模型使用OpenVINO™优化并部署在AI爱克斯开发板

    本文章将依次介绍如何将 Pytorch 自训练模型经过一系列变换变成 OpenVINO IR 模型形式,而后使用 OpenVINO Python A
    的头像 发表于 05-26 10:23 698次阅读
    自训练Pytorch<b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>™优化并<b class='flag-5'>部署</b>在AI爱克斯开发板

    如何将Pytorch自训练模型变成OpenVINO IR模型形式

    本文章将依次介绍如何将Pytorch自训练模型经过一系列变换变成OpenVINO IR模型形式,而后使用OpenVINO Python API
    的头像 发表于 06-07 09:31 1362次阅读
    如何将Pytorch自训练<b class='flag-5'>模型</b>变成<b class='flag-5'>OpenVINO</b> IR<b class='flag-5'>模型</b>形式

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

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

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

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

    OpenVINO™ C# API详解与演示

    OpenVINO C# API 支持 NuGet 程序包安装方式,这与 OpenVINO C++ 库的安装过程相比,更加简单。如果使用 Visual Studio 开发 AI 项目,则
    的头像 发表于 10-13 16:39 474次阅读
    <b class='flag-5'>OpenVINO</b>™  C# <b class='flag-5'>API</b>详解与演示

    基于OpenVINO Python API部署RT-DETR模型

    平台实现 OpenVINO 部署 RT-DETR 模型实现深度学习推理加速, 在本文中,我们将首先介绍基于 OpenVINO Python API
    的头像 发表于 10-20 11:15 637次阅读
    基于<b class='flag-5'>OpenVINO</b> Python <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>

    如何使用OpenVINO Python API部署FastSAM模型

    象的位置和边界。本文将介绍如何使用 OpenVINO Python API 部署 FastSAM 模型,以实现快速高效的语义分割。
    的头像 发表于 10-27 11:04 394次阅读

    基于OpenVINO C++ API部署RT-DETR模型

    应用中,我们为了与当前软件平台集成更多会采用 C++ 平台,因此在本文中,我们将基于 OpenVINO C++ API 向大家展示了不包含后处理的 RT-DETR
    的头像 发表于 11-03 14:30 461次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>

    基于OpenVINO C# API部署RT-DETR模型

    Python API 部署 RT-DETR 模型 | 开发者实战》和《基于 OpenVINO C++
    的头像 发表于 11-10 16:59 473次阅读
    基于<b class='flag-5'>OpenVINO</b> C# <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>

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

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

    如何在MacOS上编译OpenVINO C++项目呢?

    英特尔公司发行的模型部署工具 OpenVINO 模型部署套件,可以实现在不同系统环境下运行,且发布的 O
    的头像 发表于 01-11 18:07 517次阅读
    如何在MacOS上编译<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>项目呢?

    OpenVINO C# API在intel平台部署YOLOv10目标检测模型

    模型设计策略,从效率和精度两个角度对YOLOs的各个组成部分进行了全面优化,大大降低了计算开销,增强了性能。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO
    的头像 发表于 06-21 09:23 363次阅读
    用<b class='flag-5'>OpenVINO</b> C# <b class='flag-5'>API</b>在intel平台<b class='flag-5'>部署</b>YOLOv10目标检测<b class='flag-5'>模型</b>