搞 CV 的 .NET 程序员,大概率都经历过这种痛苦:模型是用 Python 训练的,推理要嵌进 C# 项目里,于是开始折腾------要么起个 Python 微服务,要么引入 emgucv 这种庞然大物,部署的时候光依赖就能装半天。
2年前给大家介绍的项目:YoloDotNet 已迭代到 v4.2,两版 API 差异很大(v2 用 ImageSharp、配置平铺;v4 改为 SkiaSharp + 模块化执行提供程序)。作者的态度写在 README 第一行:No Python,No OpenCV,No magic。
它是什么
一句话:基于 .NET 8 + ONNX Runtime + SkiaSharp 的纯 C# YOLO 推理库,覆盖分类、目标检测、旋转框(OBB)检测、分割、姿态估计五类任务,图片和视频流都支持。
支持的模型谱系相当全:YOLOv5u 一直到最新的 YOLOv26,外加 YOLO-World、YOLO-E 和 RT-DETR。也就是说 Ultralytics 新出一个版本,这边基本就跟进了。
硬件加速方面做了模块化拆分,执行后端是独立的 NuGet 包:
- CPU(推荐先从这个入手)
- CUDA / TensorRT(TensorRT 不用单独装包,CUDA 包里带了)
- OpenVINO、CoreML、DirectML
注意一个坑:执行提供程序只能装一个。混着装会导致原生运行时冲突,这点 README 里专门加了感叹号。
上手有多简单
三步:
bash
dotnet add package YoloDotNet
dotnet add package YoloDotNet.ExecutionProvider.Cpu
然后代码就这么点:
csharp
using SkiaSharp;
using YoloDotNet;
using YoloDotNet.Models;
using YoloDotNet.Extensions;
using YoloDotNet.ExecutionProvider.Cpu;
using var yolo = new Yolo(new YoloOptions
{
ExecutionProvider = new CpuExecutionProvider("model.onnx")
});
using var image = SKBitmap.Decode("image.jpg");
var results = yolo.RunObjectDetection(image, confidence: 0.25, iou: 0.7);
image.Draw(results);
image.Save("result.jpg");
对比老版本(v2.x 时代用 ImageSharp 加载图像、配置项平铺在 YoloOptions 里),现在的 API 明显更规整:模型加载、执行后端、推理调用各归其位。
模型导出时注意 opset 版本:YOLOv5u~v12 用 opset=17,YOLOv26 要用 opset=18:
bash
yolo export model=yolov8n.pt format=onnx opset=17
yolo export model=yolo26n.pt format=onnx opset=18
v4.2 的新东西,有几个挺实用
最近这个版本的更新不是凑数的,挑几个说:
ROI 区域推理------只在图像或视频流的指定区域跑检测。做监控类项目的朋友应该懂这意味着什么:一个 4K 画面只关心门口那一小块,推理量直接砍掉一大截。
结果直接导出训练数据 ------ToYoloFormat() / SaveYoloFormat() 可以把推理结果存成 YOLO 标注格式。这个对"用模型预标注、人工再修正"的数据闭环太友好了,以前这一步得自己写脚本转。
JSON 导出和轮廓点提取 ------ToJson()、SaveJson()、GetContourPoints(),分割结果想对接别的系统不用再自己序列化。
另外分割物体现在可以画边缘线,视觉上更清晰;YOLOv26 的推理执行流程也和其他任务对齐了。
一个容易被忽视的重点
README 里专门强调:推理精度不是开箱即得的。图像缩放方式、采样方法、confidence 和 IoU 阈值,这些预处理参数必须和模型训练时的配置匹配,否则结果会莫名其妙地差。作者建议调模型、比效果之前,先读仓库里的 Accuracy & Configuration Guide------这个提醒很实在,很多人踩的"同一个模型换框架就不准"的坑,根源就在这。
性能方面官方给了基准测试(/test/YoloDotNet.Benchmarks),特点是预热后延迟稳定、内存分配行为可预测,适合跑长时间在线的服务。
也得说说 license 这颗雷
YoloDotNet 本身是 MIT,随便用。但它只是个推理引擎,不带任何预训练模型,模型得自己导出。而 Ultralytics 的 YOLO 模型大多是 AGPL-3.0 或需要商业授权------商用项目务必先确认模型许可,别等产品上线了才发现合规问题。这点作者在 README 里用了 Warning 标注,算是很负责任了。
适合什么场景
按实际落地情况,这类库的典型用途:
- 智能监控:视频流实时检测,配合 ROI 做区域布防
- 工业质检:产线缺陷检测,Windows 工控机 + CUDA 的经典组合
- 医疗影像辅助:病灶区域初筛
- 体育分析:姿态估计做动作捕捉和训练分析
- 桌面/后端服务:不想为推理单独维护 Python 环境的场合
写在最后
这个项目最打动我的不是某个功能,而是它的工程哲学:没有隐藏预处理,没有隐式行为,执行、内存、预处理全都显式可控。对需要"行为可预测"的生产环境来说,这比跑分高几个点重要得多。
如果你正在 .NET 技术栈里做视觉相关的活,值得给个 star 试试。