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

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

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

3天內不再提示

OpenVINO? C# API詳解與演示

英特爾物聯網 ? 來源:英特爾物聯網 ? 2023-10-13 16:39 ? 次閱讀
OpenVINO工具套件可以加快深度學習視覺應用開發速度,幫助用戶在從邊緣到云的各種英特爾平臺上,更加方便快捷的將AI模型部署到生產系統中。本文的所介紹的 OpenVINO C# API 已支持OpenVINO2023.1.0 版。

C#是由C和C++衍生出來的一種安全的、穩定的、簡單的、優雅的面向對象編程語言,它綜合了 VB簡單的可視化操作和 C++的高運行效率,成為支持成為 .NET 開發的首選語言。作為人工智能開發人員,如果你希望在 C# 中使用OpenVINO,OpenVINO C# API將是你的首選。OpenVINO C# API提供了NuGet程序包,實現在 C# 中一站式安裝與使用OpenVINO。

b68269f6-699e-11ee-939d-92fbcf53809c.png

OpenVINO C# API 項目地址(復制到瀏覽器打開)

https://github.com/guojin-yan/OpenVINO-CSharp-API

OpenVINO C# API 基于 OpenVINOC++ API 研發,下表展示了C#與C++ API的對應關系:

b72277de-699e-11ee-939d-92fbcf53809c.png

本文根據 AI 模型部署的典型步驟,演示 OpenVINO C# API 使用方式,并跟 C++ API 做對比。

01

安裝 OpenVINO C# API

OpenVINO C# API支持NuGet程序包安裝方式,這與 OpenVINO C++ 庫的安裝過程相比,更加簡單。如果使用 Visual Studio 開發 AI 項目,則可以通過NuGet程序包管理功能直接安裝即可,如下圖所示:

b7324434-699e-11ee-939d-92fbcf53809c.png

如果通過 dotnet 命令方式安裝,通過下面語句進行安裝即可:

dotnet add package OpenVINO.CSharp.win

02

導入程序集

OpenVINO C# API程序集全部在 CSharp 命名空間下,因此若要使用OpenVINO C# API,需要先引入命名空間:

using OpenVinoSharp;

03

初始化 OpenVINO運行時

Core 類代表一個 OpenVINO 運行時核心實體,后續的讀取模型、加載模型等方法都需要通過Core類進行創建,在封裝 C# API時,為了與C++ API對應,也對Core類進行了封裝,并封裝了與C++ API中對應的方法。

在 C# 中的初始化方式:

Core core = new Core();

在 C++ 中的初始化方式:

ov::Core core;

04

加載并獲取模型信息

4.1 加載模型

OpenVINO2022.1 版本更新之后,加載模型是使用下面的API方法:

b755a1d6-699e-11ee-939d-92fbcf53809c.png

在 C# 中加載模型的方式:

Model model = core.read_model(model_path);

在 C++ 中的初始化方式:

std::shared_ptr model = core.read_model(model_path);

4.2 獲取模型信息

通過Core.read_model () 方法獲得的Model對象和通過Core.compile_model () 方法獲得的CompiledModel對象,都支持直接訪問屬性獲取輸入與輸出層信息。以 Model 對象獲取模型信息為例,下面是所使用的API方法:

b76a7a8e-699e-11ee-939d-92fbcf53809c.png

Input/Output主要是封裝了模型網絡層,可以通過下面API實現獲取模型的詳細信息:

b7782292-699e-11ee-939d-92fbcf53809c.png

在C#中通過下方代碼,可以直接獲取模型的輸入、輸入層以及模型的 friendly name:

string model_name = model.get_friendly_name();
Input input = model.input();
Output output = model.output();

然后將模型具體信息打印到控制臺頁面:

Console.WriteLine("Model name: {0}", model_name);
Console.WriteLine("/------- [In] -------/");
Console.WriteLine("Input name: {0}", input.get_any_name());
Console.WriteLine("Input type: {0}", input.get_element_type().to_string());
Console.WriteLine("Input shape: {0}", input.get_shape().to_string());
Console.WriteLine("/------- [Out] -------/");
Console.WriteLine("Output name: {0}", output.get_any_name());
Console.WriteLine("Output type: {0}", output.get_element_type().to_string());
Console.WriteLine("Output shape: {0}", output.get_shape().to_string());

獲取模型網絡層信息如下:

Model name: torch_jit
/------- [In] -------/
Input name: data
Input type: float
Input shape: [1,3,224,224]
/------- [Out] -------/
Output name: prob
Output type: float
Output shape: [1,1000]

