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

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

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

OpenVINOSharp常用API詳解與演示

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

作者:顏國進 英特爾邊緣計算創(chuàng)新大使

技術指導:武卓,李翊瑋

OpenVINO工具套件可以加快深度學習視覺應用開發(fā)速度,幫助用戶在從邊緣到云的各種英特爾平臺上,更加方便快捷的將 AI 模型部署到生產(chǎn)系統(tǒng)中。

C# 是由 C 和 C++ 衍生出來的一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的面向?qū)ο?a target="_blank">編程語言,它綜合了 VB 簡單的可視化操作和 C++ 的高運行效率,成為支持成為.NET 開發(fā)的首選語言。作為人工智能開發(fā)人員,如果你希望在 C# 端使用 OpenVINO ,OpenVINOSharp 將是你的首選,并且制作了 NuGet 程序包,實現(xiàn)在 C# 端了一站式安裝與使用 OpenVINO。

OpenVINOSharp 在制作時參考了 OpenVINO C++ API,因此對于之前使用過 OpenVINO 的人十分友好。下面表格向我們展示了 C# 與 C++ API 的對應關系

b7632d1a-47ed-11ee-97a6-92fbcf53809c.jpg

在本文中,將會根據(jù)模型部署的一般步驟,演示從模型加載到推理的方法函數(shù)使用方式,并于 C++ API 做對比。

1.1安裝 OpenVINOSharp

OpenVINOSharp 支持 NuGet 程序包安裝方式,這與在 C++ 中安裝過程相比,較為簡單,并且程序包中包含了 OpenVINO 2023.0 發(fā)行版本,可以通過 NuGet 安裝后直接使用。

如果使用 Visual Studio 編譯該項目,則可以通過 NuGet 程序包管理功能直接安裝即可:

b77628fc-47ed-11ee-97a6-92fbcf53809c.png

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

dotnet add package OpenVinoSharp.win

向右滑動查看完整代碼

1.2導入程序集

OpenVINOSharp 程序集全部在命名空間 OpenVinoSharp 下,因此若要使用 OpenVINOSharp ,需要先引入命名空間:

using OpenVinoSharp

1.3初始化 OpenVINO 運行時內(nèi)核

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

在 C# 中的初始化方式:

Core core = new Core()

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

ov::Core core;

1.4加載并獲取模型信息

1.4.1 加載模型

OpenVINO 2022.1版本更新之后,加載,下面是所使用的 API 方法:

API 作用
Core.read_model () 將模型從硬盤載入內(nèi)存,并返回Model對象。

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

Model model = core.read_model(model_path);

向右滑動查看完整代碼

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

std::shared_ptrmodel = core.read_model(model_path);

向右滑動查看完整代碼

1.4.1 獲取模型信息

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

API 作用
Model.get_friendly_name() 獲取模型的friendly name。
Model.input() 獲取模型的輸入層,并返回 Input 對象。
Model.output() 獲取模型的輸出層,并返回 Output 對象。

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

API 作用
Output.get_any_name() 獲取模型網(wǎng)絡層的名字。
Output.get_element_type() 獲取模型網(wǎng)絡層的數(shù)據(jù)類型,并返回 OvType 對象,OvType 主要封裝了網(wǎng)絡的基本數(shù)據(jù)類型。
Output.get_shape() 獲取模型網(wǎng)絡層的形狀,并返回 Shape 對象,Shape 封裝了網(wǎng)絡層的形狀數(shù)組。

在 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());

向右滑動查看完整代碼

獲取模型網(wǎng)絡層信息如下:

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 實現(xiàn)如下:

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 << "Output shape: " << output.get_shape().to_string() << std::endl;

向右滑動查看完整代碼

1.5編譯模型并創(chuàng)建推理請求

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

API 作用
Core.compile_model() 將模型編譯為可以在目標設備上執(zhí)行的 compile_model 對象。
CompiledModel.create_infer_request() 創(chuàng)建用于推斷已編譯模型的推斷請求對象,創(chuàng)建的請求已經(jīng)分配了輸入和輸出張量。

在 C# 中編譯模型并創(chuàng)建推理請求的方式:

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

向右滑動查看完整代碼

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

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

向右滑動查看完整代碼

1.6張量Tensor

1.6.1 張量的獲取與設置

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

API 作用
InferRequest.set_tensor() 設置要推斷的輸入/輸出張量。
InferRequest.set_input_tensor() 設置要推斷的輸入張量。
InferRequest.set_output_tensor() 設置要推斷的輸出張量
InferRequest.get_tensor() 獲取用于推理的輸入/輸出張量。
InferRequest.get_input_tensor() 獲取用于推理的輸入張量。
InferRequest.get_output_tensor() 設置要推理的輸出張量

