0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

英特爾物聯(lián)網(wǎng) ? 來(lái)源:英特爾物聯(lián)網(wǎng) ? 2023-11-17 09:53 ? 次閱讀

作者:馮浩遼寧科技大學(xué) 研究生

指導(dǎo)教師:張海剛英特爾邊緣計(jì)算創(chuàng)新大使深圳職業(yè)技術(shù)大學(xué) 副教授

當(dāng)今,深度學(xué)習(xí)技術(shù)在計(jì)算機(jī)視覺(jué)領(lǐng)域取得了巨大的突破,使得各種圖像處理任務(wù)變得更加智能化。其中,Semantic Segmentation(語(yǔ)義分割)是一項(xiàng)重要的任務(wù),它有助于計(jì)算機(jī)理解圖像中不同對(duì)象的位置和邊界。本文將介紹如何使用OpenVINOC++ API 部署 FastSAM 模型,以實(shí)現(xiàn)快速高效的語(yǔ)義分割。在前文中我們發(fā)表了《基于OpenVINO Python API 部署 FastSAM 模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)》,在該文章中我們向大家展示了基于 OpenVINO Python API 的基本部署流程。在實(shí)際部署過(guò)程中會(huì)考慮到由效率問(wèn)題,使得我們可能更傾向于采用更高效的部署方式,故今天我們將向大家展示使用OpenVINOC++ API 部署 FastSAM 模型,并且對(duì)比預(yù)處理、推理、后處理等時(shí)間的消耗。

FastSAM 官方倉(cāng)庫(kù)[1]

OpenVINO 官方倉(cāng)庫(kù)[2]

FastSAM 模型部署實(shí)現(xiàn)代碼倉(cāng)庫(kù)[3]

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

首先簡(jiǎn)單解釋一下這個(gè) C++ 版本OpenVINO的推理構(gòu)建流程。首先需要一個(gè) Core 去讀取前面生成的 xml 文件(這個(gè)文件包含了模型的網(wǎng)絡(luò)結(jié)構(gòu),與其對(duì)應(yīng)的同名文件 bin 后綴的是模型的權(quán)重和偏置)。

讀取完成之后他會(huì)返回一個(gè) Model 類,可以通過(guò)這個(gè) Model 類來(lái)生成生成最終編譯完成的模型。在這里的編譯不是我們常規(guī)意義上的編譯代碼,本質(zhì)上是在模型中插入一些函數(shù)指針,也就是所謂的預(yù)處理和后處理的函數(shù)。當(dāng)我們有這個(gè) PrePostProcessor 的步驟之后在我們每次調(diào)用推理的時(shí)候就可以不用自己去手動(dòng)的處理圖像的一些簡(jiǎn)單操作,比如轉(zhuǎn)換圖像大小、轉(zhuǎn)換數(shù)據(jù)排列順序、以及顏色編碼順序等等。

拿到這個(gè) CompiledModel 之后可以調(diào)用這個(gè) create_infer_request 來(lái)創(chuàng)建最終我們需要的推理請(qǐng)求的類。最后調(diào)用 infer 進(jìn)行模型推理。

01模型的轉(zhuǎn)化和優(yōu)化

在之前的文章我們已經(jīng)了解到了模型的導(dǎo)出方式,大家可以參考《基于OpenVINO Python API 部署 FastSAM模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)》,或者參考筆者的 GitHub[4] 中的導(dǎo)出部分。

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

在 C++ 初始化OpenVINO推理引擎和 Python 的基本結(jié)構(gòu)相似,也是使用一個(gè) Ov::Core 來(lái)創(chuàng)建 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");
 
/*

左滑查看更多

還可添加你模型所需要的預(yù)處理和后處理的操作

  m_ppp->input().preprocess()
       .convert_layout("NCHW"); //比如排列順序轉(zhuǎn)換
*/
     
m_model = m_ppp->build();set_shape(ov::Shape({1, 3, 640, 640}))

左滑查看更多

03預(yù)處理輸入圖像