同樣的輸出信息,我們使用C++ API實現如下:

std::cout << "Model name: " << model->get_friendly_name() << std::endl;
ov::Output input = model->input();
std::cout << "/------- [In] -------/" << std::endl;
std::cout << "Input name: " << input.get_any_name() << std::endl;
std::cout << "Input type: " << input.get_element_type().c_type_string() << std::endl;
std::cout << "Input shape: " << input.get_shape().to_string() << std::endl;
ov::Output output = model->output();
std::cout << "/------- [Out] -------/" << std::endl;
std::cout << "Output name: " << output.get_any_name() << std::endl;
std::cout << "Output type: " << output.get_element_type().c_type_string() << std::endl;
std::cout<"Outputshape:"<std::endl;

05

編譯模型并創建推理請求

在讀取本地模型后,調用模型編譯方法將模型編譯為可以在目標設備上執行的compile_model對象,并通過該對象創建用于推斷已編譯模型的推斷請求對象。下面是所使用的API方法:

b792269c-699e-11ee-939d-92fbcf53809c.png

在C#中編譯模型并創建推理請求的方式:

CompiledModel compiled_model = core.compile_model(model, "AUTO");
InferRequest infer_request = compiled_model.create_infer_request();

使用 C++ API 中編譯模型并創建推理請求的方式:

CompiledModel compiled_model = core.compile_model(model, "AUTO");
InferRequest infer_request = compiled_model.create_infer_request();

06

張量 Tensor

6.1 張量的獲取與設置

在創建推理請求后,系統會自動創建和分配輸入和輸出的張量,張量可以通過 InferRequest對象獲得,并且可以自定義張量并加載到模型指定節點;可以根據張量的輸入輸出序號、名稱以及模型節點 Node 對象獲取和設置,主要 C# API如下:

b7b7ee72-699e-11ee-939d-92fbcf53809c.png

6.2 張量的信息獲取與設置

張量中主要包含的信息有張量的形狀 (Shape) 、張量的數據格式 (OvType-> element.Type) 以及張量中的內存數據。可以通過以下 API 方法操作張量的參數

b7d2ca80-699e-11ee-939d-92fbcf53809c.png

以上方法是對張量的一些基礎操作,除了 set_data、get_data 是 OpenVINO C# API 獨有的,其他接口都與 C++API 一致。

07

加載推理數據

7.1 獲取輸入張量

對于單輸入的模型可以直接通過 get_input_tensor() 方法獲得,并調用 Tensor 的相關方法獲取 Tensor 的相關信息,C# 代碼如下所示:

Tensor input_tensor = infer_request.get_input_tensor();
Console.WriteLine("/------- [Input tensor] -------/");
Console.WriteLine("Input tensor type: {0}", input_tensor.get_element_type().to_string());
Console.WriteLine("Input tensor shape: {0}", input_tensor.get_shape().to_string());
Console.WriteLine("Input tensor size: {0}", input_tensor.get_size());

獲取輸出結果為:

/------- [Input tensor] -------/
Input tensor type: f32
Input tensor shape: Shape : {1, 3, 224, 224}
Input tensor size: 150528

對于上述的同樣輸出內容,我們也可以通過 C++ API實現,C++代碼如下:

ov::Tensor input_tensor = infer_request.get_input_tensor();
std::cout << "/------- [Input tensor] -------/" << std::endl;
std::cout << "Input tensor type: " << input_tensor.get_element_type().c_type_string() << std::endl;
std::cout << "Input tensor shape: " << input_tensor.get_shape().to_string() << std::endl;
std::cout << "Input tensor size: " << input_tensor.get_size() << std::endl;

7.2 添加推理數據

這一步主要是將處理好的圖片數據加載到 Tensor 數據內存中, OpenVINO 的 API 中提供了訪問內存地址的接口,可以獲取數據內存首地址,不過為了更好的加載推理數據,我們此處封裝了 set_data() 方法,可以實現將處理后的圖片數據加載到數據內存上。在 C# 中的代碼為:

Mat input_mat = new Mat();
Shape input_shape = input_tensor.get_shape();
long channels = input_shape[1];
long height = input_shape[2];
long width = input_shape[3];
float[] input_data = new float[channels * height * width];
Marshal.Copy(input_mat.Ptr(0), input_data, 0, input_data.Length);
input_tensor.set_data(input_data);

下面是在 C++ 中實現上述功能的代碼:

cv::Mat input_mat;
float* input_data = input_tensor.data<float>();
ov::Shape input_shape = input_tensor.get_shape();
size_t channels = input_shape[1];
size_t height = input_shape[2];
size_t width = input_shape[3];
for (size_t c = 0; c < channels; ++c) {
  for (size_t h = 0; h < height; ++h) {
    for (size_t w = 0; w < width; ++w) {
      input_data[c * height * width + h * width + w] = input_mat.atfloat, 3>>(h, w)[c];
    }
  }
}

08

模型推理

在加載完推理數據后,就可以調用模型推理的 API 方法推理當前數據,主要使用到的 API 方法為:

b8620d12-699e-11ee-939d-92fbcf53809c.png

調用該方法也較為簡單,只需要調用該 API 接口即可,在 C# 中的代碼為:

infer_request.infer();

C++ 中的代碼與 C++ 中一致。

09

獲取推理結果

對于單輸出的模型可以直接通過 get_output_tensor() 方法獲得,并調用 Tensor 的相關方法獲取 Tensor 的相關信息,C#代碼如下所示:

Tensor output_tensor = infer_request.get_output_tensor();
Console.WriteLine("/------- [Output tensor] -------/");
Console.WriteLine("Output tensor type: {0}", output_tensor.get_element_type().to_string());
Console.WriteLine("Output tensor shape: {0}", output_tensor.get_shape().to_string());
Console.WriteLine("Output tensor size: {0}", output_tensor.get_size());

獲取輸出 output_tensor 信息為:

/------- [Output tensor] -------/
Output tensor type: f32
Output tensor shape: Shape : {1, 1000}
Output tensor size: 1000

對于輸出 Tensor,我們只需要讀取輸出內存上的數據即可,此處我們封裝了 get_data() 方法,可以直接獲取輸出內存上的數據,在 C# 中的代碼為:

float[] result = output_tensor.get_data<float>(1000);

同樣獲取推理結果,在 C++ 中的代碼為:

const float* output_data = output_tensor.data<const float>();
float result[1000];
for (int i = 0; i < 1000; ++i) {
result[i] = *output_data;
output_data++;
}

在獲取結果后,后續的處理需要根據模型的輸出類型做相應的處理。

10

釋放分配的內存

由于 C# 在封裝時采用的 C API接口實現的,因此在 C# 中會產生較多的非托管內存,若該對象出現循環重復創建,會導致過多的內存未釋放導致內存泄漏,因此對于臨時創建的對象在使用后要即使銷毀,銷毀方式也較為簡單,只需要調用對象的 dispose() 方法即可。

output_tensor.dispose();
input_shape.dispose();
infer_request.dispose();
compiled_model.dispose();
input.dispose();
output.dispose();
model.dispose();
core.dispose();

11

Yolov8 分類模型示例

下面代碼展示了 Yolov8 分類模型使用 OpenVINO C# API API 方法部署模型的完整代碼:

using OpenCvSharp;
using OpenCvSharp.Dnn;
using OpenVinoSharp;
using System.Data;
using System.Runtime.InteropServices;


