在树莓派上使用customvision.ai/.NET 5部署目标检测模型问题求助
树莓派ARM环境.NET 5调用Custom Vision ONNX模型解决方案
问题根因
ML.NET 1.6版本官方仅支持x86/x64架构,内置ONNX推理绑定未适配ARM架构,因此部署到树莓派时会抛出架构不兼容报错,和ONNX模型本身无关。
兼容方案(无需重写为Python/C++,无需跨进程调用)
步骤1:调整项目依赖
- 卸载项目中
Microsoft.ML、Microsoft.ML.OnnxTransformer等ML.NET推理相关包 - 保留
Microsoft.ML.OnnxRuntime 1.8.1,额外安装对应ARM架构的运行时包:- 32位Raspberry Pi OS安装
Microsoft.ML.OnnxRuntime.Linux.arm - 64位Raspberry Pi OS安装
Microsoft.ML.OnnxRuntime.Linux.arm64
- 32位Raspberry Pi OS安装
步骤2:直接调用OnnxRuntime执行推理
Custom Vision导出的目标检测ONNX模型固定输入名为data,输出名为model_outputs0,无需调整模型结构即可直接调用,参考代码如下:
using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using System.Drawing; // 初始化推理会话,自动适配ARM架构 var sessionOpts = new SessionOptions { EnableCpuMemArena = true, ExecutionMode = ExecutionMode.ORT_SEQUENTIAL }; using var inferSession = new InferenceSession("你的模型文件路径.onnx", sessionOpts); // 图片预处理:将输入图片缩放到模型要求尺寸(通常为416*416),转为NCHW格式并归一化 float[] PreprocessImage(Bitmap originImg) { var resizedImg = new Bitmap(originImg, new Size(416, 416)); var inputBuffer = new float[1 * 3 * 416 * 416]; for (int y = 0; y < 416; y++) { for (int x = 0; x < 416; x++) { var pixel = resizedImg.GetPixel(x, y); inputBuffer[0 * 3 * 416 * 416 + 0 * 416 * 416 + y * 416 + x] = pixel.R / 255f; inputBuffer[0 * 3 * 416 * 416 + 1 * 416 * 416 + y * 416 + x] = pixel.G / 255f; inputBuffer[0 * 3 * 416 * 416 + 2 * 416 * 416 + y * 416 + x] = pixel.B / 255f; } } return inputBuffer; } // 执行推理 var inputTensor = new DenseTensor<float>(PreprocessImage(输入图片对象), new[] { 1, 3, 416, 416 }); var inputParams = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("data", inputTensor) }; using var inferOutputs = inferSession.Run(inputParams); var resultTensor = inferOutputs.First().AsTensor<float>(); // 后处理逻辑可直接复用原有ML.NET项目中的代码:按阈值过滤置信度、NMS去重、映射训练时的自定义标签即可
步骤3:发布配置
- 发布时目标运行时选择对应架构:
linux-arm(32位系统)/linux-arm64(64位系统) - 若使用
System.Drawing.Common处理图片,需提前在树莓派中安装依赖:sudo apt install libgdiplus
内容的提问来源于stack exchange,提问作者mansos
相关产品推荐
相关产品推荐