本次我們采用的是手動(dòng)預(yù)處理輸出數(shù)據(jù),需要預(yù)處理輸入圖像的大小位模型所需的輸入的大小即 640 x 640,其次我們需要轉(zhuǎn)換這個(gè)由 opencv 讀取來(lái)的 BGR 圖像位 RGB,最后需要將這個(gè)數(shù)據(jù)排列順序由 NWHC 轉(zhuǎn)換為 NCWH。實(shí)現(xiàn)代碼如下:

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執(zhí)行推理

在執(zhí)行完這個(gè) Preprocess 之后會(huì)返回一個(gè) ov::Tensor, 將前面預(yù)處理好的 input tensor 設(shè)置為輸入數(shù)據(jù),然后執(zhí)行 infer 即可進(jìn)行推理。

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

左滑查看更多

05獲取和處理輸出數(shù)據(jù)

在推理完成之后可以通過(guò)調(diào)用 get_output_tensor 來(lái)獲取指定索引的輸出指針,這里我們采用的模型只有兩個(gè)維度的輸出。

auto* p0 = m_request.get_output_tensor(0).data(); // 獲取第一個(gè)維度輸出
auto* p1 = m_request.get_output_tensor(1).data(); // 獲取第二個(gè)維度輸出

左滑查看更多

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

當(dāng)拿我們到這個(gè)輸出的數(shù)據(jù)之后我們需要解析后做后處理,首先是對(duì)第一個(gè)維度的數(shù)據(jù)解析做非極大抑制,將得到的 bbox 的坐標(biāo)進(jìn)行還原,使得這個(gè)坐標(biāo)對(duì)應(yīng)的是原始圖像掩碼的坐標(biāo)而不是輸入圖像掩碼的坐標(biāo)。最后把還原后的數(shù)據(jù)的最后掩碼維度和模型輸出維度進(jìn)行矩陣相乘后的到最終的 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繪制掩碼到原圖上

繪制掩碼就比較簡(jiǎn)單了,將原始圖像輸入,和 mask 掩碼矩陣傳入進(jìn)來(lái)。最后會(huì)把生成的掩碼添加到 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實(shí)現(xiàn)效果展示

FastSAM With OpenVINO推理時(shí)間(未加渲染時(shí)間)

使用設(shè)備: xBoard、iGPU

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 英特爾
    +關(guān)注

    關(guān)注

    61

    文章

    10082

    瀏覽量

    172901
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1530

    瀏覽量

    62798
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2115

    瀏覽量

    74167
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3418

    瀏覽量

    49482
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    298

原文標(biāo)題:基于 OpenVINO? C++ API 的 FastSAM 模型的部署 | 開(kāi)發(fā)者實(shí)戰(zhàn)

