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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

作者:馮浩遼寧科技大學 研究生

指導教師:張海剛英特爾邊緣計算創(chuàng)新大使深圳職業(yè)技術大學 副教授

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

FastSAM 官方倉庫[1]

OpenVINO 官方倉庫[2]

FastSAM 模型部署實現(xiàn)代碼倉庫[3]

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

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

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

拿到這個 CompiledModel 之后可以調用這個 create_infer_request 來創(chuàng)建最終我們需要的推理請求的類。最后調用 infer 進行模型推理。

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

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

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

在 C++ 初始化OpenVINO推理引擎和 Python 的基本結構相似,也是使用一個 Ov::Core 來創(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");
 
/*

左滑查看更多

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

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

左滑查看更多

03預處理輸入圖像

本次我們采用的是手動預處理輸出數(shù)據(jù),需要預處理輸入圖像的大小位模型所需的輸入的大小即 640 x 640,其次我們需要轉換這個由 opencv 讀取來的 BGR 圖像位 RGB,最后需要將這個數(shù)據(jù)排列順序由 NWHC 轉換為 NCWH。實現(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í)行完這個 Preprocess 之后會返回一個 ov::Tensor, 將前面預處理好的 input tensor 設置為輸入數(shù)據(jù),然后執(zhí)行 infer 即可進行推理。

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

左滑查看更多

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

在推理完成之后可以通過調用 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

當拿我們到這個輸出的數(shù)據(jù)之后我們需要解析后做后處理,首先是對第一個維度的數(shù)據(jù)解析做非極大抑制,將得到的 bbox 的坐標進行還原,使得這個坐標對應的是原始圖像掩碼的坐標而不是輸入圖像掩碼的坐標。最后把還原后的數(shù)據(jù)的最后掩碼維度和模型輸出維度進行矩陣相乘后的到最終的 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實現(xiàn)效果展示

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

使用設備: xBoard、iGPU

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

審核編輯:湯梓紅

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

    關注

    60

    文章

    9814

    瀏覽量

    171111
  • API
    API
    +關注

    關注

    2

    文章

    1463

    瀏覽量

    61670
  • C++
    C++
    +關注

    關注

    21

    文章

    2090

    瀏覽量

    73404
  • 模型
    +關注

    關注

    1

    文章

    3054

    瀏覽量

    48569
  • OpenVINO
    +關注

    關注

    0

    文章

    81

    瀏覽量

    155

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    自訓練Pytorch模型使用OpenVINO?優(yōu)化并部署在AI愛克斯開發(fā)板

    本文章將依次介紹如何將 Pytorch 自訓練模型經過一系列變換變成 OpenVINO IR 模型形式,而后使用 OpenVINO Python A
    的頭像 發(fā)表于 05-26 10:23 ?835次閱讀
    自訓練Pytorch<b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>?優(yōu)化并<b class='flag-5'>部署</b>在AI愛克斯開發(fā)板

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

    本文章將介紹使用 OpenVINO 2023.0 C++ API 開發(fā)YOLOv8-Seg 實例分割(Instance Segmentation)模型的 AI 推理程序。本文
    的頭像 發(fā)表于 06-25 16:09 ?1396次閱讀
    用<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的系列
    的頭像 發(fā)表于 08-06 11:39 ?2484次閱讀

    OpenVINO? C# API詳解與演示

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

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

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

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

    應用中,我們?yōu)榱伺c當前軟件平臺集成更多會采用 C++ 平臺,因此在本文中,我們將基于 OpenVINO C++ API 向大家展示了不包含后處理的 RT-DETR
    的頭像 發(fā)表于 11-03 14:30 ?705次閱讀
    基于<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 模型 | 開發(fā)者實戰(zhàn)》和《基于 OpenVINO C++
    的頭像 發(fā)表于 11-10 16:59 ?658次閱讀
    基于<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>

    NNCF壓縮與量化YOLOv8模型OpenVINO部署測試

    OpenVINO2023版本衍生出了一個新支持工具包NNCF(Neural Network Compression Framework – 神經網(wǎng)絡壓縮框架),通過對OpenVINO IR格式模型的壓縮與量化更好的提升
    的頭像 發(fā)表于 11-20 10:46 ?1367次閱讀
    NNCF壓縮與量化YOLOv8<b class='flag-5'>模型</b>與<b class='flag-5'>OpenVINO</b><b class='flag-5'>部署</b>測試

    如何在MacOS上編譯OpenVINO C++項目呢?

    英特爾公司發(fā)行的模型部署工具 OpenVINO 模型部署套件,可以實現(xiàn)在不同系統(tǒng)環(huán)境下運行,且發(fā)布的 O
    的頭像 發(fā)表于 01-11 18:07 ?786次閱讀
    如何在MacOS上編譯<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>項目呢?

    OpenVINO C# API在intel平臺部署YOLOv10目標檢測模型

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

    OpenVINO2024 C++推理使用技巧

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