找回密码
 立即注册
首页 业界区 业界 C#AI系列(3):31mb单文件exe实现姿态检测-将Yolo装进口袋 ...

C#AI系列(3):31mb单文件exe实现姿态检测-将Yolo装进口袋

泠邸 2025-11-27 16:40:01
C#使用Yolo其实简单。相较于Python方案,C# 31 MB单文件以可以单文件独立发布或以AOT编译彻底剥离解释器与运行时依赖,CPU推理性能良好。而且YOLO11n模型权重与原生推理代码一体嵌入,免除Python环境、版本冲突及数百兆依赖包部署,实现零配置、零维护、单文件分发,可以显著降低现场实施与售后成本,满足严肃场景对稳定性、一致性与封闭的刚性要求。
1.jpeg

本文所有机器学习模型案例的代码已全部开源,关注 萤火初芒 公众号回复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格式。代码非常简单:
  1. from ultralytics import YOLO
  2. # 加载.pt模型
  3. model = YOLO("D:/yolo11n-pose.pt")
  4. # 输出.onnx模型
  5. model.export(format="onnx")
复制代码
三、代码实现

示例代码可参考官方YoloDotNet中的demo文件夹,有各种实现的详细案例。以下是Yolo初始化的示例:
  1. //初始化Yolo示例
  2. using var yolo = new Yolo(new YoloOptions
  3. {
  4.   // 设定模型路径
  5.   // 不同的任务需加载不同的模型
  6.   OnnxModel = @"\yolo11n-pose.onnx",
  7.   
  8.   // 设定由CPU实现
  9.   ExecutionProvider = new CpuExecutionProvider(),
  10.   // 推理前应用的缩放模式。Proportional(等比缩放)会保持宽高比(必要时加填充);Stretch(拉伸缩放)则直接将图片resize到目标尺寸,不保持宽高比。该参数会直接影响推理结果。
  11.   ImageResize = ImageResize.Proportional,
  12.   // 缩放时可用的采样选项;会影响推理速度与质量。
  13.   // 其他采样选项的对比示例,参见基准测试:
  14.   SamplingOptions = new(SKFilterMode.Nearest, SKMipmapMode.None) // YoloDotNet default
  15. });
复制代码
YoloOptions的参数OnnxModel也可以改成OnnxModelBytes,从而直接加载字节数组,以便实现将模型内嵌。
在这里以姿态检测代码作为例子,非常简单,核心代码也就1-2行,其他部分可按需求增减:
  1. // 用Skia加载目标图片
  2. using var image = SKBitmap.Decode(args?[0] ?? @"d:\tt2.png");
  3. // 使用加载好模型的Yolo示例执行任务
  4. var results = yolo.RunPoseEstimation(image, confidence: 0.25, iou: 0.7);
  5. // 绘制任务结果
  6. image.Draw(results, _drawingOptions);
  7. // 保存绘制任务结果
  8. var fileName = Path.Combine(_outputFolder, "PoseEstimation.jpg");
  9. image.Save(fileName, SKEncodedImageFormat.Jpeg, 80);
  10. // 显示输出的图片
  11. DisplayOutput(fileName);
复制代码
四、发布选项

由于.Net平台的强大,我们可以任意选择我们的发布形式。以下比较了集中发布情况,所有发布的文件中均内嵌了一个11.2mb的小模型,发布后无需再外挂模型文件。
发布方式(内嵌模型资源)大小文件数量单文件发布47.6MB3单文件发布(Compression)45.6MB3AOT发布37.9MB3单文件发布(Compression)+Native自提取31.0MB1需要注意的是。原生YoloDotNet发布Aot会报错,原因是其在某个函数传参过程中使用了Dynamic类型,我们将原库代码拔下来修改后重新编译即可支持了。
五、效果演示

Yolo的姿态模型可以识别面部头眼及四肢等多个关键点。效果展示如下(视频无加速):
2.gif

在最后一幅图大家也发现了,有部分人物未被识别到。这其实与案例中选择的模型大小有关。当我们切换到稍大点的模型时(yolo11x-pose,224mb),主体人物均可被正常识别了。
yolo11n-pose,11.2mb:
3.jpeg

yolo11x-pose,224mb:
4.jpeg

六、 最后

本文借助 C# AOT 与 ONNX Runtime,可将 YOLO11 姿态模型及全部依赖压缩为 31 MB 单文件 EXE,现场部署无需 Python 环境与额外组件,显著降低实施、维护与版本漂移风险,可以将落地门槛再降一分,即插即用将AI装进了口袋。
感谢您的阅读,本案例及更加完整丰富的机器学习模型案例的代码已全部开源,关注公众号回复AISharp即可查看仓库地址。
5.jpeg


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册