【PyTorch 实战3:YOLOv5检测模型】10min揭秘 YOLOv5 检测网络架构、工作原理以及pytorch代码实现(附代码实现!)

news2024/11/26 23:52:19

YOLOv5简介

YOLOv5(You Only Look Once, Version 5)是一种先进的目标检测模型,是YOLO系列的最新版本,由Ultralytics公司开发。该模型利用深度学习技术,能够在图像或视频中实时准确地检测出多个对象的位置及其类别,是计算机视觉领域的重要里程碑之一。下面将详细介绍YOLOv5的架构、性能、应用和未来发展方向。

一、与之前版本的对比

相较于YOLOv4和其他先前版本,YOLOv5在多个方面进行了改进和优化。首先,YOLOv5提供了更高的检测准确性,这得益于其新的模型架构以及对数据集和训练过程的细致调优。其次,YOLOv5在处理速度上也有所提升,这意味着它可以更快地对图像或视频进行检测和识别,使其在实时应用中更具竞争力。此外,YOLOv5还引入了一些新的特性,如自动批处理大小调整和更高效的图像处理流程,进一步提升了模型的性能和灵活性。

二、YOLOv5的架构

YOLOv5的架构基于深度卷积神经网络(CNN),采用了一种称为骨干网络(Backbone)的模块化设计。骨干网络通常由多个卷积层和池化层组成,用于从原始图像中提取特征。在YOLOv5中,采用了一种称为CSPDarknet的改进的骨干网络,它结合了Cross-Stage Partial连接(CSP)和Darknet53的优点,具有更好的特征提取能力和更快的训练速度。

除了骨干网络外,YOLOv5还包含了一系列用于检测和识别对象的头部(Head)模块。这些头部模块负责将从骨干网络中提取的特征映射转换为对象的边界框及其类别概率。YOLOv5采用了一种简单而有效的头部设计,包括多个卷积层和线性激活函数,以实现高效的对象检测。

YOLOv5网络整体框架图(来自大佬的:博客)
在这里插入图片描述
SPPF模块
在这里插入图片描述
SPPF模块代码实现:

import time
import torch
import torch.nn as nn


class SPP(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)


class SPPF(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)


if __name__ == '__main__':
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"spp time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"sppf time: {time.time() - t_start}")

三、损失函数
这部分大佬的YOLOv5网络详解介绍得超级好,建议可以读读这篇博客。

四、代码实现

安装PyTorch和其他所需的Python库。具体可以看YOLOv5的仓库要求,然后按照以下步骤进行操作:

  1. 克隆YOLOv5仓库:
git clone https://github.com/ultralytics/yolov5.git
  1. 创建一个新的Python文件,比如yolov5_custom.py

  2. 编写以下代码,实现YOLOv5模型的加载和预测功能:

import torch
from pathlib import Path
from models.yolo import Model
from utils.general import non_max_suppression, scale_coords

# 定义YOLOv5模型类
class YOLOv5:
    def __init__(self, weights='yolov5s.pt', img_size=640):
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.model = Model(Path('yolov5s.yaml')).to(self.device)
        self.model.load_state_dict(torch.load(weights, map_location=self.device)['model'])
        self.model.eval()
        self.img_size = img_size

    # 预测函数
    def predict(self, images):
        img_size = self.img_size
        img = images.copy()  # 使用副本以防止原始图像被修改
        img = torch.from_numpy(img).to(self.device)
        img = img.float() / 255.0  # 像素值归一化到[0,1]
        if img.ndimension() == 3:
            img = img.unsqueeze(0)  # 添加batch维度 (1, H, W, C) -> (1, 1, H, W, C)
        img = img.permute(0, 3, 1, 2)  # 调整维度顺序 (1, 1, H, W, C) -> (1, C, H, W)

        # 图像尺寸调整
        img, _ = self.model.preprocess(img, img_size, img_size)

        # 预测
        pred = self.model(img)[0]  # 只获取第一个尺度的预测结果
        pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)
        
        # 将预测结果转换为图像上的坐标
        pred[0][:, :4] = scale_coords(img.shape[2:], pred[0][:, :4], images.shape).round()

        return pred

