前言
在AI的套用越來越廣泛的今天,最佳化深度學習模型並進行推理部署已經成為了一門必要的技術。
Intel開發的OpenVINO工具包(Open Visual Inference and Neural network Optimization)就是這樣一款強大的工具。
作為一個開源的工具包,OpenVINO為開發者提供了強大的深度學習模型最佳化和推理功能,支持跨不同的Intel硬體平台進行部署,包括CPU, 整合GPU, Intel Movidius VPU, 和FPGAs。
該工具包的初衷就是實作一處編碼後,能在任何地方部署的機器學習推理的解決方案。然而在與深度學習模型推理打交道的過程中,我逐漸發現原本我基於百度飛槳paddlepaddle開發過的PaddleSharp計畫在CPU推理OCR效能方面,同樣的模型,OpenVINO的效能更勝一籌。於是我開始關註OpenVINO,發現它的C API對於.NET世界來說並沒有一個合適且高品質的封裝。
市面上的一部份封裝可能只是為了滿足特定計畫的需求,功能不夠完善;有些雖然功能完善但命名規範可能不符合.NET社群規範;有些在錯誤處理和效能方面存在問題,或者無法做到跨平台,這與OpenVINO的跨平台性矛盾。
.NET世界亟需一個更高品質的OpenVINO封裝,而我感覺我有能力去努努力。因此,我在今年的節前立下了flag——國慶期間大幹一票,開始了OpenVINO.NET的開源之旅。
地址:https://github.com/sdcb/openvino.net
包名 | 版本號 | 簡介 |
---|---|---|
Sdcb.OpenVINO | .NET PInvoke | |
Sdcb.OpenVINO.runtime.centos.7-x64 | CentOS 7 x64 | |
Sdcb.OpenVINO.runtime.debian.9-arm | Debian 9 ARM | |
Sdcb.OpenVINO.runtime.debian.9-arm64 | Debian 9 ARM64 | |
Sdcb.OpenVINO.runtime.rhel.8-x64 | RHEL 8 x64 | |
Sdcb.OpenVINO.runtime.ubuntu.18.04-x64 | Ubuntu 18.04 x64 | |
Sdcb.OpenVINO.runtime.ubuntu.20.04-x64 | Ubuntu 20.04 x64 | |
Sdcb.OpenVINO.runtime.ubuntu.22.04-x64 | Ubuntu 22.04 x64 | |
Sdcb.OpenVINO.runtime.win-x64 | Windows x64 |
Q: 為何
OpenVINO.NET
沒有直接參照
OpenCvSharp4
?
A: 我個人很喜歡
OpenCvSharp4
,開源協定很友好,但一來
OpenCvSharp4
官方支持的平台不夠多,且有些人可能更喜歡
Emgu.CV
或
ImageSharp
,盡量不做綁架為好
Q: C API有158個函式介面、26個介面體,也寫了詳盡的
XML
註釋,是怎麽在短時間內高品質地做到的?
A: 我是自動生成的,我使用了CppSharp計畫,CppSharp將C API的表頭檔內容轉換為抽象語法樹(AST),然後我將這些AST轉換為XML註釋詳盡的
C#
程式碼。其實我已經不是第一次將CppSharp套用到開源計畫中,有興趣的朋友可以看我Github Sdcb.OpenVINO.AutoGen這個計畫了解實作的細節。
為想了解如何使用的朋友,我還寫了基於
yolov8
的檢測和分類的推理範例,
OpenVINO
官方的人臉檢測範例以及我為它原生設計和遷移的
PaddleOCR
計畫。另外我還想暢談一下計畫的設計思路和未來的發展方向。
四個範例
人臉檢測 - 基於OpenVINO官網提供的face-detection-0200模型
我這個範例中使用的是OpenVINO官網提供的
face-detection-0200
模型,官網提供了介紹頁面:https://docs.openvino.ai/2023.1/omz_models_model_face_detection_0200.html。詳盡的範例程式碼可以從我建立的mini-openvino-facedetection這個Github倉庫找到,執行時,它會將網路攝影機中定位人臉位置並框出來,效果圖如下:
如圖,檢測出了3個物體,畫面中的人、手機和水杯,總耗時約30ms。
物體分類 - 基於yolov8的分類模型
yolov8模型提供了1000種不同的預定義分類,和上面的模型一樣,需要從yolov8官網下載並轉換,只想快速嘗鮮的朋友可以直接開啟我寫的另一個Github範例:sdcb-openvino-yolov8-cls執行時,程式碼會讀取一張圖片,然後嘗試推測出該圖片最像1000種分類中的哪一種,在我的程式碼範例中,輸入圖片為hen.jpg:
輸出如下:
classid=hen, score=0.59
preprocess time: 0.00ms
infer time: 1.65ms
postprocess time: 0.49ms
Total time: 2.14ms
using OpenCvSharp;
using Sdcb.OpenVINO.PaddleOCR.Models.Online;
using Sdcb.OpenVINO.PaddleOCR.Models;
using Sdcb.OpenVINO.PaddleOCR;
using System.Diagnostics;
using System;
FullOcrModel model = await OnlineFullModels.ChineseV3.DownloadAsync();
using Mat src = Cv2.ImDecode(awaitnew HttpClient().GetByteArrayAsync("https://io.starworks.cc:88/paddlesharp/ocr/samples/xdr5450.webp"), ImreadModes.Color);
using (PaddleOcrAll all = new(model)
{
AllowRotateDetection = true,
Enable180 classification = true,
})
{
// Load local file by following code:
// using (Mat src2 = Cv2.ImRead(@"C:\test.jpg"))
Stopwatch sw = Stopwatch.StartNew();
PaddleOcrResult result = all.Run(src);
Console.WriteLine($"elapsed={sw.ElapsedMilliseconds} ms");
Console.WriteLine("Detected all texts: \n" + result.Text);
foreach (PaddleOcrResultRegion region in result.Regions)
{
Console.WriteLine($"Text: {region.Text}, Score: {region.Score}, RectCenter: {region.Rect.Center}, RectSize: {region.Rect.Size}, Angle: {region.Rect.Angle}");
}
}
執行效果如下:
elapsed=246 ms
Detected all texts:
高速4X4160MHz數據流
5GHz頻段流數多一倍
速度快一倍3
AX5400無線規格的路由器,
5GHz頻段采用高速4X4160MHz數據流,
相比市面上主流的AX3000路由器(2X2數據流)
5GHz頻段流數多一倍,速度快一倍。
...
如果你發現這個計畫有用,或者正在使用它,我非常歡迎你能去我的計畫主頁上給我一個star🌟,這對我將會是巨大的鼓勵!你們的使用經驗和星標都是我繼續進行.NET開源計畫工作的動力!
轉自:.NET騷操作
連結:cnblogs.com/sdflysha/p/20231015-sdcb-openvino-net.html