news 2026/3/2 0:33:27

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

作者头像

张小明

前端开发工程师

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

一、环境准备

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的姿态模型可以识别面部头眼及四肢等多个关键点。效果展示如下(视频无加速):

output

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

yolo11n-pose,11.2mb:

PoseEstimation_n

yolo11x-pose,224mb:

PoseEstimation_x

六、 最后

本文借助 C# AOT 与 ONNX Runtime,可将 YOLO11 姿态模型及全部依赖压缩为 31 MB 单文件 EXE,现场部署无需 Python 环境与额外组件,显著降低实施、维护与版本漂移风险,可以将落地门槛再降一分,即插即用将AI装进了口袋。

感谢您的阅读,本案例及更加完整丰富的机器学习模型案例的代码已全部开源,关注公众号回复AISharp即可查看仓库地址。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 18:33:37

超越异步:如何在Node.js中构建极速数据库应用?

当你的应用需要处理大量数据查询时,是否曾为复杂的异步回调而头疼?是否在寻找一种既简单又高效的数据库解决方案?better-sqlite3或许正是你需要的答案。 【免费下载链接】better-sqlite3 The fastest and simplest library for SQLite3 in No…

作者头像 李华
网站建设 2026/2/27 15:35:30

Boltz生物分子交互建模:从新手到专家的5个关键步骤

Boltz生物分子交互建模:从新手到专家的5个关键步骤 【免费下载链接】boltz Official repository for the Boltz-1 biomolecular interaction model 项目地址: https://gitcode.com/GitHub_Trending/bo/boltz 在当今生物信息学领域,准确预测分子间…

作者头像 李华
网站建设 2026/2/25 0:39:04

HoYo.Gacha专业抽卡分析工具完全使用手册

HoYo.Gacha专业抽卡分析工具完全使用手册 【免费下载链接】HoYo.Gacha ✨ An unofficial tool for managing and analyzing your miHoYo gacha records. (Genshin Impact | Honkai: Star Rail) 一个非官方的工具,用于管理和分析你的 miHoYo 抽卡记录。(原…

作者头像 李华
网站建设 2026/2/28 15:17:57

FastMCP高级特性之Composition

一、服务组合 使用挂载和导入功能,将多个 FastMCP 服务器合并成一个更大的应用程序。 随着您的 MCP 应用程序不断发展,您可能希望将工具、资源和提示组织到逻辑模块中,或者重用现有的服务器组件。FastMCP 通过两种方法支持组合: i…

作者头像 李华
网站建设 2026/2/24 20:31:44

边缘计算开源项目终极指南:让物联网设备秒变智能终端

边缘计算开源项目终极指南:让物联网设备秒变智能终端 【免费下载链接】Awesome-GitHub-Repo 收集整理 GitHub 上高质量、有趣的开源项目。 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-GitHub-Repo 还在为物联网设备响应慢、云端延迟而烦恼吗&…

作者头像 李华