namespace test_openvino_csharp_api
{
  internal class Program
  {
    static void Main(string[] args)
{
      string model_path = "E:\GitSpace\ OpenVINO-CSharp-API \model\yolov8\yolov8s-cls.xml";
      Core core = new Core(); // 初始化推理核心
      Model model = core.read_model(model_path); // 讀取本地模型
      CompiledModel compiled_model = core.compile_model(model, "AUTO"); // 便喲模型到指定設備


      // 獲取模型的輸入輸出信息
      Console.WriteLine("Model name: {0}", model.get_friendly_name());
      Input input = compiled_model.input();
      Console.WriteLine("/------- [In] -------/");
      Console.WriteLine("Input name: {0}", input.get_any_name());
      Console.WriteLine("Input type: {0}", input.get_element_type().to_string());
      Console.WriteLine("Input shape: {0}", input.get_shape().to_string());
      Output output = compiled_model.output();
      Console.WriteLine("/------- [Out] -------/");
      Console.WriteLine("Output name: {0}", output.get_any_name());
      Console.WriteLine("Output type: {0}", output.get_element_type().to_string());
      Console.WriteLine("Output shape: {0}", output.get_shape().to_string());
      // 創建推理請求
      InferRequest infer_request = compiled_model.create_infer_request();
      // 獲取輸入張量
      Tensor input_tensor = infer_request.get_input_tensor();
      Console.WriteLine("/------- [Input tensor] -------/");
      Console.WriteLine("Input tensor type: {0}", input_tensor.get_element_type().to_string());
      Console.WriteLine("Input tensor shape: {0}", input_tensor.get_shape().to_string());
      Console.WriteLine("Input tensor size: {0}", input_tensor.get_size());
      // 讀取并處理輸入數據
      Mat image = Cv2.ImRead(@"E:GitSpace OpenVINO-CSharp-API datasetimagedemo_7.jpg");
      Mat input_mat = new Mat();
      input_mat = CvDnn.BlobFromImage(image, 1.0 / 255.0, new Size(224, 224), 0, true, false);
      // 加載推理數據
      Shape input_shape = input_tensor.get_shape();
      long channels = input_shape[1];
      long height = input_shape[2];
      long width = input_shape[3];
      float[] input_data = new float[channels * height * width];
      Marshal.Copy(input_mat.Ptr(0), input_data, 0, input_data.Length);
      input_tensor.set_data(input_data);
      // 模型推理
      infer_request.infer(); 
      // 獲取輸出張量
      Tensor output_tensor = infer_request.get_output_tensor();
      Console.WriteLine("/------- [Output tensor] -------/");
      Console.WriteLine("Output tensor type: {0}", output_tensor.get_element_type().to_string());
      Console.WriteLine("Output tensor shape: {0}", output_tensor.get_shape().to_string());
      Console.WriteLine("Output tensor size: {0}", output_tensor.get_size());
      // 獲取輸出數據
      float[] result = output_tensor.get_data<float>(1000);
      List<float[]> new_list = new List<float[]> { };
      for (int i = 0; i < result.Length; i++)
      {
        new_list.Add(new float[] { (float)result[i], i });
      }
      new_list.Sort((a, b) => b[0].CompareTo(a[0]));


      KeyValuePair<int, float>[] cls = new KeyValuePair<int, float>[10];
      for (int i = 0; i < 10; ++i)
      {
        cls[i] = new KeyValuePair<int, float>((int)new_list[i][1], new_list[i][0]);
      }
      Console.WriteLine("
 Classification Top 10 result : 
");
      Console.WriteLine("classid probability");
      Console.WriteLine("------- -----------");
      for (int i = 0; i < 10; ++i)
      {
        Console.WriteLine("{0}   {1}", cls[i].Key.ToString("0"), cls[i].Value.ToString("0.000000"));
      }
      // 銷毀非托管內存
      output_tensor.dispose();
      input_shape.dispose();
      infer_request.dispose();
      compiled_model.dispose();
      input.dispose();
      output.dispose();
      model.dispose();
      core.dispose();


    }
  }
}

12

總結

在本文中我們基于模型推理流程,演示了 OpenVINO C# API 使用方法,并和 OpenVINO C++API 進行了對比,展示了 OpenVINO C# API 與 C++API 在使用的區別,這也對使用過 C++ API 的開發者十分友好,上手會十分容易。

在本文中我們只展示了基礎的模型推理流程代碼,也對各個 API 進行了測試,針對其他比較高級的 API 方法,我們后續會繼續進行測試其他 API 方法,向各位開發者展示其用法。

總的來說,目前 OpenVINO C# API 已經完全支持在 Windows 環境下的安裝使用,歡迎各位開發者安裝使用,如有相關問題或優化方法,也歡迎大家提出意見與指導。


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

    關注

    2

    文章

    1500

    瀏覽量

    62013
  • 編程語言
    +關注

    關注

    10

    文章

    1945

    瀏覽量

    34735
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73647

原文標題:OpenVINO? C# API 詳解與演示 | 開發者實戰

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

收藏 人收藏

    評論

    相關推薦

    OpenVINO Java API詳解演示

    英特爾 發行版 OpenVINO 工具套件基于 oneAPI 而開發,可以加快高性能計算機視覺和深度學習視覺應用開發速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確的真實世界
    的頭像 發表于 11-09 17:03 ?1006次閱讀
    <b class='flag-5'>OpenVINO</b> Java <b class='flag-5'>API</b><b class='flag-5'>詳解</b>與<b class='flag-5'>演示</b>

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

    象的位置和邊界。本文將介紹如何使用 OpenVINO C++ API 部署 FastSAM 模型,以實現快速高效的語義分割。在前文中我們發表了《基于 OpenVINO Python
    的頭像 發表于 11-17 09:53 ?923次閱讀
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b>++ <b class='flag-5'>API</b>部署FastSAM模型

