以下文章來源于CSharp與邊緣模型部署 ,作者椒顏PiPi蝦
作者:顏國進
英特爾邊緣計算創新大使
YOLO-World是一個融合了實時目標檢測與增強現實(AR)技術的創新平臺,旨在將現實世界與數字世界無縫對接。該平臺以YOLO(You Only Look Once)算法為核心,實現了對視頻中物體的快速準確識別,并通過AR技術將虛擬元素與真實場景相結合,為用戶帶來沉浸式的交互體驗。在本文中,我們將結合OpenVINO C# API使用最新發布的OpenVINO 2024.0部署 YOLO-World實現實時開放詞匯對象檢測:
OpenVINO C# API項目鏈接:
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
英特爾發行版OpenVINO工具套件基于oneAPI而開發,可以加快高性能計算機視覺和深度學習視覺應用開發速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確的真實世界結果部署到生產系統中。通過簡化的開發工作流程,OpenVINO可賦能開發者在現實世界中部署高性能應用程序和算法。
2024年3月7日,英特爾發布了開源 OpenVINO 2024.0 工具包,用于在各種硬件上優化和部署人工智能推理。OpenVINO是英特爾出色的開源AI工具包,不僅可以在x86_64 CPU上加速AI推斷,還可以在ARM CPU和其他架構、英特爾集成顯卡和獨立顯卡等硬件上加速AI推斷,包括最近推出的NPU 插件,用于利用新酷睿超“Meteor Lake”系統芯片中的英特爾神經處理單元。OpenVINO 2024.0 更注重生成式人工智能(GenAI),為TensorFlow句子編碼模型提供了更好的開箱即用體驗,支持專家混合(MoE)。同時還提高了LLM的INT4權重壓縮質量,增強了LLM在英特爾CPU上的性能,簡化了Hugging Face模型的優化和轉換,并改進了其他Hugging Face集成。
OpenVINO C# API是一個OpenVINO的.Net wrapper,應用最新的OpenVINO庫開發,通過 OpenVINOC API實現.Net對OpenVINO Runtime調用,使用習慣與OpenVINO C++ API一致。OpenVINO C# API 由于是基于OpenVINO開發,所支持的平臺與OpenVINO完全一致,具體信息可以參考OpenVINO。通過使用OpenVINO C# API,可以在 .NET、.NET Framework等框架下使用C#語言實現深度學習模型在指定平臺推理加速。
2YOLO-World
YOLO-World是一種創新的實時開放詞匯對象檢測技術,由騰訊AI實驗室開發。它旨在解決傳統目標檢測方法在開放場景中受預定義類別限制的問題,通過視覺語言建模和大規模數據集預訓練,增強了YOLO系列檢測器對開放詞匯的檢測能力。
該技術的核心思想在于,利用一個可重參數化的視覺語言路徑聚合網絡(RepVL-PAN)來連接文本和圖像特征,并引入基于區域的文本對比損失進行預訓練。這種設計使得YOLO-World能夠在沒有見過具體樣本的情況下,檢測出廣泛的物體類別。同時,它還能在保持高性能的同時,降低計算要求,從而適用于實時應用。
通過這種方式,YOLO-World能夠增強對開放詞匯的檢測能力,使其能夠在沒有預先定義類別的情況下識別出廣泛的物體。這種能力使得YOLO-World在實時應用中,如自動駕駛、視頻監控、工業質檢等領域具有廣泛的應用前景。同時,YOLO-World還通過優化模型架構和訓練策略,實現了高性能和實時性的平衡。它能夠在保持高準確率的同時,降低計算要求,從而滿足實際應用中對于實時性的需求。
總的來說,YOLO-World是一種高效、實時且靈活的開放詞匯目標檢測器,具有廣泛的應用前景和巨大的潛力。它不僅能夠解決傳統目標檢測方法在開放場景中的局限性,還能夠為各行業提供實時、準確的物體檢測解決方案。
2模型獲取
YOLO-World模型可以通過[YOLO-World GitHub](https://github.com/AILab-CVC/YOLO-World.git)獲取,小編嘗試了一下,步驟比較復雜,且配置起來比較麻煩,因此如果是初學者,不建議使用,下面介紹一個比較簡單的導出方式:通過Ultralytics 導出。
Ultralytics 提供了一系列用于計算機視覺任務的工具,包括目標檢測、圖像分類、語義分割和人臉識別等。這些工具基于流行的深度學習框架如PyTorch,并通過簡化復雜任務的實現過程,使用戶能夠更輕松地進行模型訓練和性能評估。
首先安裝Ultralytics 環境:
Ultralytics 可以通過pip安裝,在環境中輸入以下指令即可:
pip install ultralytics
然后通過Python導出模型:
模型導出代碼如下所示:
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')
模型導出后結構如下圖所示:
與其他模型不同的時,YOLO-World模型在推理時需要指定目標對象名稱,因此其輸入包括一個目標對象名稱的節點,但是目前ONNX模型不支持字符輸入。因此在模型導出時,根據自己的模型需求,對需要進行識別的對象名稱,進行定義;接著在導出模型時,會將定義的類別字符轉換為權重,直接加載到模型中。
這樣在模型推理時,就無需再進行文本權重轉換,提升模型推理的速度;但這樣也會導致導出的模型無法再修改類別,如果需要更改類別,就需要重新導出模型。
3項目配置
1源碼下載與項目配置
首先使用Git克隆項目源碼。輸入以下指令:
git clone https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples.git
代碼下載完成后,使VS 2022打開解決方案Samples.sln文件,找到yolo-world-opencvsharp-net4.8項目,如下圖所示:
接下來安裝依賴項。首先是安裝OpenVINO C# API項目依賴,通過NuGet安裝一下包即可:
OpenVINO.CSharp.API OpenVINO.runtime.win OpenVINO.CSharp.API.Extensions OpenVINO.CSharp.API.Extensions.OpenCvSharp
關于在不同平臺上搭建 OpenVINO C# API 開發環境請參考以下文章:
《在Windows上搭建OpenVINOC#開發環境》:
https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Windows_cn.md
《在Linux上搭建OpenVINOC#開發環境》
https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Linux_cn.md
《在MacOS上搭建OpenVINOC#開發環境》
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
關于在其他平臺上搭建 OpenCvSharp 開發環境請點擊參閱以下文章:《【OpenCV】在Linux上使用OpenCvSharp》、《【OpenCV】在MacOS上使用OpenCvSharp》。
添加完成項目依賴后,項目的配置文件如下所示:
2定義模型預測方法
使用OpenVINO C# API部署模型主要包括以下幾個步驟:
初始化 OpenVINO Runtime Core
讀取本地模型(將圖片數據預處理方式編譯到模型)
將模型編譯到指定設備
創建推理通道
處理圖像輸入數據
設置推理輸入數據
模型推理
獲取推理結果
處理結果數據
下面根據模型部署流程,詳細介紹一下該模型的部署代碼:
該項目主要使用到OpenCvSharp與OpenVINO C# API這兩個工具包,因此需要添加以下命名空間:
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) 將模型編譯到指定設備
CompiledModel compiled_model = core.compile_model(model, cb_device.SelectedItem.ToString());
4) 創建推理通道
InferRequest request = compiled_model.create_infer_request();
5) 處理圖像輸入數據
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) 設置推理輸入數據
Tensor input_tensor = request.get_input_tensor(); input_tensor.set_data(input_data);
7) 模型推理
request.infer();
8) 獲取推理結果
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) 處理結果數據
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模型的關鍵代碼,具體代碼可以下載項目源碼進行查看。
4項目運行與演示
配置好項目后,點擊運行,本次我們提供給大家的是使用.NET Framework4.8開發的窗體應用程序,如下圖所示,主要還包含五個部分,分別為推理設置區域、控制按鈕、推理信息輸出區域、原圖展示區域、推理結果展示區域。在使用時,用戶可以根據自己需求,選擇導出的模型以及待推理數據,支持圖片數據以及視頻數據,接著輸入自己導出的lables名稱,同時還可以修改推理設備、數據處理所需的參數等,接著就可以依次點擊加載模型、模型推理按鈕,進行模型推理。最后模型推理結果如圖所示。
該模型在導出時,只定義了bus、person類別,因此在模型推理后,可以識別出圖片中的bus、person元素。
接著又測試了導出時只定義person類別的模型,如下圖所示,最后識別出來的結果只有person。
最后,我們提供了一個行人檢測視頻案例,點擊此處查看視頻。
5總結
在該項目中,我們結合之前開發的OpenVINO C# API 項目部署YOLOv9模型,成功實現了對象目標檢測與實例分割,并且根據不同開發者的使用習慣,同時提供了OpenCvSharp以及Emgu.CV兩種版本,供各位開發者使用。最后如果各位開發者在使用中有任何問題,歡迎大家與我聯系。
-
英特爾
+關注
關注
60文章
9722瀏覽量
170500 -
API
+關注
關注
2文章
1456瀏覽量
61440 -
目標檢測
+關注
關注
0文章
196瀏覽量
15560 -
OpenVINO
+關注
關注
0文章
73瀏覽量
130
原文標題:使用OpenVINO? C# API部署YOLO-World實現實時開放詞匯對象檢測丨開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論