以下文章來源于CSharp與邊緣模型部署 ,作者椒顏PiPi蝦
作者:顏國進
英特爾邊緣計算創(chuàng)新大使
YOLO-World是一個融合了實時目標檢測與增強現(xiàn)實(AR)技術的創(chuàng)新平臺,旨在將現(xiàn)實世界與數(shù)字世界無縫對接。該平臺以YOLO(You Only Look Once)算法為核心,實現(xiàn)了對視頻中物體的快速準確識別,并通過AR技術將虛擬元素與真實場景相結合,為用戶帶來沉浸式的交互體驗。在本文中,我們將結合OpenVINO C# API使用最新發(fā)布的OpenVINO 2024.0部署 YOLO-World實現(xiàn)實時開放詞匯對象檢測:
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
英特爾發(fā)行版OpenVINO工具套件基于oneAPI而開發(fā),可以加快高性能計算機視覺和深度學習視覺應用開發(fā)速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確的真實世界結果部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO可賦能開發(fā)者在現(xiàn)實世界中部署高性能應用程序和算法。

2024年3月7日,英特爾發(fā)布了開源 OpenVINO 2024.0 工具包,用于在各種硬件上優(yōu)化和部署人工智能推理。OpenVINO是英特爾出色的開源AI工具包,不僅可以在x86_64 CPU上加速AI推斷,還可以在ARM CPU和其他架構、英特爾集成顯卡和獨立顯卡等硬件上加速AI推斷,包括最近推出的NPU 插件,用于利用新酷睿超“Meteor Lake”系統(tǒng)芯片中的英特爾神經(jīng)處理單元。OpenVINO 2024.0 更注重生成式人工智能(GenAI),為TensorFlow句子編碼模型提供了更好的開箱即用體驗,支持專家混合(MoE)。同時還提高了LLM的INT4權重壓縮質量,增強了LLM在英特爾CPU上的性能,簡化了Hugging Face模型的優(yōu)化和轉換,并改進了其他Hugging Face集成。
OpenVINO C# API是一個OpenVINO的.Net wrapper,應用最新的OpenVINO庫開發(fā),通過 OpenVINOC API實現(xiàn).Net對OpenVINO Runtime調用,使用習慣與OpenVINO C++ API一致。OpenVINO C# API 由于是基于OpenVINO開發(fā),所支持的平臺與OpenVINO完全一致,具體信息可以參考OpenVINO。通過使用OpenVINO C# API,可以在 .NET、.NET Framework等框架下使用C#語言實現(xiàn)深度學習模型在指定平臺推理加速。
2YOLO-World
YOLO-World是一種創(chuàng)新的實時開放詞匯對象檢測技術,由騰訊AI實驗室開發(fā)。它旨在解決傳統(tǒng)目標檢測方法在開放場景中受預定義類別限制的問題,通過視覺語言建模和大規(guī)模數(shù)據(jù)集預訓練,增強了YOLO系列檢測器對開放詞匯的檢測能力。
該技術的核心思想在于,利用一個可重參數(shù)化的視覺語言路徑聚合網(wǎng)絡(RepVL-PAN)來連接文本和圖像特征,并引入基于區(qū)域的文本對比損失進行預訓練。這種設計使得YOLO-World能夠在沒有見過具體樣本的情況下,檢測出廣泛的物體類別。同時,它還能在保持高性能的同時,降低計算要求,從而適用于實時應用。
通過這種方式,YOLO-World能夠增強對開放詞匯的檢測能力,使其能夠在沒有預先定義類別的情況下識別出廣泛的物體。這種能力使得YOLO-World在實時應用中,如自動駕駛、視頻監(jiān)控、工業(yè)質檢等領域具有廣泛的應用前景。同時,YOLO-World還通過優(yōu)化模型架構和訓練策略,實現(xiàn)了高性能和實時性的平衡。它能夠在保持高準確率的同時,降低計算要求,從而滿足實際應用中對于實時性的需求。
總的來說,YOLO-World是一種高效、實時且靈活的開放詞匯目標檢測器,具有廣泛的應用前景和巨大的潛力。它不僅能夠解決傳統(tǒng)目標檢測方法在開放場景中的局限性,還能夠為各行業(yè)提供實時、準確的物體檢測解決方案。
2模型獲取
YOLO-World模型可以通過[YOLO-World GitHub](https://github.com/AILab-CVC/YOLO-World.git)獲取,小編嘗試了一下,步驟比較復雜,且配置起來比較麻煩,因此如果是初學者,不建議使用,下面介紹一個比較簡單的導出方式:通過Ultralytics 導出。
Ultralytics 提供了一系列用于計算機視覺任務的工具,包括目標檢測、圖像分類、語義分割和人臉識別等。這些工具基于流行的深度學習框架如PyTorch,并通過簡化復雜任務的實現(xiàn)過程,使用戶能夠更輕松地進行模型訓練和性能評估。
首先安裝Ultralytics 環(huán)境:
Ultralytics 可以通過pip安裝,在環(huán)境中輸入以下指令即可:
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模型在推理時需要指定目標對象名稱,因此其輸入包括一個目標對象名稱的節(jié)點,但是目前ONNX模型不支持字符輸入。因此在模型導出時,根據(jù)自己的模型需求,對需要進行識別的對象名稱,進行定義;接著在導出模型時,會將定義的類別字符轉換為權重,直接加載到模型中。
這樣在模型推理時,就無需再進行文本權重轉換,提升模型推理的速度;但這樣也會導致導出的模型無法再修改類別,如果需要更改類別,就需要重新導出模型。
3項目配置
1源碼下載與項目配置
首先使用Git克隆項目源碼。輸入以下指令:
git clone https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples.git
代碼下載完成后,使VS 2022打開解決方案Samples.sln文件,找到y(tǒng)olo-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 開發(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
關于在其他平臺上搭建 OpenCvSharp 開發(fā)環(huán)境請點擊參閱以下文章:《【OpenCV】在Linux上使用OpenCvSharp》、《【OpenCV】在MacOS上使用OpenCvSharp》。
添加完成項目依賴后,項目的配置文件如下所示:
2定義模型預測方法
使用OpenVINO C# API部署模型主要包括以下幾個步驟:
初始化 OpenVINO Runtime Core
讀取本地模型(將圖片數(shù)據(jù)預處理方式編譯到模型)
將模型編譯到指定設備
創(chuàng)建推理通道
處理圖像輸入數(shù)據(jù)
設置推理輸入數(shù)據(jù)
模型推理
獲取推理結果
處理結果數(shù)據(jù)
下面根據(jù)模型部署流程,詳細介紹一下該模型的部署代碼:
該項目主要使用到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) 創(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ù)據(jù)
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) 處理結果數(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
List position_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開發(fā)的窗體應用程序,如下圖所示,主要還包含五個部分,分別為推理設置區(qū)域、控制按鈕、推理信息輸出區(qū)域、原圖展示區(qū)域、推理結果展示區(qū)域。在使用時,用戶可以根據(jù)自己需求,選擇導出的模型以及待推理數(shù)據(jù),支持圖片數(shù)據(jù)以及視頻數(shù)據(jù),接著輸入自己導出的lables名稱,同時還可以修改推理設備、數(shù)據(jù)處理所需的參數(shù)等,接著就可以依次點擊加載模型、模型推理按鈕,進行模型推理。最后模型推理結果如圖所示。
該模型在導出時,只定義了bus、person類別,因此在模型推理后,可以識別出圖片中的bus、person元素。

接著又測試了導出時只定義person類別的模型,如下圖所示,最后識別出來的結果只有person。

最后,我們提供了一個行人檢測視頻案例,點擊此處查看視頻。
5總結
在該項目中,我們結合之前開發(fā)的OpenVINO C# API 項目部署YOLOv9模型,成功實現(xiàn)了對象目標檢測與實例分割,并且根據(jù)不同開發(fā)者的使用習慣,同時提供了OpenCvSharp以及Emgu.CV兩種版本,供各位開發(fā)者使用。最后如果各位開發(fā)者在使用中有任何問題,歡迎大家與我聯(lián)系。
-
英特爾
+關注
關注
61文章
10301瀏覽量
180393 -
API
+關注
關注
2文章
2365瀏覽量
66744 -
目標檢測
+關注
關注
0文章
233瀏覽量
16490 -
OpenVINO
+關注
關注
0文章
118瀏覽量
767
原文標題:使用OpenVINO? C# API部署YOLO-World實現(xiàn)實時開放詞匯對象檢測丨開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
C#集成OpenVINO?:簡化AI模型部署
基于C#和OpenVINO?在英特爾獨立顯卡上部署PP-TinyPose模型
如何使用OpenVINO C++ API部署FastSAM模型
使用Yolo-v3-TF運行OpenVINO?對象檢測Python演示時的結果不準確的原因?
基于OpenVINO Python API部署RT-DETR模型
如何使用OpenVINO Python API部署FastSAM模型
基于OpenVINO C++ API部署RT-DETR模型
基于OpenVINO C# API部署RT-DETR模型
用OpenVINO C# API在intel平臺部署YOLOv10目標檢測模型
C#中使用OpenVINO?:輕松集成AI模型!
使用OpenVINO C# API部署YOLO-World實現(xiàn)實時開放詞匯對象檢測
評論