无脑使用matlab运行YOLOv5模型,实现目标检测

在这里插入图片描述


文章目录

  • 前言
  • 代码
  • 报错解决方法
  • 缺点
  • 总结


前言

YOLO 是一种经典的一阶段目标检测算法,它将检测问题转化为回归问题。与 Faster R-CNN 不同,YOLO 不是提取 RoI,而是直接通过回归的方法生成每个类的边界框坐标和概率。与 Faster R-CNN相比,大大提高了检测速度。Glenn Jocher 于 2020年提出了 YOLO 的第五个版本,命名为 YOLOv5,其网络结构主要分为骨干模块、颈部模块和头部模块。主干模块基于Focus、BottleneckCSP(跨阶段部分网络)和空间金字塔池,并将其传输到颈部模块。颈部模块基于PANet(路径聚合网络)生成特征金字塔。它通过双向融合低级空间特征和高级语义特征来增强检测不同尺度物体的能力。头部模块通过将锚框应用于来自颈部模块的多尺度特征图来生成检测框、类别信息、坐标和置信度。也有使用matlab完成YOLOv5目标检测,本文将参考 cuixing158 作者的源码,giehub地址为: yoloV5-yoloX-matlab。

在这里插入图片描述
重点重点重点:为了代码运行不报错,安装 matlab 版本为 2021 及以上版本。
matlab安装教程大家可以参考这个教程: 手把手教你安装matlab软件

代码

运行效果如下:
在这里插入图片描述

我修改好的代码如下,直接复制即可运行,并解决运行会报错的问题解决一下,我也会把源码包放到公众号,末尾领取资料即可。代码整体流程是:

  1. 模型加载与初始化:

    加载预训练的YOLOv5模型(yolov5s.onnx)。
    设置相关参数,如输入尺寸(640x640)、阈值(0.3,0.5)。

  2. 图像读取与显示:

    读取待检测的图像(‘images/2.jpg’)并显示原图。

  3. 图像预处理:

    对图像进行大小调整(imresize), 将图像像素值缩放至[0,1]范围等

  4. 模型推理:

    使用feval函数进行模型的前向推理,得到检测结果(outs),包括多个检测头的输出。

  5. 解码YOLOv5输出:

    对YOLOv5的输出进行解码,得到每个检测框的坐标、置信度以及类别信息。

  6. 阈值过滤和非极大值抑制(NMS):

    过滤掉低置信度的检测框,对过滤后的检测框进行NMS处理,去除重叠较大的检测框,只保留最强的框。

修改好的代码如下:

model = "./yolov5s.onnx";
customYoloV5FcnName = 'yolov5fcn';
inputSize = [640,640];
throushHold = 0.3;
nmsThroushHold = 0.5;
outs = cell(3,1); % 3个检测head输出
classesNames = categorical(readlines("coco.names"));
colors = randi(255,length(classesNames),3);
params = importONNXFunction(model,customYoloV5FcnName);image = imread('images/2.jpg');  % 修改为你需要识别的图片路径
imshow(image);
title('原始图像');[H,W,~] = size(image);% 图像预处理
img = imresize(image, inputSize);
img = rescale(img, 0, 1);  % 转换到[0,1]
img = permute(img, [3,1,2]);  % 改变维度顺序为 [C,H,W]
img = dlarray(reshape(img, [1, size(img)])); % n*c*h*w,[0,1],RGB顺序
if canUseGPU()img = gpuArray(img);
endt1 = tic;
[outs{:}] = feval(customYoloV5FcnName, img, params, ...'Training', false, ...'InputDataPermutation', 'none', ...'OutputDataPermutation', 'none');  % 预测图像
fprintf('yolov5预测耗时:%.2f 秒\n', toc(t1));outFeatures = yolov5Decode(outs, H, W);%% 阈值过滤+NMS处理scores = outFeatures(:, 5);
% 阈值过滤:只保留大于阈值的框
validIdxs = scores > throushHold;
outFeatures = outFeatures(validIdxs, :); % 提取边界框和对应的类别信息
allBBoxes = outFeatures(:, 1:4);
[maxScores, indxs] = max(outFeatures(:, 6:end), [], 2);
allScores = maxScores;
allLabels = classesNames(indxs);% 如果存在有效边界框,则进行NMS非极大值抑制
if ~isempty(allBBoxes)[bboxes, nmsScores, labels] = selectStrongestBboxMulticlass(allBBoxes, allScores, allLabels, ...'RatioType', 'Min', 'OverlapThreshold', nmsThroushHold);annotations = string(labels) + ": " + string(nmsScores);% 获取类别ID并为每个类别分配颜色[~, ids] = ismember(labels, classesNames);color = colors(ids, :);image = insertObjectAnnotation(image, 'rectangle', bboxes, cellstr(annotations), ...'Color', color, 'LineWidth', 3);
end% 显示结果图像
imshow(image);
title('检测结果图像');function outPutFeatures = yolov5Decode(featuremaps, oriHight, oriWidth, anchors)argumentsfeaturemaps (:,1) celloriHight (1,1) doubleoriWidth (1,1) doubleanchors (:,2) double = [10,13; 16,30; 33,23;...30,61; 62,46; 59,119;...116,90; 156,198; 373,326]end%% yolov5*.onnx known paramsinputSize = 640;  % 输入网络图像大小,正方形图像输入na = 3;           % 每个检测head对应anchor的数量nc = 80;          % coco类别数量%% decodescaledX = inputSize./oriWidth;scaledY = inputSize./oriHight;outPutFeatures = [];numberFeaturemaps = length(featuremaps);for i = 1:numberFeaturemapscurrentFeatureMap = featuremaps{i};  % bs*[(4+1+nc)*na]*h*w大小currentAnchors = anchors(na*(i-1)+1:na*i, :);  % na*2numY = size(currentFeatureMap, 3);numX = size(currentFeatureMap, 4);stride = inputSize ./ numX;% reshape currentFeatureMap到有意义的维度,bs*[(4+1+nc)*na]*h*w --> h*w*(5+nc)*na*bs% --> bs*na*h*w*(5+nc),最终的维度方式与yolov5官网兼容bs = size(currentFeatureMap, 1);h = numY;w = numX;disp(size(currentFeatureMap));currentFeatureMap = reshape(currentFeatureMap, bs, 5 + nc, na, h, w);  % bs*(5+nc)*na*h*wcurrentFeatureMap = permute(currentFeatureMap, [1, 3, 4, 5, 2]);  % bs*na*h*w*(5+nc)[~,~,yv,xv] = ndgrid(1:bs, 1:na, 0:h-1, 0:w-1);  % yv, xv大小都为bs*na*h*w,注意顺序,后面做加法维度标签要对应gridXY = cat(5, xv, yv);  % 第5维上扩展,大小为bs*na*h*w*2, x,y从1开始的索引currentFeatureMap = sigmoid(currentFeatureMap);  % yolov5是对所有值进行归一化,与yolov3/v4不同currentFeatureMap(:,:,:,:,1:2) = (2 * currentFeatureMap(:,:,:,:,1:2) - 0.5 + gridXY) .* stride;  % 大小为bs*na*h*w*2,预测对应xyanchor_grid = reshape(currentAnchors, 1, na, 1, 1, 2);  % 此处anchor_grid大小为1*na*1*1*2,方便下面相乘currentFeatureMap(:,:,:,:,3:4) = (currentFeatureMap(:,:,:,:,3:4) * 2).^2 .* anchor_grid;  % 大小为bs*na*h*w*2if nc == 1currentFeatureMap(:,:,:,:,6) = 1;endcurrentFeatureMap = reshape(currentFeatureMap, bs, [], 5 + nc);  % bs*N*(5+nc)if isempty(outPutFeatures)outPutFeatures = currentFeatureMap;elseoutPutFeatures = cat(2, outPutFeatures, currentFeatureMap);  % bs*M*(5+nc)endend%% 坐标转换到原始图像上% [cx, cy, w, h],yolov5.onnx基准图像大小(1*3*640*640)----> [x, y, w, h], 坐标基于原始图像大小(1*3*oriHight*oriWidth)outPutFeatures = extractdata(outPutFeatures);  % bs*M*(5+nc), 为[x_center, y_center, w, h, Pobj, p1, p2,..., pn]outPutFeatures(:,:,[1,3]) = outPutFeatures(:,:,[1,3]) ./ scaledX;  % x_center, widthoutPutFeatures(:,:,[2,4]) = outPutFeatures(:,:,[2,4]) ./ scaledY;  % y_center, heightoutPutFeatures(:,:,1) = outPutFeatures(:,:,1) - outPutFeatures(:,:,3) / 2;  % xoutPutFeatures(:,:,2) = outPutFeatures(:,:,2) - outPutFeatures(:,:,4) / 2;  % youtPutFeatures = squeeze(outPutFeatures);  % 如果是单张图像检测,则输出大小为M*(5+nc),否则是bs*M*(5+nc)if (canUseGPU())outPutFeatures = gather(outPutFeatures);  % 推送到CPU上end
end

报错解决方法

第一次运行可能会报错
在这里插入图片描述
只需双击 onnxconverter.mlpkginstall 文件安装就行,安装页面需要登录邮箱,没有邮箱注册一个就行,我用的是qq邮箱。
在这里插入图片描述

缺点

目前还不能更换自己训练的模型,也可能作者是在旧版本yolov5中实现的,自己尝试更换,但是会出现很多目标框,还得向大佬学习matlab。


总结

我也会把源码包放到公众号,回复“matlab-yolov5”即可获取源码,关注我,带你不挂科!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15514.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java ssm 高校固定资产管理系统 高校物资管理 资产信息 源码 jsp