    CySmart API C#示例如何正確啟動

    if there is a bare bones example in C# code using the CySmart API to setup and talk to the dongle
    發表于 02-25 06:31

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

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

    運行任何OpenVINO Python演示和示例時報錯怎么解決?

    運行任何OpenVINO? Python 演示和示例時,會出現錯誤: FileNotFoundEror:[WinError 2]。
    發表于 08-15 07:21

    c#源碼_C# 2008源代碼案例下載

    附件為:c#源碼_C# 2008源代碼案例,共有11個附件文件。 第1章 Visual C#2008與窗體界面 案例1 飄動動畫窗體 案例2 透明動畫窗體 案例3 利用API函數實現動
    發表于 10-17 10:10 ?103次下載
    <b class='flag-5'>c#</b>源碼_<b class='flag-5'>C#</b> 2008源代碼案例下載

    C#平臺調用OpenVINO的可行性

    OpenVINO 工具套件是英特爾基于自身現有的硬件平臺開發的一種可以加快高性能計算機視覺和深度學習視覺應用開發速度工具套件,支持各種英特爾平臺的硬件加速器上進行深度學習,并且允許直接異構執行。支持在Windows與Linux系統,官方支持編程語言為Python與C++語
    的頭像 發表于 05-24 09:37 ?1341次閱讀

    OpenVINO工具套件預處理API的概念及使用方法

    OpenVINO 2022.1之前版本不提供OpenVINO Runtime原生的用于數據預處理的API函數1 ,如圖1-1所示,開發者必須通過第三方庫(例如:OpenCV)來實現數據預處理。
    的頭像 發表于 06-09 17:25 ?2120次閱讀

    OpenVINO?的C API 2.0有何新特性?

    你是否準備好在新的一年體驗 OpenVINO 工具套件分發版的最新長期支持 (LTS) 版本?
    的頭像 發表于 02-24 11:14 ?553次閱讀

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

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

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

    RT-DETR 是在 DETR 模型基礎上進行改進的,一種基于 DETR 架構的實時端到端檢測器,它通過使用一系列新的技術和算法,實現了更高效的訓練和推理,我們將在 Python、C++、C# 三個
    的頭像 發表于 10-20 11:15 ?973次閱讀
    基于<b class='flag-5'>OpenVINO</b> Python <b class='flag-5'>API</b>部署RT-DETR模型

    基于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>部署RT-DETR模型

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

    C# 環境下使用該模型應用到工業檢測中,因此在本文中,我們將向大家展示使用 OpenVINO Csharp API 部署 RT-DETR 模型,并對比不同編程平臺下模型部署的速度。
    的頭像 發表于 11-10 16:59 ?758次閱讀
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C#</b> <b class='flag-5'>API</b>部署RT-DETR模型

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

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

    使用OpenVINO C# API部署YOLO-World實現實時開放詞匯對象檢測

    的快速準確識別,并通過AR技術將虛擬元素與真實場景相結合,為用戶帶來沉浸式的交互體驗。在本文中,我們將結合OpenVINO C# API使用最新發布的OpenVINO 2024.0部署
    的頭像 發表于 08-30 16:27 ?652次閱讀
    使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C#</b> <b class='flag-5'>API</b>部署YOLO-World實現實時開放詞匯對象檢測
    主站蜘蛛池模板: 五月婷婷六月合| 欧美videosex性欧美成人| 就要爱综合| 天天弄天天干| 一区二区三区中文字幕| 成人看的午夜免费毛片| 久久久国产在线| 亚洲电影在线| 黄色大片日本| 国产香蕉98碰碰久久人人| 种子 在线播放| 激情网站网址| 国产午夜精品片一区二区三区| 老司机午夜永久在线观看| 女人张腿让男子桶免费动态图| 午夜影吧| 欧美区亚洲区| 久久精品94精品久久精品| 美女福利在线观看| 亚洲香蕉电影| 欧美一区二区三区影院| 天天色天天搞| 国产又黄又爽又猛的免费视频播放| 婷婷五月花| a理论片| 久久香蕉国产视频| 在线欧美色| 成年大片免费播放视频人| 免费看片免| 亚洲国产成人精品不卡青青草原| 国产精品特黄毛片| 91大神成人偷拍在线观看| 一级三级黄色片| hs网站在线观看| 亚洲天堂视频在线播放| 免费级毛片| 天天操你| 亚洲欧美高清在线| 国产三级一区| 国产精品午夜国产小视频| 中国一级黄色毛片|