在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

審核編輯:湯梓紅

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

    關注

    61

    文章

    9964

    瀏覽量

    171765
  • API
    API
    +關注

    關注

    2

    文章

    1500

    瀏覽量

    62013
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73647
  • 模型
    +關注

    關注

    1

    文章

    3243

    瀏覽量

    48836
  • OpenVINO
    +關注

    關注

    0

    文章

    93

    瀏覽量

    201

原文標題:基于 OpenVINO? C++ API 的 FastSAM 模型的部署 | 開發者實戰

文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在Ubuntu上搭建OpenVINO C++程序開發環境

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

    使用OpenVINO運行C++ API創建輸入tensor并執行推理遇到的問題求解

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

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

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

    自訓練Pytorch模型使用OpenVINO?優化并部署在AI愛克斯開發板

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

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

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

    OpenVINO? C# API詳解與演示

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

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

    平臺實現 OpenVINO 部署 RT-DETR 模型實現深度學習推理加速, 在本文中,我們將首先介紹基于 OpenVINO Python API
    的頭像 發表于 10-20 11:15 ?973次閱讀
    基于<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 ?744次閱讀

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

    應用中,我們為了與當前軟件平臺集成更多會采用 C++ 平臺,因此在本文中,我們將基于 OpenVINO C++ API 向大家展示了不包含后處理的 RT-DETR
    的頭像 發表于 11-03 14:30 ?849次閱讀
    基于<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 ?758次閱讀
    基于<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>

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

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

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

    模型設計策略,從效率和精度兩個角度對YOLOs的各個組成部分進行了全面優化,大大降低了計算開銷,增強了性能。在本文中,我們將結合OpenVINO C# API使用最新發布的
    的頭像 發表于 06-21 09:23 ?1036次閱讀
    用<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做了大量的優化與整理,已經是非常貼近開發的使用習慣與
    的頭像 發表于 07-26 09:20 ?900次閱讀

    使用OpenVINO Model Server在哪吒開發板上部署模型

    OpenVINO Model Server(OVMS)是一個高性能的模型部署系統,使用C++實現,并在Intel架構上的部署進行了優化,使用
    的頭像 發表于 11-01 14:19 ?286次閱讀
    使用<b class='flag-5'>OpenVINO</b> Model Server在哪吒開發板上<b class='flag-5'>部署</b><b class='flag-5'>模型</b>
    主站蜘蛛池模板: 五月天婷婷在线播放| 手机看片1024在线| 黄色网址日本| 男女视频在线看| 欧美三级小视频| 天天操穴| 狠狠干网站| 97久草| 一区精品视频| 噜噜噜噜私人影院| 人人爱天天做夜夜爽毛片| 美女扒开尿口让男人捅| 免费一级毛片私人影院a行| 天堂8在线天堂bt| 九九热免费在线观看| 性欧美大战久久久久久久| 国产一级特黄老妇女大片免费| 久操视屏| 亚洲精品美女在线观看| 国产激情片| 国产视频h| 欧美一级视频免费观看| 国产福利在线观看你懂的| 国产一级大片免费看| 亚洲成熟| 亚洲禁片| 乱肉情欲杂乱小说| 黄色免费看视频| 天天干夜夜想| 黄大片18满岁水多| 国产一区二区三区欧美精品| 99久久免费午夜国产精品| 四虎伊人| 天堂最新版在线地址| 一级做受毛片免费大片| v片视频| 老师叫我下面含着精子去上课| 精品国产乱码久久久久久浪潮| 717影院理论午夜伦不卡久久| 四虎网址在线观看| 色综合久久98天天综合|