<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenVINO.NET開源項(xiàng)目全新發(fā)布

          共 8429字,需瀏覽 17分鐘

           ·

          2023-10-24 10:13

          為.NET打開新大門:OpenVINO.NET開源項(xiàng)目全新發(fā)布

          在AI的應(yīng)用越來越廣泛的今天,優(yōu)化深度學(xué)習(xí)模型并進(jìn)行推理部署已經(jīng)成為了一門必要的技術(shù)。Intel開發(fā)的OpenVINO工具包(Open Visual Inference and Neural network Optimization)就是這樣一款強(qiáng)大的工具。作為一個開源的工具包,OpenVINO為開發(fā)者提供了強(qiáng)大的深度學(xué)習(xí)模型優(yōu)化和推理功能,支持跨不同的Intel硬件平臺進(jìn)行部署,包括CPU, 集成GPU, Intel Movidius VPU, 和FPGAs。該工具包的初衷就是實(shí)現(xiàn)一處編碼后,能在任何地方部署的機(jī)器學(xué)習(xí)推理的解決方案。

          然而在與深度學(xué)習(xí)模型推理打交道的過程中,我逐漸發(fā)現(xiàn)原本我基于百度飛槳paddlepaddle開發(fā)過的PaddleSharp項(xiàng)目在CPU推理OCR性能方面,同樣的模型,OpenVINO的性能更勝一籌。于是我開始關(guān)注OpenVINO,發(fā)現(xiàn)它的C API對于.NET世界來說并沒有一個合適且高質(zhì)量的封裝。市面上的一部分封裝可能只是為了滿足特定項(xiàng)目的需求,功能不夠完善;有些雖然功能完善但命名規(guī)范可能不符合.NET社區(qū)規(guī)范;有些在錯誤處理和性能方面存在問題,或者無法做到跨平臺,這與OpenVINO的跨平臺性矛盾。.NET世界亟需一個更高質(zhì)量的OpenVINO封裝,而我感覺我有能力去努努力。因此,我在今年的節(jié)前立下了flag——國慶期間大干一票,開始了OpenVINO.NET的開源之旅。

          如何使用

          NuGet包簡介

          使用OpenVINO.NET,最簡單的方法不是克隆我的Github庫(但歡迎star),而是使用我發(fā)布的NuGet包,一般它需要配合OpenCVSharp4一起使用,因此你通常可以安裝下面4個NuGet:

          • Sdcb.OpenVINO
          • Sdcb.OpenVINO.runtime.win-x64
          • OpenCvSharp4
          • OpenCvSharp4.runtime.win

          OpenCvSharp4一樣,我發(fā)布的包也包含.NET PInvoke包和平臺動態(tài)鏈接庫包,如上Sdcb.OpenVINO為.NET PInvoke包,Sdcb.OpenVINO.runtime.win-x64為兼容Windows平臺的動態(tài)鏈接庫包,里面包含了一些dll。

          如果是基于Linux,我專門發(fā)布了一個鏡像用于減輕部署壓力:sdflysha/openvino-base,這個鏡像基于.NET 7 SDK的Ubuntu 22.04版本,包含了OpenCvSharp 4.8的運(yùn)行時和所有OpenVINO的運(yùn)行時依賴,要使用這個鏡像,需將.NET項(xiàng)目第一行的FROM mcr.microsoft.com/dotnet/runtime改為FROM sdflysha/openvino-base,使用時當(dāng)然也需要安裝ubuntu 22.04平臺的動態(tài)鏈接庫包:Sdcb.OpenVINO.runtime.ubuntu.22.04-x64

          實(shí)際上我發(fā)布了8種不同平臺的NuGet包,這是所有我此項(xiàng)目新發(fā)布的NuGet包列表:

          包名 版本號 簡介
          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

          有興趣的朋友一定會想,發(fā)布并維護(hù)這么多包做起來一定很麻煩。其實(shí)還好,感謝我此前PaddleSharp項(xiàng)目的經(jīng)驗(yàn)(那個項(xiàng)目也維護(hù)了一屏幕的包),我基于官網(wǎng)的filetree.json做了一些解析,它可以一鍵自動下載并生成上面這些NuGet包,有興趣的朋友可以看看我Github中Sdcb.OpenVINO.NuGetBuilder這個項(xiàng)目了解我是如何解析并自動創(chuàng)建NuGet包的。

          API設(shè)計

          和我此前做過的PaddleSharp, Sdcb.LibRaw, Sdcb.Arithmetic, Sdcb.FFmpeg等開源項(xiàng)目相似,我這個項(xiàng)目也秉持下面這些原則:

          1. 完全支持低級C API,也就是說如果你更享受原汁原味的C API的感覺——或者像我一樣不想失去對低層的掌控,使用OpenVINO.NET可以滿足這一期望;
          2. 同時也為所有的低級API提供了便利好用的高層API;
          3. 高層API符合C#的命名規(guī)范,完全利用了C#的優(yōu)秀特性,做好了異常錯誤處理;
          4. 高層API使用了C#世界有利于性能優(yōu)化的特性,如ReadOnlySpan<T>,比如恰當(dāng)使用值類型;
          5. 所有的高層API都提供了完善了XML注釋,并經(jīng)過了詳盡的單元測試;
          6. 此外我還控制了我攜帶的“私貨”——沒必要做成公有的API一律做成internalprivate,且不污染常用類型的擴(kuò)展方法

          目前這個項(xiàng)目已經(jīng)基本穩(wěn)定,基于這些API,我測試發(fā)現(xiàn)它和C/C++推理性能幾乎并無差異,PaddleOCR推理時,性能可以比PaddleSharp項(xiàng)目快得多,且得益于C#的優(yōu)秀語言特性,使用起來會非常的省心。

          設(shè)計FAQ:

          • Q: 為何OpenVINO.NET沒有直接引用OpenCvSharp4
            • A: 我個人很喜歡OpenCvSharp4,開源協(xié)議很友好,但一來OpenCvSharp4官方支持的平臺不夠多,且有些人可能更喜歡Emgu.CVImageSharp,盡量不做綁架為好
          • Q: C API有158個函數(shù)接口、26個接口體,也寫了詳盡的XML注釋,是怎么在短時間內(nèi)高質(zhì)量地做到的?
            • A: 我是自動生成的,我使用了CppSharp項(xiàng)目,CppSharp將C API的頭文件內(nèi)容轉(zhuǎn)換為抽象語法樹(AST),然后我將這些AST轉(zhuǎn)換為XML注釋詳盡的C#代碼。其實(shí)我已經(jīng)不是第一次將CppSharp應(yīng)用到開源項(xiàng)目中,有興趣的朋友可以看我Github Sdcb.OpenVINO.AutoGen這個項(xiàng)目了解實(shí)現(xiàn)的細(xì)節(jié)。

          為想了解如何使用的朋友,我還寫了基于yolov8的檢測和分類的推理示例,OpenVINO官方的人臉檢測示例以及我為它原生設(shè)計和遷移的PaddleOCR項(xiàng)目。另外我還想暢談一下項(xiàng)目的設(shè)計思路和未來的發(fā)展方向。

          4個示例

          人臉檢測 - 基于OpenVINO官網(wǎng)提供的face-detection-0200模型

          我這個示例中使用的是OpenVINO官網(wǎng)提供的face-detection-0200模型,官網(wǎng)提供了介紹頁面:https://docs.openvino.ai/2023.1/omz_models_model_face_detection_0200.html。

          詳盡的示例代碼可以從我創(chuàng)建的mini-openvino-facedetection這個Github倉庫找到,運(yùn)行時,它會將攝像頭中定位人臉位置并框出來,效果圖如下:


          01-face-detection


          如圖,人臉識別效果正常,上面也標(biāo)注了每幀推理耗時(約2.14ms)。

          我使用的是AMD R7 5800X進(jìn)行的CPU推理,其實(shí)代碼也支持Intel的GPU。將DeviceOptions的第一個參數(shù)從"CPU"(默認(rèn)值)改為"GPU"即可,但我只有集成顯卡,測試發(fā)現(xiàn)雖然能正常工作,且CPU使用率降低了且GPU使用率上升了,但GPU推理時間比CPU還更慢。

          物體識別 - 基于yolov8模型的物體分類

          在上一個例子中,我們已經(jīng)看到了如何使用OpenVINO.NET進(jìn)行人臉檢測。接下來,我們再來看一下如何使用物體識別模型進(jìn)行物體分類。

          這個示例使用的是yolov8官網(wǎng)下載的YOLOv8n模型,這個模型支持80種物體的檢測。下載后格式為.pt文件,表示pytorch模型,需使用yolo export model=yolov8n.pt format=openvino命令(yolo通過pip安裝ultralytics包得到)將其導(dǎo)出為openvino格式的模型,openvino模型包含一個xml和一個bin文件。

          詳盡的示例代碼可以從我創(chuàng)建的另一個倉庫:sdcb-openvino-yolov8-det中找到,倉庫我我已經(jīng)將模型轉(zhuǎn)換好了。運(yùn)行時,代碼會讀取攝像頭的每一幀,并將檢測到的物體位置框出來,效果圖如下:

          02-yolov8-det

          如圖,檢測出了3個物體,畫面中的人、手機(jī)和水杯,總耗時約30ms。

          物體分類 - 基于yolov8的分類模型

          yolov8模型提供了1000種不同的預(yù)定義分類,和上面的模型一樣,需要從yolov8官網(wǎng)下載并轉(zhuǎn)換,只想快速嘗鮮的朋友可以直接打開我寫的另一個Github示例:sdcb-openvino-yolov8-cls

          運(yùn)行時,代碼會讀取一張圖片,然后嘗試推測出該圖片最像1000種分類中的哪一種,在我的代碼示例中,輸入圖片為hen.jpg:

          03-hen.jpg

          輸出如下:

          class id=hen, score=0.59preprocess time: 0.00msinfer time: 1.65mspostprocess time: 0.49msTotal time: 2.14ms

          推理得到最有可能的分類是hen(母雞),信心值為0.59,總耗時2.14ms。

          PaddleOCR - 混合3種模型

          PaddleOCR是百度飛槳發(fā)布了一款性能、精度都較好的開源模型。

          和PaddleSharp項(xiàng)目一樣,我給OpenVINO.NET項(xiàng)目也內(nèi)置了PaddleOCR的便利化項(xiàng)目,且API設(shè)計和PaddleSharp幾乎完全一樣,熟悉PaddleSharp的朋友應(yīng)該可以很輕松地遷移到OpenVINO.NET,我專門為PaddleOCR提供發(fā)布了下面2個NuGet包:

          包名 版本號 ?? 描述
          Sdcb.OpenVINO.PaddleOCR OCR主包
          Sdcb.OpenVINO.PaddleOCR.Models.Online 包含需在線下載的模型包

          加上上面那4個包,運(yùn)行基于OpenVINO.NET的PaddleOCR需要下載下面這6個包:

          • Sdcb.OpenVINO
          • Sdcb.OpenVINO.runtime.win-x64
          • OpenCvSharp4
          • OpenCvSharp4.runtime.win
          • Sdcb.OpenVINO.PaddleOCR
          • Sdcb.OpenVINO.PaddleOCR.Models.Online

          最小代碼示例如下:

          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(await new HttpClient().GetByteArrayAsync("https://io.starworks.cc:88/paddlesharp/ocr/samples/xdr5450.webp"), ImreadModes.Color);
          using (PaddleOcrAll all = new(model){ AllowRotateDetection = true, Enable180Classification = 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}"); }}

          運(yùn)行效果如下:

          elapsed=246 msDetected all texts:高速4X4160MHz數(shù)據(jù)流5GHz頻段流數(shù)多一倍速度快一倍3AX5400無線規(guī)格的路由器,5GHz頻段采用高速4X4160MHz數(shù)據(jù)流,相比市面上主流的AX3000路由器(2X2數(shù)據(jù)流)5GHz頻段流數(shù)多一倍,速度快一倍。...

          耗時為246ms,根據(jù)我的測試,實(shí)際上第二次運(yùn)行OpenVINO可以降低到140ms左右,同樣的代碼PaddleSharp耗時約452ms(PaddleSharp使用MKLDNN,僅測試首次運(yùn)行),顯然使用我的新開源項(xiàng)目OpenVINO.NET更快。

          上面完整的可運(yùn)行代碼,可以從我的Github另一個倉庫mini-openvino-paddleocr

          結(jié)語

          本文中,我向大家介紹了如何使用我新發(fā)布的OpenVINO.NET,并提供了數(shù)個生動的示例來演示如何將OpenVINO.NET用于深度學(xué)習(xí)模型的推理任務(wù)。雖然我只展示了四個應(yīng)用示例,其實(shí)它們都可以被看作為學(xué)習(xí)OpenVINO.NET使用的良好起點(diǎn)。

          通過這四個示例,讀者可以輕松理解OpenVINO.NET的工作原理,在此基礎(chǔ)上擴(kuò)展將其用于其它模型的推理是加深理解和實(shí)踐的不二選擇。我專注于.NET開源項(xiàng)目,并不斷地為全球.NET開發(fā)者提供更多的可能性,我尤其期待看到大家將OpenVINO.NET用于自身項(xiàng)目之中。

          我相信開源的力量以及它為我們提供的無盡可能性。因此,我將OpenVINO.NET作為開源項(xiàng)目,希望它能幫助所有在尋找高效,便捷的深度學(xué)習(xí)推理工具的.NET開發(fā)者。如果你發(fā)現(xiàn)這個項(xiàng)目有用,或者正在使用它,我非常歡迎你能去我的項(xiàng)目主頁上給我一個star??,這對我將會是巨大的鼓勵!你們的使用經(jīng)驗(yàn)和星標(biāo)都是我繼續(xù)進(jìn)行.NET開源項(xiàng)目工作的動力!

          我還創(chuàng)建了一個.NET騷操作技術(shù)交流QQ群:495782587,歡迎對.NET“騷”操作感興趣的朋友加入一起探討。

          最后,如果你對我的業(yè)余開源工作感興趣,并希望獲取更多有關(guān)我.NET開源項(xiàng)目的信息,也可以關(guān)注我的微信公眾號:【DotNet騷操作】

          DotNet騷操作

          讓我們一起探索.NET的無盡可能性。期待.NET世界未來的更多精彩!


          瀏覽 64
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  乱系列视频在线观看 | 爱搞搞就要搞 | 操操AV影音 | 日本一级 黄 色 片图片视频 | 天天干夜夜操 |