文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C#集成OpenVINO?:簡(jiǎn)化AI模型部署

    在開(kāi)源測(cè)控、機(jī)器視覺(jué)、數(shù)采與分析三大領(lǐng)域中,如何快速將AI模型集成到應(yīng)用程序中, 實(shí)現(xiàn)AI賦能和應(yīng)用增值? 最容易的方式是:在C#中,使用 OpenVINO工具套件 集成AI模型。 1
    的頭像 發(fā)表于 02-17 10:03 ?1329次閱讀
    <b class='flag-5'>C</b>#集成<b class='flag-5'>OpenVINO</b>?:簡(jiǎn)化AI<b class='flag-5'>模型</b><b class='flag-5'>部署</b>

    在Ubuntu上搭建OpenVINO C++程序開(kāi)發(fā)環(huán)境

    在應(yīng)用 Anomalib 和 OpenVINO 實(shí)現(xiàn)瑕疵檢測(cè)的過(guò)程中,經(jīng)常會(huì)在 Ubuntu 下訓(xùn)練并部署 AI 模型。筆者一直在 Windows 上開(kāi)發(fā)程序,比較喜歡 Visual Studio
    發(fā)表于 08-09 09:42 ?1178次閱讀
    在Ubuntu上搭建<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>程序開(kāi)發(fā)環(huán)境

    為什么無(wú)法在運(yùn)行時(shí)C++推理中讀取OpenVINO?模型

    使用模型優(yōu)化器 2021.1 版OpenVINO?轉(zhuǎn)換模型 使用 Runtime 2022.3 版本在 C++ 推理實(shí)現(xiàn) ( core.read_model()) 中讀取
    發(fā)表于 03-05 06:17

    使用OpenVINO運(yùn)行C++ API創(chuàng)建輸入tensor并執(zhí)行推理遇到的問(wèn)題求解

    使用 OpenVINO? 運(yùn)行時(shí) C++ API 創(chuàng)建輸入 tensor 并執(zhí)行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    發(fā)表于 08-15 08:22

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

    下載并轉(zhuǎn)換YOLOv5預(yù)訓(xùn)練模型的詳細(xì)步驟,請(qǐng)參考:《基于OpenVINO?2022.2和蝰蛇峽谷優(yōu)化并部署YOLOv5模型》,本文所使用的Open
    的頭像 發(fā)表于 02-15 16:53 ?5908次閱讀

    OpenVINO? C++ API編寫YOLOv8-Seg實(shí)例分割模型推理程序

    本文章將介紹使用 OpenVINO 2023.0 C++ API 開(kāi)發(fā)YOLOv8-Seg 實(shí)例分割(Instance Segmentation)模型的 AI 推理程序。本文
    的頭像 發(fā)表于 06-25 16:09 ?1808次閱讀
    用<b class='flag-5'>OpenVINO</b>? <b class='flag-5'>C++</b> <b class='flag-5'>API</b>編寫YOLOv8-Seg實(shí)例分割<b class='flag-5'>模型</b>推理程序

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

    深度學(xué)習(xí)模型部署OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對(duì)YOLOv5~YOLOv8的系列
    的頭像 發(fā)表于 08-06 11:39 ?2880次閱讀

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫(kù)的安裝過(guò)程相比,更加簡(jiǎn)單。如果使用 Vi
    的頭像 發(fā)表于 10-13 16:39 ?928次閱讀
    <b class='flag-5'>OpenVINO</b>?  <b class='flag-5'>C</b># <b class='flag-5'>API</b>詳解與演示

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

    平臺(tái)實(shí)現(xiàn) OpenVINO 部署 RT-DETR 模型實(shí)現(xiàn)深度學(xué)習(xí)推理加速, 在本文中,我們將首先介紹基于 OpenVINO Python API
    的頭像 發(fā)表于 10-20 11:15 ?1176次閱讀
    基于<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 模型,以實(shí)現(xiàn)快速高效的語(yǔ)義分割。
    的頭像 發(fā)表于 10-27 11:04 ?914次閱讀

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

    應(yīng)用中,我們?yōu)榱伺c當(dāng)前軟件平臺(tái)集成更多會(huì)采用 C++ 平臺(tái),因此在本文中,我們將基于 OpenVINO C++ API 向大家展示了不包含后處理的 RT-DETR
    的頭像 發(fā)表于 11-03 14:30 ?1076次閱讀
    基于<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 模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)》和《基于 OpenVINO C++
    的頭像 發(fā)表于 11-10 16:59 ?895次閱讀
    基于<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在intel平臺(tái)部署YOLOv10目標(biāo)檢測(cè)模型

    模型設(shè)計(jì)策略,從效率和精度兩個(gè)角度對(duì)YOLOs的各個(gè)組成部分進(jìn)行了全面優(yōu)化,大大降低了計(jì)算開(kāi)銷,增強(qiáng)了性能。在本文中,我們將結(jié)合OpenVINO C# API使用最新發(fā)布的
    的頭像 發(fā)表于 06-21 09:23 ?1353次閱讀
    用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b># <b class='flag-5'>API</b>在intel平臺(tái)<b class='flag-5'>部署</b>YOLOv10目標(biāo)檢測(cè)<b class='flag-5'>模型</b>

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺(jué)得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開(kāi)發(fā)的使用習(xí)慣與
    的頭像 發(fā)表于 07-26 09:20 ?1193次閱讀

    使用OpenVINO Model Server在哪吒開(kāi)發(fā)板上部署模型

    OpenVINO Model Server(OVMS)是一個(gè)高性能的模型部署系統(tǒng),使用C++實(shí)現(xiàn),并在Intel架構(gòu)上的部署進(jìn)行了優(yōu)化,使用
    的頭像 發(fā)表于 11-01 14:19 ?444次閱讀
    使用<b class='flag-5'>OpenVINO</b> Model Server在哪吒開(kāi)發(fā)板上<b class='flag-5'>部署</b><b class='flag-5'>模型</b>