1.6.2 張量的信息獲取與設置

張量中主要包含的信息有張量的形狀 (Shape)、張量的數(shù)據(jù)格式 (OvType-> element.Type) 以及張量中的內(nèi)存數(shù)據(jù)??梢酝ㄟ^以下 API 方法操作張量的參數(shù)

API 作用
Tensor.set_shape () 給張量設置一個新的形狀。
Tensor.get_shape() 獲取張量的形狀。
Tensor.get_element_type() 獲取張量的數(shù)據(jù)類型。
Tensor.get_size() 獲取張量的數(shù)據(jù)長度。
Tensor.get_byte_size() 獲取張量的字節(jié)大小。
Tensor.data() 獲取張量的內(nèi)存地址。
Tensor.set_data() 將指定類型的數(shù)據(jù)加載到張量內(nèi)存下。
Tensor.get_data() 從張量中讀取指定類型的數(shù)據(jù)。

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

1.7加載推理數(shù)據(jù)

1.7.1 獲取輸入張量

對于單輸入的模型可以直接通過 get_input_tensor() 方法獲得,并調(diào)用 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

向右滑動查看完整代碼

對于上述的同樣輸出內(nèi)容,我們也可以通過 C++ API 實現(xiàn),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;

向右滑動查看完整代碼

1.7.2 添加推理數(shù)據(jù)

這一步主要是將處理好的圖片數(shù)據(jù)加載到 Tensor 數(shù)據(jù)內(nèi)存中,OpenVINO 的 API 中提供了訪問內(nèi)存地址的接口,可以獲取數(shù)據(jù)內(nèi)存首地址,不過為了更好的加載推理數(shù)據(jù),我們此處封裝了 set_data() 方法,可以實現(xiàn)將處理后的圖片數(shù)據(jù)加載到數(shù)據(jù)內(nèi)存上。在 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++ 中實現(xiàn)上述功能的代碼:

cv::Mat input_mat;
float* input_data = input_tensor.data();
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.at>(h, w)[c];
    }
  }
}

向右滑動查看完整代碼

1.8模型推理

在加載完推理數(shù)據(jù)后,就可以調(diào)用模型推理的 API 方法推理當前數(shù)據(jù),主要使用到的 API 方法為:

API 作用
InferRequest.infer() 在同步模式下推斷指定的輸入。

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

infer_request.infer();

向右滑動查看完整代碼

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

1.9獲取推理結果

對于單輸出的模型可以直接通過 get_output_tensor() 方法獲得,并調(diào)用 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,我們只需要讀取輸出內(nèi)存上的數(shù)據(jù)即可,此處我們封裝了 get_data() 方法,可以直接獲取輸出內(nèi)存上的數(shù)據(jù),在 C# 中的代碼為:

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

向右滑動查看完整代碼

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

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

向右滑動查看完整代碼

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

1.10釋放分配的內(nèi)存

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

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

1.11Yolov8 分類模型示例

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

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


namespace test_openvinosharp_api
{
  internal class Program
  {
    static void Main(string[] args)
    {
      string model_path = "E:\GitSpace\OpenVinoSharp\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());
      // 創(chuàng)建推理請求
      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());
      // 讀取并處理輸入數(shù)據(jù)
      Mat image = Cv2.ImRead(@"E:GitSpaceOpenVinoSharpdatasetimagedemo_7.jpg");
      Mat input_mat = new Mat();
      input_mat = CvDnn.BlobFromImage(image, 1.0 / 255.0, new Size(224, 224), 0, true, false);
      // 加載推理數(shù)據(jù)
      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());
      // 獲取輸出數(shù)據(jù)
      float[] result = output_tensor.get_data(1000);
      List new_list = new List { };
      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[] cls = new KeyValuePair[10];
      for (int i = 0; i < 10; ++i)
 ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ?cls[i] = new KeyValuePair((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"));
 ? ? ? ? ? ?}
 ? ? ? ? ? ?// 銷毀非托管內(nèi)存
 ? ? ? ? ? ?output_tensor.dispose();
 ? ? ? ? ? ?input_shape.dispose();
 ? ? ? ? ? ?infer_request.dispose();
 ? ? ? ? ? ?compiled_model.dispose();
 ? ? ? ? ? ?input.dispose();
 ? ? ? ? ? ?output.dispose();
 ? ? ? ? ? ?model.dispose();
 ? ? ? ? ? ?core.dispose();


 ? ? ? ?}
 ? ?}
}

向右滑動查看完整代碼

1.12總結

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

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

