當前位置: 妍妍網 > 碼農

為.NET開啟新大門:OpenVINO.NET開源計畫全新釋出

2024-02-10碼農

前言

在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