# 使用示例
if __name__ == "__main__":
    # 创建YOLOv5对象
    yolov5 = YOLOv5()

    # 加载图像
    image_path = 'example.jpg'
    image = torch.imread(image_path)

    # 进行预测
    results = yolov5.predict(image)

    # 打印预测结果
    for det in results[0]:
        xmin, ymin, xmax, ymax, conf, cls = det
        print(f"Class: {int(cls)}, Confidence: {conf:.2f}, BBox: [{xmin:.2f}, {ymin:.2f}, {xmax:.2f}, {ymax:.2f}]")

这段代码首先定义了一个YOLOv5类,其中包含了模型的初始化和预测函数。然后,我们创建了一个YOLOv5对象,加载了预训练的权重,并使用示例图像进行了预测。最后,我们打印了预测结果,包括类别、置信度和边界框坐标。这样你就可以将示例图像替换为你自己的图像,并根据需要调整预测阈值和其他参数。

五、应用领域

虽然现在已经有很多后续的YOLO版本出现,但是YOLOv5还是最受欢迎的一个,YOLOv5的快速和准确的目标检测能力使其在各种应用领域中得到了广泛的应用。以下是一些常见的应用场景:

  1. 智能监控系统:YOLOv5可以用于实时监控摄像头图像或视频流,检测并识别出图中的人、车辆等对象,从而帮助监控中心及时发现异常情况。

  2. 自动驾驶技术:在自动驾驶车辆中,YOLOv5可以用于实时识别道路上的行人、车辆、交通标志等,帮助车辆做出及时的决策和规划。

  3. 工业生产:在工业生产中,YOLOv5可以用于检测和识别生产线上的产品或零部件,帮助企业提高生产效率和产品质量。

  4. 医学影像分析:在医学影像分析领域,YOLOv5可以用于自动识别X光片或MRI图像中的病灶或异常区域,帮助医生进行疾病诊断和治疗规划。

  5. 智能家居:在智能家居系统中,YOLOv5可以用于识别家庭成员的面部特征或动作姿态,实现智能门锁、智能灯光等功能。

六、未来发展

虽然YOLOv5在目标检测领域取得了显著的进展,但仍然存在一些挑战和改进空间。未来,我们可以期待以下方面的发展:

  1. 模型优化:继续改进和优化YOLOv5的模型架构和参数设置,以进一步提升检测准确性和速度。

  2. 多任务学习:探索多任务学习技术,将目标检测与其他相关任务(如语义分割、实例分割等)相结合,实现更全面的场景理解和分析。

  3. 跨域泛化:研究如何实现模型在不同领
    域和场景中的泛化能力,使其能够适应更广泛的应用场景。

  4. 边缘计算:针对边缘计算场景,优化YOLOv5的模型大小和计算复杂度,以适应资源有限的边缘设备。

  5. 数据增强:进一步研究数据增强技术,以增加模型对不同场景和环境的适应能力,提高模型的泛化性能。

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

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

相关文章

pycharm 安装“通义灵码“并测试

过程:“File>setting>Plugins” 提示: 翻译之后: 点击"接受"之后,提示一下图片,点击ok 安装完成: 安装完"通义灵码"之后,需要登陆,登陆后测试 参考…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下: 1.创建数据库表: 表名:file_test 存储后的数据: 2.创建数据库表对应映射的实体类: import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

进程的概念(2)

进程优先级 1.什么的优先级 概念:指定进程获取某种资源(CPU)的先后顺序 本质:优先级的本质是优先级数字的大小,Linux中优先级数字越小,优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

MT3608B 航天民芯代理 1.2Mhz 24V输入 升压转换器

深圳市润泽芯电子有限公司为航天民芯一级代理商 技术支持欢迎试样~Tel:18028786817 简述 MT3608B是恒定频率的6针SOT23电流模式升压转换器,用于小型、低功耗应用。MT3608B开关频率为1.2MHz,允许使用微小、低电平成本电容器和电感器高度不…