總的來說,目前 OpenVINOSharp 已經(jīng)完全支持在 Windows 環(huán)境下的安裝使用,歡迎各位開發(fā)者安裝使用,如有相關問題或優(yōu)化方法,也歡迎大家提出意見與指導。

審核編輯:湯梓紅

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

    關注

    61

    文章

    9993

    瀏覽量

    172022
  • API
    API
    +關注

    關注

    2

    文章

    1507

    瀏覽量

    62208
  • C++
    C++
    +關注

    關注

    22

    文章

    2113

    瀏覽量

    73738
  • 深度學習
    +關注

    關注

    73

    文章

    5510

    瀏覽量

    121329
  • OpenVINO
    +關注

    關注

    0

    文章

    94

    瀏覽量

    214

原文標題:OpenVINOSharp 常用 API 詳解與演示|開發(fā)者實戰(zhàn)

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

收藏 人收藏

    評論

    相關推薦

    fs模塊常用API

    fs模塊常用API
    發(fā)表于 05-22 16:02

    常用API及使用說明

    為了方便用戶使用,這里列出了常用API,并給出了相關的使用說明。
    發(fā)表于 03-30 06:20

    IoTHubClient庫提供的常用API

    在使用 Azure 編寫應用的過程中,使用 IoTHubClient 庫就可以輕松發(fā)送和接收消息,本章介紹 IoTHubClient 庫提供的常用 API。更多詳細的 API 請參考 Azure SDK 的 C
    發(fā)表于 03-30 07:23

    音箱評測的常用術語詳解

    音箱評測的常用術語詳解
    發(fā)表于 11-22 12:27 ?1759次閱讀

    Nios_ii_API常用函數(shù)解析

    開發(fā)nios程序?qū)S茫?b class='flag-5'>API常用函數(shù),可當手冊使用。
    發(fā)表于 11-03 14:04 ?29次下載

    高手總結java常用API(免費下載)

    高手總結java常用API(免費下載)。
    發(fā)表于 11-06 11:27 ?0次下載

    常用API-常見對象需要練習的方法列表

    常用API-常見對象需要練習的方法列表。
    發(fā)表于 03-16 17:18 ?9次下載

    Android開發(fā)手冊—API函數(shù)詳解

    Android開發(fā)手冊—API函數(shù)詳解
    發(fā)表于 10-17 09:01 ?13次下載
    Android開發(fā)手冊—<b class='flag-5'>API</b>函數(shù)<b class='flag-5'>詳解</b>

    基于Android開發(fā)手冊—API函數(shù)詳解

    基于Android開發(fā)手冊—API函數(shù)詳解
    發(fā)表于 10-24 09:06 ?18次下載
    基于Android開發(fā)手冊—<b class='flag-5'>API</b>函數(shù)<b class='flag-5'>詳解</b>

    黑客常用WinAPI函數(shù)有哪些_常用的7大API函數(shù)詳解

    為了對黑客常用的Windows API有個更全面的了解以及方便日后使用API方法的查詢,特將這些常用API按照7大分類進行整理如下,希望對
    的頭像 發(fā)表于 05-12 09:24 ?8529次閱讀

    英特爾圖形上Vulkan API的實時演示

    在GDC 2015上記錄了來自Khronos?的OpenGL與Vulkan?API的實時演示。使用Vulkan?的Kishonti原型也進行了演示。 Vulkan?API是一種統(tǒng)一規(guī)范
    的頭像 發(fā)表于 11-07 06:56 ?2927次閱讀

    API安全性基礎知識的詳解

    API是使軟件服務可用于工作負載或應用程序以進行雙向通信和消息共享的接口。 API也通常用于在不同進程之間共享內(nèi)存。 API本質(zhì)上是無狀態(tài)的,并且通常包含完成交易所需的所有信息,這與W
    的頭像 發(fā)表于 12-25 17:15 ?703次閱讀

    Android開發(fā)手冊API函數(shù)詳解資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是Android開發(fā)手冊API函數(shù)詳解資料免費下載。
    發(fā)表于 02-22 08:00 ?0次下載

    AD常用規(guī)則圖片詳解下載

    AD常用規(guī)則圖片詳解下載
    發(fā)表于 05-17 11:01 ?0次下載

    OpenVINO? C# API詳解演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫的安裝過程相比,更加簡單。如果使用 Visual Studio 開發(fā) AI 項目,則可以通過 NuGet 程序包管理功能直接安裝即可
    的頭像 發(fā)表于 10-13 16:39 ?801次閱讀
    OpenVINO?  C# <b class='flag-5'>API</b><b class='flag-5'>詳解</b>與<b class='flag-5'>演示</b>