在 C# 中使用 Emgu.CV (OpenCV 的 .NET 包裝器)來執行 YOLO 物體檢測模型的訓練,並且進行資料集的生成和測試辨識,實際上有些挑戰,因為 YOLO 這樣的模型一般是使用 DarknetPyTorch 等框架來訓練和執行。然而,若要使用 Emgu.CV 與 YOLO,以下是基於 C# 中的步驟,你可以利用 YOLO 的訓練數據集生成及辨識功能。

由於 EmguCV 主要用於圖像處理和物體檢測,若要在 C# 中訓練 YOLO 模型,通常需要依賴 Python 或其他框架來生成訓練數據集,然後將訓練好的模型加載到 EmguCV 中進行測試和推理。以下步驟會向你展示如何在 C# 中使用 EmguCV 和 YOLO 執行辨識測試:

前提條件:

  1. 安裝 Emgu.CV: 你需要先在 C# 項目中安裝 Emgu.CV,可以使用 NuGet 安裝:

    bash
    Install-Package Emgu.CV Install-Package Emgu.CV.runtime.windows
  2. YOLO 模型: 你需要一個已經訓練好的 YOLO 模型,通常包含 .cfg 配置文件和 .weights 權重文件,並且一個 .names 文件,其中包含了每個類別的名稱。

訓練過程(使用 Python 來準備訓練數據集和模型):

  1. 準備 YOLO 的訓練數據集:

    • 使用 Python 的 DarknetYOLOv5 框架來生成 YOLO 訓練數據集,這包括標註圖像(如 .txt 格式的標註文件,其中包含物體的邊界框和標籤)。

    • 在這裡可以使用 YOLOv5 來進行訓練,並生成 .weights 文件。詳細的訓練步驟可以參考 YOLOv5 的官方文檔:YOLOv5 Docs.

  2. 轉換模型:

    • 如果你是用 YOLOv5 或其他基於 PyTorch 的版本訓練模型,可以將其轉換為 ONNX 格式,這樣你可以在 C# 中加載和運行。

    • 使用 PyTorch 將 YOLOv5 模型導出為 ONNX 格式:

      python
      import torch model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 加載模型 model.export(format='onnx') # 轉換為 ONNX 格式

在 C# 中進行推理(使用 EmguCV):

假設你已經有了 YOLO 訓練好的模型(.cfg.weights 文件)或者是轉換為 ONNX 格式的模型,接下來可以在 C# 中執行物體檢測。

  1. 加載 YOLO 模型並進行物體檢測:

以下是 C# 中使用 Emgu.CV 與 YOLO 模型進行物體檢測的範例程式碼:

csharp

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Linq;

class Program
{
static void Main(string[] args)
{
// 模型配置文件和權重
string modelConfiguration = "yolov4.cfg"; // 配置文件
string modelWeights = "yolov4.weights"; // 權重文件
string[] classNames = System.IO.File.ReadAllLines("coco.names"); // 類別名稱

// 加載 YOLO 模型
var net = new Emgu.CV.Dnn.Net(modelConfiguration, modelWeights);

// 加載圖片
Mat img = CvInvoke.Imread("input.jpg");

// 設置模型輸入大小,這裡設為416x416像素
var blob = DnnInvoke.BlobFromImage(img, 1 / 255.0, new System.Drawing.Size(416, 416), new MCvScalar(0, 0, 0), true, false);
net.SetInput(blob);

// 執行推斷
var outputLayerNames = net.GetUnconnectedOutLayersNames();
var output = net.Forward(outputLayerNames);

// 處理每一個檢測框
foreach (var detection in output)
{
for (int i = 0; i < detection.Rows; i++)
{
float confidence = detection[i, 4]; // 置信度
if (confidence > 0.5) // 只檢測置信度高於0.5的物體
{
int left = (int)(detection[i, 0] * img.Width);
int top = (int)(detection[i, 1] * img.Height);
int right = (int)(detection[i, 2] * img.Width);
int bottom = (int)(detection[i, 3] * img.Height);

// 畫出邊界框
CvInvoke.Rectangle(img, new System.Drawing.Rectangle(left, top, right - left, bottom - top), new MCvScalar(0, 255, 0), 2);

// 顯示標籤
string label = classNames[(int)detection[i, 5]];
CvInvoke.PutText(img, label, new System.Drawing.Point(left, top), FontFace.HersheySimplex, 1, new MCvScalar(0, 0, 255), 2);
}
}
}

// 顯示結果
CvInvoke.Imshow("YOLO Object Detection", img);
CvInvoke.WaitKey(0);
CvInvoke.DestroyAllWindows();
}
}

代碼解析:

  • 加載模型: 使用 Emgu.CV.Dnn.Net 來加載 YOLO 配置文件和權重。

  • 圖像預處理: BlobFromImage 會將圖像轉換為 YOLO 模型可接受的格式。此步驟會將圖像大小調整為 YOLO 模型所需的輸入大小(如 416x416)。

  • 推斷: 使用 net.Forward() 方法來執行前向傳播並獲得模型的檢測結果。

  • 後處理: 根據檢測框的置信度過濾低於閾值的檢測結果,並在原圖上畫出邊界框。

生成數據集的注意事項:

如果你希望自己訓練 YOLO 模型,則需要:

  • 收集並標註數據: 這可以使用工具如 LabelImg 來進行標註。

  • 格式化標註數據: 每張圖片需要有一個與之對應的 .txt 文件,其中包含每個物體的位置(邊界框坐標)和標籤。

這些步驟通常是用 Python 來完成的,然後使用這些數據來訓練 YOLO 模型。然後可以將訓練好的 YOLO 模型導出並在 C# 中進行推理和辨識。

結論:

  1. 訓練數據集生成與 YOLO 模型訓練:這一過程需要使用 Python 或其他框架來進行。YOLO 模型的訓練涉及數據標註和配置 YOLO 訓練環境。

  2. 在 C# 中進行推理:可以使用 EmguCV 庫來加載訓練好的 YOLO 模型並執行物體檢測,這是 C# 中進行 YOLO 辨識的主要方法。

創作者介紹
創作者 IMM 的頭像
IMM-AT

IMM

IMM-AT 發表在 痞客邦 留言(0) 人氣( 1 )