一、项目简介 本项目是一套基于SSM的高校固定资产管理系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具等。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后端技术&am…

《战国王朝》青铜材料具体作用介绍

《战国王朝》中的青铜材料是游戏里非常重要的金属材料,而青铜材料的具体作用就是青铜用于制作第三层次的工具和武器;它比铜制的更好,但不如铁和钢制的,相比石制和铜制工具,青铜物品的使用寿命更长。 战国王朝青铜材料有什么用 青…

unity3d————延时函数

1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一:函数名字符串 参数二:第一次执行的延迟时间 参数三:之后每次执行的间隔时间 注意: 1-1.延时函数第…

焊接手电钻板子后总结

复用旧工程部分方案注意事项: 粘贴暑假时候做的工程原理图,复制到现在的项目中竟然忘记修改3V3的名称,导致3V3MCU与3V3的区别,这个错误以后一定要注意: 现在工程中的供电3V3,不是3V3MCU: 焊接QFN芯片&…

大模型智能客服比传统智能客服“智”在哪里?

随着人工智能技术的飞速发展,智能客服已成为企业提升服务效率和客户满意度的关键工具。在智能客服的演进过程中,大模型智能客服以其卓越的性能和智能化水平,逐渐崭露头角,更是为客户服务带来了新的变革。那么,大模型客…

Google Play上架/更新被拒的原因及解决方案

Google Play商店是全球Android开发者发布应用的首选平台,但在这个平台上发布或更新应用时,开发者必须遵守严格的规定和政策。如果违反这些规定,应用可能会被拒绝上架或更新,甚至可能导致开发者账号被封禁。本文将总结Google Play上…

docker安装到D盘

双击安装docker默认是安装在c盘,并且安装时我们没法选择位置,如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构&#xf…

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理:思路链 论文地址:http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库,吹嘘自己比 NUnit 和 xUnit 还要高明, 支持在 TEST_CASE() 中的多个 SECTION, 意思是说 SECTION 外头的代码相当于setup 和 teardown,section 内部则被认为是实际的 test case, 这种写法可…

TensorFlow_T7 咖啡豆识别

目录 一、前言 二、前期准备 1、设置GPU 2、导入数据 3、查看数据图片 三、数据预处理 1、加载数据 2、可视化数据 3、配置数据集 四、构建VGG-16网络 1、VGG优缺点分析 2、自建模型 3、网络结构图 五、编译 六、 训练模型 一、前言 🍨 本文为&#…

平替备用机!不到 5 元的 410 随身 WiFi 免刷机实现短信转发

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 各位用备用机的,应该有很多只是插上不常用的手机卡,然后装个短信转发的 App 来看看验证码什么的吧。每隔一段时间还要去看看备用机还有没有电,但其实这种需求骁龙 410 芯…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下,当屏幕内容绘制完毕后,实际应用通常需要更新屏幕中的一部分内容,而不是单纯显示一个静态图片在那。 如下图所示,屏幕中有一个图片控件(Img2)和一个文本控件&#xf…

网络基础-超文本协议与内外网划分(超长版)

一、超文本协议 1. HTTP协议简介 1.1. 网络架构简单介绍 (1). C/S架构(Client/Server架构) (2). B/S架构(Browser/Server) 总结对比 2. HTTP协议版本 2.1. HTTP/0.9 (1991年发布) 2.2. HTTP/1.0 &a…

5分钟搞懂 Golang 堆内存

本文主要解释了堆内存的概念,介绍了 Linux 堆内存的工作原理,以及 Golang 如何管理堆内存。原文: Understanding Heap Memory in Linux with Go 你想过为什么堆内存被称为 "堆" 吗?想象一下杂乱堆放的对象,与此类似&…

今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作(三种实现方式): 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

技术段子——论如何在0.387秒以内获取到闲鱼的上新数据。

个人一直在做闲鱼辅助相关的工具类软件。因为知道阿里系请求和风控的原因,再加个人做软件一直想的是如何让用户稳定运行。 因为阿里系对于请求的风控,所以个人风格导到软件效率一直一般。并不是做不到快速抓取,而是用效率换稳定。 所以&#…

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功,而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类(抽象类) public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…

2025年PMP考试安排是怎样?备考计划与重要时间节点公布

PMP考试在中国大陆每年举行四次,分别是在3月、6月、9月和12月。而中国港澳台地区的PMP考试则可以每天进行机考。在中国大陆地区的笔试考试中,主要采用涂卡和机读卡来记录成绩。 每次PMP考试的时间都是在周六的9点到12点50分,共计230分钟。 P…

缓冲式线程池C++简易实现

前言 : 代码也比较短&#xff0c;简单说一下代码结构&#xff0c;是这样的&#xff1a; SyncQueue.hpp封装了一个大小为MaxTaskCount的同步队列&#xff0c;这是一个模板类&#xff0c;它在线程池中承担了存放任务等待线程组中的线程来执行的角色。最底层是std::list<T>…