以下文章來源于CSharp與邊緣模型部署 ,作者椒顏PiPi蝦
作者:顏國進(jìn)
英特爾邊緣計(jì)算創(chuàng)新大使
YOLO-World是一個(gè)融合了實(shí)時(shí)目標(biāo)檢測與增強(qiáng)現(xiàn)實(shí)(AR)技術(shù)的創(chuàng)新平臺,旨在將現(xiàn)實(shí)世界與數(shù)字世界無縫對接。該平臺以YOLO(You Only Look Once)算法為核心,實(shí)現(xiàn)了對視頻中物體的快速準(zhǔn)確識別,并通過AR技術(shù)將虛擬元素與真實(shí)場景相結(jié)合,為用戶帶來沉浸式的交互體驗(yàn)。在本文中,我們將結(jié)合OpenVINO C# API使用最新發(fā)布的OpenVINO 2024.0部署 YOLO-World實(shí)現(xiàn)實(shí)時(shí)開放詞匯對象檢測:
OpenVINO C# API項(xiàng)目鏈接:
https://github.com/guojin-yan/OpenVINO-CSharp-API.git
使用OpenVINO C# API 部署 YOLO-World全部源碼:
https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples/tree/master/model_samples/yolo-world/yolo-world-opencvsharp-net4.8
1前言
1OpenVINO C# API
英特爾發(fā)行版OpenVINO工具套件基于oneAPI而開發(fā),可以加快高性能計(jì)算機(jī)視覺和深度學(xué)習(xí)視覺應(yīng)用開發(fā)速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準(zhǔn)確的真實(shí)世界結(jié)果部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO可賦能開發(fā)者在現(xiàn)實(shí)世界中部署高性能應(yīng)用程序和算法。
2024年3月7日,英特爾發(fā)布了開源 OpenVINO 2024.0 工具包,用于在各種硬件上優(yōu)化和部署人工智能推理。OpenVINO是英特爾出色的開源AI工具包,不僅可以在x86_64 CPU上加速AI推斷,還可以在ARM CPU和其他架構(gòu)、英特爾集成顯卡和獨(dú)立顯卡等硬件上加速AI推斷,包括最近推出的NPU 插件,用于利用新酷睿超“Meteor Lake”系統(tǒng)芯片中的英特爾神經(jīng)處理單元。OpenVINO 2024.0 更注重生成式人工智能(GenAI),為TensorFlow句子編碼模型提供了更好的開箱即用體驗(yàn),支持專家混合(MoE)。同時(shí)還提高了LLM的INT4權(quán)重壓縮質(zhì)量,增強(qiáng)了LLM在英特爾CPU上的性能,簡化了Hugging Face模型的優(yōu)化和轉(zhuǎn)換,并改進(jìn)了其他Hugging Face集成。
OpenVINO C# API是一個(gè)OpenVINO的.Net wrapper,應(yīng)用最新的OpenVINO庫開發(fā),通過 OpenVINOC API實(shí)現(xiàn).Net對OpenVINO Runtime調(diào)用,使用習(xí)慣與OpenVINO C++ API一致。OpenVINO C# API 由于是基于OpenVINO開發(fā),所支持的平臺與OpenVINO完全一致,具體信息可以參考OpenVINO。通過使用OpenVINO C# API,可以在 .NET、.NET Framework等框架下使用C#語言實(shí)現(xiàn)深度學(xué)習(xí)模型在指定平臺推理加速。
2YOLO-World
YOLO-World是一種創(chuàng)新的實(shí)時(shí)開放詞匯對象檢測技術(shù),由騰訊AI實(shí)驗(yàn)室開發(fā)。它旨在解決傳統(tǒng)目標(biāo)檢測方法在開放場景中受預(yù)定義類別限制的問題,通過視覺語言建模和大規(guī)模數(shù)據(jù)集預(yù)訓(xùn)練,增強(qiáng)了YOLO系列檢測器對開放詞匯的檢測能力。
該技術(shù)的核心思想在于,利用一個(gè)可重參數(shù)化的視覺語言路徑聚合網(wǎng)絡(luò)(RepVL-PAN)來連接文本和圖像特征,并引入基于區(qū)域的文本對比損失進(jìn)行預(yù)訓(xùn)練。這種設(shè)計(jì)使得YOLO-World能夠在沒有見過具體樣本的情況下,檢測出廣泛的物體類別。同時(shí),它還能在保持高性能的同時(shí),降低計(jì)算要求,從而適用于實(shí)時(shí)應(yīng)用。
通過這種方式,YOLO-World能夠增強(qiáng)對開放詞匯的檢測能力,使其能夠在沒有預(yù)先定義類別的情況下識別出廣泛的物體。這種能力使得YOLO-World在實(shí)時(shí)應(yīng)用中,如自動(dòng)駕駛、視頻監(jiān)控、工業(yè)質(zhì)檢等領(lǐng)域具有廣泛的應(yīng)用前景。同時(shí),YOLO-World還通過優(yōu)化模型架構(gòu)和訓(xùn)練策略,實(shí)現(xiàn)了高性能和實(shí)時(shí)性的平衡。它能夠在保持高準(zhǔn)確率的同時(shí),降低計(jì)算要求,從而滿足實(shí)際應(yīng)用中對于實(shí)時(shí)性的需求。
總的來說,YOLO-World是一種高效、實(shí)時(shí)且靈活的開放詞匯目標(biāo)檢測器,具有廣泛的應(yīng)用前景和巨大的潛力。它不僅能夠解決傳統(tǒng)目標(biāo)檢測方法在開放場景中的局限性,還能夠?yàn)楦餍袠I(yè)提供實(shí)時(shí)、準(zhǔn)確的物體檢測解決方案。
2模型獲取
YOLO-World模型可以通過[YOLO-World GitHub](https://github.com/AILab-CVC/YOLO-World.git)獲取,小編嘗試了一下,步驟比較復(fù)雜,且配置起來比較麻煩,因此如果是初學(xué)者,不建議使用,下面介紹一個(gè)比較簡單的導(dǎo)出方式:通過Ultralytics 導(dǎo)出。
Ultralytics 提供了一系列用于計(jì)算機(jī)視覺任務(wù)的工具,包括目標(biāo)檢測、圖像分類、語義分割和人臉識別等。這些工具基于流行的深度學(xué)習(xí)框架如PyTorch,并通過簡化復(fù)雜任務(wù)的實(shí)現(xiàn)過程,使用戶能夠更輕松地進(jìn)行模型訓(xùn)練和性能評估。
首先安裝Ultralytics 環(huán)境:
Ultralytics 可以通過pip安裝,在環(huán)境中輸入以下指令即可:
pip install ultralytics
然后通過Python導(dǎo)出模型:
模型導(dǎo)出代碼如下所示:
from ultralytics import YOLO # Initialize a YOLO-World model model = YOLO('yolov8s-worldv2.pt') # Define custom classes model.set_classes(["person", "bus"]) # Export the model model.export(format='onnx')
模型導(dǎo)出后結(jié)構(gòu)如下圖所示:
與其他模型不同的時(shí),YOLO-World模型在推理時(shí)需要指定目標(biāo)對象名稱,因此其輸入包括一個(gè)目標(biāo)對象名稱的節(jié)點(diǎn),但是目前ONNX模型不支持字符輸入。因此在模型導(dǎo)出時(shí),根據(jù)自己的模型需求,對需要進(jìn)行識別的對象名稱,進(jìn)行定義;接著在導(dǎo)出模型時(shí),會將定義的類別字符轉(zhuǎn)換為權(quán)重,直接加載到模型中。
這樣在模型推理時(shí),就無需再進(jìn)行文本權(quán)重轉(zhuǎn)換,提升模型推理的速度;但這樣也會導(dǎo)致導(dǎo)出的模型無法再修改類別,如果需要更改類別,就需要重新導(dǎo)出模型。
3項(xiàng)目配置
1源碼下載與項(xiàng)目配置
首先使用Git克隆項(xiàng)目源碼。輸入以下指令:
git clone https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples.git
代碼下載完成后,使VS 2022打開解決方案Samples.sln文件,找到y(tǒng)olo-world-opencvsharp-net4.8項(xiàng)目,如下圖所示:
接下來安裝依賴項(xiàng)。首先是安裝OpenVINO C# API項(xiàng)目依賴,通過NuGet安裝一下包即可:
OpenVINO.CSharp.API OpenVINO.runtime.win OpenVINO.CSharp.API.Extensions OpenVINO.CSharp.API.Extensions.OpenCvSharp
關(guān)于在不同平臺上搭建 OpenVINO C# API 開發(fā)環(huán)境請參考以下文章:
《在Windows上搭建OpenVINOC#開發(fā)環(huán)境》:
https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Windows_cn.md
《在Linux上搭建OpenVINOC#開發(fā)環(huán)境》
https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Linux_cn.md
《在MacOS上搭建OpenVINOC#開發(fā)環(huán)境》
https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_MacOS_cn.md
接下來安裝使用到的圖像處理庫 OpenCvSharp,通過NuGet安裝一下包即可:
OpenCvSharp4 OpenCvSharp4.Extensions OpenCvSharp4.runtime.win
關(guān)于在其他平臺上搭建 OpenCvSharp 開發(fā)環(huán)境請點(diǎn)擊參閱以下文章:《【OpenCV】在Linux上使用OpenCvSharp》、《【OpenCV】在MacOS上使用OpenCvSharp》。
添加完成項(xiàng)目依賴后,項(xiàng)目的配置文件如下所示:
2定義模型預(yù)測方法
使用OpenVINO C# API部署模型主要包括以下幾個(gè)步驟:
初始化 OpenVINO Runtime Core
讀取本地模型(將圖片數(shù)據(jù)預(yù)處理方式編譯到模型)
將模型編譯到指定設(shè)備
創(chuàng)建推理通道
處理圖像輸入數(shù)據(jù)
設(shè)置推理輸入數(shù)據(jù)
模型推理
獲取推理結(jié)果
處理結(jié)果數(shù)據(jù)
下面根據(jù)模型部署流程,詳細(xì)介紹一下該模型的部署代碼:
該項(xiàng)目主要使用到OpenCvSharp與OpenVINO C# API這兩個(gè)工具包,因此需要添加以下命名空間:
using OpenCvSharp; using OpenVinoSharp; using OpenVinoSharp.Extensions.process;
1) 初始化 OpenVINO Runtime Core
Core core = new Core();
2) 讀取本地模型
Model model = core.read_model(tb_model_path.Text);
3) 將模型編譯到指定設(shè)備
CompiledModel compiled_model = core.compile_model(model, cb_device.SelectedItem.ToString());
4) 創(chuàng)建推理通道
InferRequest request = compiled_model.create_infer_request();
5) 處理圖像輸入數(shù)據(jù)
Mat image = Cv2.ImRead(tb_input_path.Text); Mat mat = new Mat(); Cv2.CvtColor(image, mat, ColorConversionCodes.BGR2RGB); mat = OpenVinoSharp.Extensions.process.Resize.letterbox_img(mat, (int)input_shape[2], out factor); mat = Normalize.run(mat, true); float[] input_data = Permute.run(mat);
6) 設(shè)置推理輸入數(shù)據(jù)
Tensor input_tensor = request.get_input_tensor(); input_tensor.set_data(input_data);
7) 模型推理
request.infer();
8) 獲取推理結(jié)果
Tensor output_boxes = request.get_tensor("boxes"); float[] boxes = output_boxes.get_data((int)output_boxes.get_size()); Tensor output_scores = request.get_tensor("scores"); float[] scores = output_scores.get_data ((int)output_scores.get_size()); Tensor output_labels = request.get_tensor("labels"); int[] labels = output_labels.get_data ((int)output_labels.get_size());
9) 處理結(jié)果數(shù)據(jù)
DetResult postprocess(float[] result, int categ_nums, float factor) { Mat result_data = new Mat(4 + categ_nums, 8400, MatType.CV_32F,result); result_data = result_data.T(); // Storage results list Listposition_boxes = new List (); List classIds = new List (); List confidences = new List (); // Preprocessing output results for (int i = 0; i < result_data.Rows; i++) ? ?{ ? ? ? ?Mat classesScores = new Mat(result_data, new Rect(4, i, categ_nums, 1)); ? ? ? ?Point maxClassIdPoint, minClassIdPoint; ? ? ? ?double maxScore, minScore; ? ? ? ?// Obtain the maximum value and its position in a set of data ? ? ? ?Cv2.MinMaxLoc(classesScores, out minScore, out maxScore, ? ? ? ? ? ?out minClassIdPoint, out maxClassIdPoint); ? ? ? ?// Confidence level between 0 ~ 1 ? ? ? ?// Obtain identification box information ? ? ? ?if (maxScore > 0.25) { float cx = result_data.At (i, 0); float cy = result_data.At (i, 1); float ow = result_data.At (i, 2); float oh = result_data.At (i, 3); int x = (int)((cx - 0.5 * ow) * factor); int y = (int)((cy - 0.5 * oh) * factor); int width = (int)(ow * factor); int height = (int)(oh * factor); Rect box = new Rect(); box.X = x; box.Y = y; box.Width = width; box.Height = height; position_boxes.Add(box); classIds.Add(maxClassIdPoint.X); confidences.Add((float)maxScore); } } // NMS non maximum suppression int[] indexes = new int[position_boxes.Count]; float score = float.Parse(tb_score.Text); float nms = float.Parse(tb_nms.Text); CvDnn.NMSBoxes(position_boxes, confidences, score, nms, out indexes); DetResult re = new DetResult(); // for (int i = 0; i < indexes.Length; i++) ? ?{ ? ? ? ?int index = indexes[i]; ? ? ? ?re.add(classIds[index], confidences[index], position_boxes[index]); ? ?} ? ?return re; }
以上就是使用OpenVINO C# API 部署YOLO-World模型的關(guān)鍵代碼,具體代碼可以下載項(xiàng)目源碼進(jìn)行查看。
4項(xiàng)目運(yùn)行與演示
配置好項(xiàng)目后,點(diǎn)擊運(yùn)行,本次我們提供給大家的是使用.NET Framework4.8開發(fā)的窗體應(yīng)用程序,如下圖所示,主要還包含五個(gè)部分,分別為推理設(shè)置區(qū)域、控制按鈕、推理信息輸出區(qū)域、原圖展示區(qū)域、推理結(jié)果展示區(qū)域。在使用時(shí),用戶可以根據(jù)自己需求,選擇導(dǎo)出的模型以及待推理數(shù)據(jù),支持圖片數(shù)據(jù)以及視頻數(shù)據(jù),接著輸入自己導(dǎo)出的lables名稱,同時(shí)還可以修改推理設(shè)備、數(shù)據(jù)處理所需的參數(shù)等,接著就可以依次點(diǎn)擊加載模型、模型推理按鈕,進(jìn)行模型推理。最后模型推理結(jié)果如圖所示。
該模型在導(dǎo)出時(shí),只定義了bus、person類別,因此在模型推理后,可以識別出圖片中的bus、person元素。
接著又測試了導(dǎo)出時(shí)只定義person類別的模型,如下圖所示,最后識別出來的結(jié)果只有person。
最后,我們提供了一個(gè)行人檢測視頻案例,點(diǎn)擊此處查看視頻。
5總結(jié)
在該項(xiàng)目中,我們結(jié)合之前開發(fā)的OpenVINO C# API 項(xiàng)目部署YOLOv9模型,成功實(shí)現(xiàn)了對象目標(biāo)檢測與實(shí)例分割,并且根據(jù)不同開發(fā)者的使用習(xí)慣,同時(shí)提供了OpenCvSharp以及Emgu.CV兩種版本,供各位開發(fā)者使用。最后如果各位開發(fā)者在使用中有任何問題,歡迎大家與我聯(lián)系。
-
英特爾
+關(guān)注
關(guān)注
61文章
9964瀏覽量
171765 -
API
+關(guān)注
關(guān)注
2文章
1500瀏覽量
62013 -
目標(biāo)檢測
+關(guān)注
關(guān)注
0文章
209瀏覽量
15611 -
OpenVINO
+關(guān)注
關(guān)注
0文章
93瀏覽量
201
原文標(biāo)題:使用OpenVINO? C# API部署YOLO-World實(shí)現(xiàn)實(shí)時(shí)開放詞匯對象檢測丨開發(fā)者實(shí)戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論