Matlab调用ONNX模型的完整流程:以YOLOv5为例(附代码)

张开发
2026/4/17 17:15:50 15 分钟阅读

分享文章

Matlab调用ONNX模型的完整流程:以YOLOv5为例(附代码)
Matlab调用ONNX模型的完整流程以YOLOv5为例附代码在工业检测、自动驾驶和医疗影像等领域深度学习模型的应用越来越广泛。对于习惯使用Matlab进行算法开发的工程师来说如何将训练好的ONNX模型集成到现有工作流中是一个值得深入探讨的话题。本文将手把手带你完成从模型准备到最终结果可视化的全过程特别针对YOLOv5这一经典目标检测架构。1. 环境准备与模型获取1.1 系统要求检查在开始之前请确保你的Matlab版本满足以下条件Matlab R2020b或更新版本已安装Deep Learning Toolbox计算机配备NVIDIA GPU推荐并正确配置CUDA提示可通过运行gpuDevice命令验证GPU是否可用若返回空数组则需检查驱动安装。1.2 YOLOv5 ONNX模型获取YOLOv5官方仓库提供了预训练模型的ONNX导出功能。具体获取步骤git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt python export.py --weights yolov5s.pt --include onnx这将生成yolov5s.onnx文件文件结构如下表所示模型版本输入尺寸参数量适用场景yolov5n640×6401.9M移动端部署yolov5s640×6407.2M平衡型yolov5m640×64021.2M精度优先2. 模型导入与初始化2.1 ONNX函数导入Matlab提供了专门的函数处理ONNX模型modelPath yolov5s.onnx; net importONNXNetwork(modelPath, OutputLayerType, regression);导入后可通过analyzeNetwork(net)查看网络结构特别注意输入输出层的名称和维度。2.2 输入预处理配置YOLOv5要求特定的输入格式inputSize [640 640 3]; % 高度×宽度×通道数 meanVal [0 0 0]; % 不进行均值减法 stdVal [255 255 255]; % 将像素值归一化到[0,1]预处理函数示例function preprocessedImg preprocessYOLOv5Input(img) img imresize(img, inputSize(1:2)); img single(img); % 转换为单精度 img img./255; % 归一化 img permute(img, [3 1 2]); % HWC→CHW img dlarray(img, SSCB); % 添加batch维度 end3. 模型推理与输出解析3.1 执行预测加载测试图像并进行推理testImg imread(test.jpg); inputData preprocessYOLOv5Input(testImg); outputs predict(net, inputData);YOLOv5的输出通常包含三个检测头的预测结果结构如下输出层特征图尺寸锚框数量每个预测维度output180×80385 (xywhconf80类)output240×40385output320×203853.2 后处理实现完整的后处理流程包括置信度阈值过滤类别概率计算非极大值抑制(NMS)function [bboxes, scores, labels] processYOLOOutput(outputs, confThreshold, iouThreshold) % 合并三个检测头的输出 allBoxes []; allScores []; allLabels []; for i 1:length(outputs) [boxes, scores, labels] parseSingleHead(outputs{i}, confThreshold); allBoxes [allBoxes; boxes]; allScores [allScores; scores]; allLabels [allLabels; labels]; end % 执行NMS [bboxes, scores, labels] selectStrongestBboxMulticlass(... allBoxes, allScores, allLabels, ... RatioType, Union, ... OverlapThreshold, iouThreshold); end4. 结果可视化与性能优化4.1 检测结果渲染将预测框绘制到原图上function showDetectionResult(img, bboxes, scores, labels) figure; imshow(img); hold on; for i 1:size(bboxes,1) rectangle(Position, bboxes(i,:), EdgeColor, r, LineWidth, 2); text(bboxes(i,1), bboxes(i,2)-10, ... sprintf(%s:%.2f, labels(i), scores(i)), ... Color, w, FontSize, 10, BackgroundColor, r); end hold off; end4.2 性能优化技巧通过实测发现几个关键优化点内存预分配提前为输出变量分配内存outputs cell(3,1); outputs{1} zeros(85, 80, 80, 3, single);批处理预测同时处理多张图像batchData dlarray(zeros(3,640,640,4,single), SSCB); batchOutputs predict(net, batchData);混合精度推理使用dlquantize减少内存占用下表对比了不同优化策略的效果优化方法推理时间(ms)内存占用(MB)适用场景原始版本1521200开发调试批处理4张981800批量处理FP16量化85800边缘设备在实际项目中我发现将预处理和后处理步骤封装成独立的类可以显著提高代码复用率。特别是在处理视频流时建立持久化的检测器对象避免了重复初始化开销。

更多文章