C#使用Yolo其實簡單。相較於Python方案,C# 31 MB單文件以可以單文件獨立發佈或以AOT編譯徹底剝離解釋器與運行時依賴,CPU推理性能良好。而且YOLO11n模型權重與原生推理代碼一體嵌入,免除Python環境、版本衝突及數百兆依賴包部署,實現零配置、零維護、單文件分發,可以顯著降低現場實施與售後成本,滿足嚴肅場景對穩定性、一致性與封閉的剛性要求。
本文所有機器學習模型案例的代碼已全部開源,關注 螢火初芒 公眾號回覆AISharp即可查看倉庫地址。
一、環境準備
Nuget拉取 Microsoft.ML.OnnxRuntime.Managed 和 YoloDotNet,庫內包含了完整所需的其他如Skia、OnnxRuntime等Native庫文件。其中:
Microsoft.ML.OnnxRuntime.Managed: ONNX Runtime 是跨平台機器學習推理加速器,可兼容 PyTorch、TensorFlow/Keras 及 scikit-learn、LightGBM、XGBoost 等經典框架,通過圖優化與硬件加速器協同,在異構操作系統與驅動環境下實現低成本、高吞吐、低延遲的統一部署。
YoloDotNet:基於 .NET 8、ONNX Runtime 的 C# 全棧庫,把 YOLO 的檢測、斜框、分割、分類、姿態、追蹤能力一次打包,CUDA/TensorRT 雙路 GPU 加速,開箱即跑;圖片、視頻、直播流全兼容,幀跳、可視化可定製,單庫實現“模型到畫面”的極速閉環。
二、模型準備
Yolo3-Yolo12預訓練好的模型可以在https://docs.ultralytics.com/zh/models/yolo11/#supported-tasks-and-modes下載。
模型分為5大類:對象檢測、圖像分割、圖像分類、姿態檢測、目標檢測(OBB)
所有模型下載後為.pt的格式,我們在C# 中使用的話需要在python中處理成.onnx格式。代碼非常簡單:
from ultralytics import YOLO
# 加載.pt模型
model = YOLO("D:/yolo11n-pose.pt")
# 輸出.onnx模型
model.export(format="onnx")
三、代碼實現
示例代碼可參考官方YoloDotNet中的demo文件夾,有各種實現的詳細案例。以下是Yolo初始化的示例:
//初始化Yolo示例
using var yolo = new Yolo(new YoloOptions
{
// 設定模型路徑
// 不同的任務需加載不同的模型
OnnxModel = @"\yolo11n-pose.onnx",
// 設定由CPU實現
ExecutionProvider = new CpuExecutionProvider(),
// 推理前應用的縮放模式。Proportional(等比縮放)會保持寬高比(必要時加填充);Stretch(拉伸縮放)則直接將圖片resize到目標尺寸,不保持寬高比。該參數會直接影響推理結果。
ImageResize = ImageResize.Proportional,
// 縮放時可用的採樣選項;會影響推理速度與質量。
// 其他採樣選項的對比示例,參見基準測試:
SamplingOptions = new(SKFilterMode.Nearest, SKMipmapMode.None) // YoloDotNet default
});
YoloOptions的參數OnnxModel也可以改成OnnxModelBytes,從而直接加載字節數組,以便實現將模型內嵌。
在這裏以姿態檢測代碼作為例子,非常簡單,核心代碼也就1-2行,其他部分可按需求增減:
// 用Skia加載目標圖片
using var image = SKBitmap.Decode(args?[0] ?? @"d:\tt2.png");
// 使用加載好模型的Yolo示例執行任務
var results = yolo.RunPoseEstimation(image, confidence: 0.25, iou: 0.7);
// 繪製任務結果
image.Draw(results, _drawingOptions);
// 保存繪製任務結果
var fileName = Path.Combine(_outputFolder, "PoseEstimation.jpg");
image.Save(fileName, SKEncodedImageFormat.Jpeg, 80);
// 顯示輸出的圖片
DisplayOutput(fileName);
四、發佈選項
由於.Net平台的強大,我們可以任意選擇我們的發佈形式。以下比較了集中發佈情況,所有發佈的文件中均內嵌了一個11.2mb的小模型,發佈後無需再外掛模型文件。
|
發佈方式(內嵌模型資源)
|
大小
|
文件數量
|
|
單文件發佈
|
47.6MB
|
3
|
|
單文件發佈(Compression)
|
45.6MB
|
3
|
|
AOT發佈
|
37.9MB
|
3
|
|
單文件發佈(Compression)+Native自提取
|
31.0MB
|
1
|
需要注意的是。原生YoloDotNet發佈Aot會報錯,原因是其在某個函數傳參過程中使用了Dynamic類型,我們將原庫代碼拔下來修改後重新編譯即可支持了。
五、效果演示
Yolo的姿態模型可以識別面部頭眼及四肢等多個關鍵點。效果展示如下(視頻無加速):
在最後一幅圖大家也發現了,有部分人物未被識別到。這其實與案例中選擇的模型大小有關。當我們切換到稍大點的模型時(yolo11x-pose,224mb),主體人物均可被正常識別了。
yolo11n-pose,11.2mb:
yolo11x-pose,224mb:
六、 最後
本文藉助 C# AOT 與 ONNX Runtime,可將 YOLO11 姿態模型及全部依賴壓縮為 31 MB 單文件 EXE,現場部署無需 Python 環境與額外組件,顯著降低實施、維護與版本漂移風險,可以將落地門檻再降一分,即插即用將AI裝進了口袋。
感謝您的閲讀,本案例及更加完整豐富的機器學習模型案例的代碼已全部開源,關注公眾號回覆AISharp即可查看倉庫地址。