UE5 GAS开发P40 周期性效果,持续治疗

Periodic Gameplay Effects周期性的游戏效果 它们在一段时间内以固定的间隔重复应用到目标上。这种效果通常用于表示持续性伤害、治疗或其他影响,例如中毒、灼烧或回复效果。 修改GE_CrystalHeal,在Period改为每0.1秒执行一次 假如同时有三个持续时间在进行,那么这…

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结: 前言 目前除了巨帧处理逻辑之外,所有的准备工作都已经结束了,先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式,其中…

机器学习:基于Sklearn框架,使用逻辑回归对由心脏病引发的死亡进行预测分析

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

小程序AI智能名片商城系统直连:打造用户与企业无缝对接的新时代!

在高度不确定性的商业环境中,企业如何快速响应市场变化,实现与用户的零距离接触?答案就是——小程序AI智能名片商城系统直连!这一创新工具不仅为企业打开了与用户直接连接的大门,更为企业提供了持续收集用户反馈、快速…

Rust面试宝典第10题:绘制各种图形

题目 我们需要编写一个图形相关的应用程序,并处理大量图形(Shape)信息,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类。应用程序需要计算这些图…

Eclipse C++ 无法debug 问题

环境: ubuntu20.04 Eclipse CDT(x86_64) 工程,使用的是默认的CMake Project 现象: 1. 使用Eclipse, 加了断点后,debug 无法停在断点;step over 执行后是从main 直接执行到exit &#xff…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

React | React.cloneElement 的使用

我看到同事的代码里有 cloneElement&#xff0c;于是去了解了一下这个函数。 就跟它的名字一样&#xff0c;克隆元素&#xff0c;可以基于一个元素创建一个新的元素&#xff0c;并且为新元素添加新的属性或者覆盖已有的属性。 下面是一个简单例子&#xff1a; .node1 {backg…

2024最新docker部署gitlab

docker部署gitlab 快速命令 1 拉取镜像 docker pull gitlab/gitlab-ce2 启动容器 docker run -itd \-p 9980:80 \-p 9922:22 \-v /opt/soft/docker/gitlab/etc:/etc/gitlab \-v /opt/soft/docker/gitlab/log:/var/log/gitlab \-v /opt/soft/docker/gitlab/opt:/var/opt/g…

MATLAB语音信号分析与合成——MATLAB语音信号分析学习资料汇总(图书、代码和视频)

教科书&#xff1a;MATLAB语音信号分析与合成&#xff08;第2版&#xff09; 链接&#xff08;含配套源代码&#xff09;&#xff1a;https://pan.baidu.com/s/1pXMPD_9TRpJmubPGaRKANw?pwd32rf 提取码&#xff1a;32rf 基础入门视频&#xff1a; 视频链接&#xff1a; 清…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

红黑树笔记

2-3树 -> 左倾红黑树 红黑树实际上是2-3树的一种基于BST的实现。普通二叉搜索树&#xff08;BST&#xff09;中的每一个节点&#xff0c;只有一个键&#xff0c;两条链接&#xff08;两个子节点&#xff09;&#xff0c;这种节点被称为2节点。2-3树中&#xff0c;引入了一个…

利用二叉检索树将文章中的单词建立索引(正则表达式)

知识储备 链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】 1、正则表达式的处理 &#xff08;1&#xff09;r’前缀的作用 r’前缀的用于定义原始字符串&#xff0c;特点是不会处理反斜杠\作为转义字符 &#xff08;2&#xff09;正则表达式中元…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

Arm Linux 移植 Air724UG 4G模块-USB方式

目录 一、开发环境二、连接方式三、4G模组的 VID 和 PID四、Linux kernel 的配置五、ppp的编译六、测试 一、开发环境 开发板&#xff1a;NUC980 iot开发板 4G模块&#xff1a;银尔达 Core-Air724 二、连接方式 micro usb线&#xff0c;一端连接4G模组&#xff0c;一端连接N…