详解yolov5的网络结构

news2024/11/18 18:30:45

转载自文章

网络结构图(简易版和详细版)

此图是博主的老师,杜老师的图

网络框架介绍

前言:

YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分,

backbone,neck,head。

如上图所示,我们需要先理解三个模块:Conv,C3,SPPF,以便理解网络结构图。

关于这三个模块的解释放在文章末尾。

其他我觉得有用的前置知识也会放在文章末尾。

1.backbone

作用:提取特征

backbone(主干网络)通过一系列的卷积层和池化层对输入图像进行处理,逐渐降低特征图的尺寸同时增加通道数。这样做的目的是保留和提取图像中重要的特征。

经过backbone提取的特征图会传递给后续的特征金字塔网络(neck)和检测头(detection head)进行处理。

分辨率高、尺度大的图片更适合用于预测小目标而不是大目标。

首先,分辨率高的图片具有更多的细节信息,可以提供更丰富的特征和上下文信息。这对于识别和定位小目标非常重要,因为小目标通常具有较少的区分特征,需要更多的细节来进行准确的预测。

其次,尺度大的图片可以容纳更多的目标实例。在一个大尺度的图片中,可能存在多个小目标,而这些小目标在尺度较小的图片中可能会被压缩或截断,导致难以准确预测。因此,对于小目标的预测,使用尺度大的图片可以提供更多的目标实例,增加了模型的训练样本,有助于提高预测的准确性。

然而,对于大目标的预测,使用尺度大的图片可能并不是最佳选择。大目标通常具有明显的外观特征,而且在尺度较小的图片中也能够得到充分表示。此时,使用尺度较小的图片可以减少计算复杂

2.neck

neck(颈部)是backbone(主干网络)和detect(检测头)之间的网络模块。

作用:

在主干网络提取的特征基础上,进一步进行特征融合上采样操作(Upsample),以提供更高级的语义信息适应不同尺度图片的能力

更进一步讲,

在卷积神经网络中,先从浅层提取到图形特征,它们是简单的图形,语义性不够强;

再从深层提取到语义特征,语义性很强了,但却没了简单的图形。

而通过neck部分,就能实现浅层图形特征和深层语义特征的融合,(Concat就是在做这件事情)

归根到底还是为了目标检测能够更精细、准确!

以上这段话借用自记录yolov5目标检测算法学习(模型的框架学习)23/10/10_晴友读钟的博客-CSDN博客

3.head

作用:

对提取到的特征进行进一步处理,并生成最终的输出结果。

细讲一下head中作用的其中一个方面,

特征融合与转换:head可以将不同尺度的特征进行融合和转换,这有助于捕捉更高层的语义信息和上下

参考内容:特征融合与转换:head可以将不同尺度的特征进行融合和转换,这有助于捕捉更高层的语义信息和上下文关系。

我们结合网络结构图,可以看到,head接收了来自深度为第17,20,23层的特征图,

特征图分辨率越来越低,感受野越来越大,虽然可以学习到更高级的语义信息,但也会丢失细节

为了能检测到不同大小的物体,于是设计了detect模块来实现。

文关系。

我们结合网络结构图,可以看到,head接收了来自深度为第17,20,23层的特征图,

特征图分辨率越来越低,感受野越来越大,虽然可以学习到更高级的语义信息,但也会丢失细节

为了能检测到不同大小的物体,于是设计了detect模块来实现。

知识点补充

1.什么是CNN?

CNN通过模拟人类视觉系统的工作原理,通过层层堆叠的卷积层、池化层和全连接层等组件来进行图像数据的特征提取和分类。

2.什么是Conv?

Conv(卷积层)通常是由卷积(Convolution)、批标准化(Batch Normalization)和激活函数(Activation)这三个模块组成的

  1. 卷积(Convolution)

卷积是卷积神经网络最重要的操作之一,它通过在输入数据上滑动一个卷积核(filter),来提取出输入数据中的特征。卷积操作可以帮助网络捕捉到局部的空间信息,并且通过参数共享来减少模型的参数量,从而降低了过拟合的风险。

在卷积操作中,卷积核会对输入数据进行逐元素的乘法累加,从而生成输出特征图。卷积核的大小、步长、填充等超参数可以控制输出特征图的尺寸和感受野大小。此外,卷积操作还可以使用不同的卷积核来提取不同的特征,从而增强网络的表达能力。

  1. 批标准化(Batch Normalization)

批标准化是一种常用的技术,可以帮助网络更好地学习和收敛。它通过对每个小批量数据进行归一化,来使得网络中的每一层输入分布更加稳定。批标准化可以减少梯度消失和梯度爆炸的问题,从而使得网络更易于训练。此外,批标准化还可以增加网络的鲁棒性,使其对输入数据的变化更加稳定。

  1. 激活函数(Activation)

激活函数是卷积神经网络中非常重要的组件之一,对输入数据进行非线性变换,从而增强网络的表达能力。在卷积神经网络中,常用的激活函数包括ReLU、LeakyReLU、Sigmoid、Tanh等。这些激活函数都可以通过将负值置为0或者进行缩放来引入非线性变换,并且具有不同的性质和优缺点。

激活函数的作用是将卷积操作的输出映射到一个非线性空间中,从而使得网络能够更好地学习复杂的特征表示。激活函数还可以帮助网络更好地处理梯度信息,从而加速网络的收敛速度。

特点:

每经过一个Conv,原特征图大小减一半,通道数乘2。

作用:

特征提取和特征融合

k,s,p,c什么意思?

  •     K: Kernel Size(卷积核大小):表示卷积核的尺寸。卷积核通常是一个二维矩阵(我将其比喻为窗口),用于提取输入数据的特征。例如:卷积核为3*3,则表示为k3,为6*6,则表示为k6。卷积核的大小通常是根据具体任务和数据的特点进行选择的。较小的卷积核可以提取更细粒度的特征,而较大的卷积核可以提取更全局的特征。同时,卷积核的大小也会影响模型的计算复杂度和参数量。
  •   S: Stride(步幅):表示卷积核在输入的图像上滑动的步长。它决定了卷积操作的输出尺寸。
  • P: Padding(填充):表示在输入数据周围添加额外的像素值。填充可以使得卷积操作后输出数据的尺寸与输入数据相同或相近。例如,此时要将分辨率为3*3和9*9的图片进行特征融合,为了不改变图像原有的特征,不采用拉伸图像的方法,而是在3*3的图片四周(上下左右)填充灰度,使3*3的图片变为9*9,就可以进行特征融合了。那么要填充多少呢?我们要在四周分别填充p个像素,故为p3。padding_size = (kernel_size - 1) / 2
  • C: Channels(通道数):表示输入数据和卷积核中的通道数量。

通过调整这些参数,可以控制卷积操作的行为和输出结果的尺寸。卷积神经网络中的每一层都可以具有不同的KSPC设置,以适应不同的特征提取需求。

例如,使用3x3大小的卷积核,步幅为1,填充为0,通道数为64的卷积层,可以表示为"Conv(3, 1, 0, 64)"。这意味着在输入数据上使用3x3的卷积核进行卷积操作,步幅为1,不进行填充,并且输出通道数为64。

进一步解释Conv的完整过程,

我们可以将卷积核想象成一个窗口,而输入数据则是一张图片。卷积操作就像是将这个窗口在图片上滑动,对窗口内的像素进行一系列的计算,并生成一个新的像素值。这个新的像素值是通过将窗口内的像素与卷积核内对应位置的权重相乘,再求和得到的。

而步幅(Stride)是指卷积核在输入数据上滑动的距离。通俗地说,步幅就是每次卷积核在输入数据上移动的像素数。

想象一下,你有一张图片,而卷积核就像是一个小窗口,你把这个小窗口放在图片的左上角,然后开始滑动。步幅就是决定你每次滑动的距离。

如果步幅较大,那么你每次滑动的距离就比较长,相当于你在图片上跳跃式地移动。这样可以快速地对整个图片进行处理,但是可能会导致一些细节信息被忽略,因为你没有在每个位置都进行处理。

如果步幅较小,那么你每次滑动的距离就比较短,相当于你在图片上细致地移动。这样可以更好地捕捉到图片的细节信息,但是需要更多的计算和时间来完成整个处理过程。

那么填充有什么用呢?我们知道,经过卷积,特征图大小会减小一般,但我们要保证输出的图像大小跟输入时的大小接近,于是要填充四周。

假设图片为6*6,经过conv层变为3*3,但要保证图片依然为6*6,于是在图片四周填充,使其变回6*6。

Conv(卷积)层的通道有什么用?
通道数的概念:

通道数是指输入或输出中的特征通道数量。对于图像数据来说,通道数通常表示红色、绿色和蓝色(RGB)三个颜色通道。

注意,通道数不仅仅指的是颜色,除了RGB通道之外,还有其他类型的通道可以用于图像处理和深度学习任务。通道数通常用于表示颜色通道、灰度通道、深度通道等。

作用:

增加卷积层的通道数可以提高网络的表达能力,使其更好地适应复杂的任务。

例如:在图像分类过程中,最初的卷积层可以捕捉到低级特征,如边缘和颜色,

然而随着网络模型的深度加深,输出特征图中的模式和结构也越来越复杂。

如果网络太浅或通道数不够,则可能无法捕捉到复杂的特征,从而影响分类性能

总结:增加通道数可以使网络更加灵活和强大

3.什么是C3?

C3模块图如上。C3之所以叫C3,是因为在这个模块中有三个卷积层(Conv)

解释:

可以看到左侧卷积提取了一半的feature(特征),什么也不干,

右侧卷积也提取了一半的feature,使其经过BottleNeck(有两种)处理后,

两个部分进行Concat(拼接),然后再经过一次卷积层

作用:

从不同维度去提取特征并融合

4.什么是SPPF?

了解SPPF前,我们先要知道SPP(Spatial Pyramid Pooling),中文为空间金字塔池化

而SPPF(Spatial Pyramid Pooling Fusion)则是SPP的改进版。

什么是SPP?

在传统的CNN网络中,全连接层要求输入的特征图大小必须固定,但是图像中的物体大小和数量却是不确定的。因此,在使用全连接层之前,需要将所有的特征图resize到一个固定大小,这就会丢失掉部分信息(缺点)。

而SPP层可以通过金字塔池化的方式,在不同的尺度下进行池化操作,并将各个尺度的池化结果进行concat(拼接)作为输出,这样就可以在不改变特征图大小的情况下,得到一个固定长度的向量表示,从而解决了输入大小的问题。

SPPF和SPP的作用:

用于将不同尺度的特征进行融合,通过对特征图进行金字塔划分和池化操作,将多尺度特征整合到一个固定长度的特征向量中。

优点:

SPP可以处理任意大小的输入特征图,因此可以避免特征图大小变化对模型的影响。

SPP是如何运作的?

1.输入图像:SPP层可以接受任意大小的输入图像。

2.特征提取网络:通常使用预训练好的卷积神经网络(CNN)来提取图像特征。

3.SPP:对于不同大小的输入图像,SPP层会自动根据其大小分别生成多个不同尺度的池化区域,在这里是13*13,9*9,5*5。然后在每个池化区域内执行最大池化操作,得到固定大小的特征向量。

4.Concat:将多个尺度的特征向量(即上一步的池化结果)进行拼接

SPPF在SPP上有何改进?

与SPP相比,SPPF的池化操作由并联变为串联,且池化区域大小不变。后面两次池化是在上一次的基础上进行的。提高了效率,原理此处不展开讲。

5.什么是语义信息?

通俗地讲,语义信息是指数据中所隐含的意义和信息。

在人类语言中,一句话由多个字词组成,每一个字词都有语义信息,我们通过分析每一个词的语义信息,就能推导出整句话的含义。

类似的,在计算机视觉中,一张图片由若干个像素组成,每一个像素都有其自身的颜色和位置信息,通过分析每一个像素的颜色和位置信息,就能推导出整张图片的含义

6.什么是图形特征?

关于这个概念,简单理解即可。

图形特征,就是一张图像所含有的特征

例如:形状,纹理,颜色,边缘等,这些都是图像的特征,统称图形特征

7.什么是上采样操作?

结构图中的Upsample就是常见的上采样操作。

作用:

上采样操作会将较低分辨率的特征图进行上采样,以恢复到与较高分辨率特征图相同的尺寸

说人话就是,把较小的输入图像恢复出较大的图像。

yolov5中的Upsample操作是为了让不同尺寸的图像拼接,特征融合

8.特征图尺度,细节信息,语义信息之间有什么联系?

较浅的特征图(即较大尺度,分辨率较高的特征图)可以捕捉到更多的细节信息,例如物体的纹理等。

较深的特征图(即较小尺度,分辨率较低的特征图)则具有更高级的语义信息,例如物体的类别,姿态等。

因此,需要利用不同尺度的特征图,以保留丰富的语义信息和细节信息。

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

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

相关文章

大数据平台之CDC (Chanage Data Capture) 方案

Change Data Capture (CDC) 是一种用于跟踪和捕获数据库中数据变更的技术,它可以在数据发生变化时实时地将这些变更捕获并传递到下游系统。以下是一些常用的开源 CDC 方案: 1. Flink CDC Flink CDC 是基于 Apache Flink 的一个扩展,它通过集…

.NET下的开源OCR项目:解锁图片文字识别的新篇章

在数字化时代,从图片中高效准确地提取文字信息已成为众多应用场景的迫切需求。OCR(Optical Character Recognition,光学字符识别)技术正是满足这一需求的关键技术。对于.NET开发者而言,幸运的是,存在多个开…

Wireshark网络抓包工具入门指南

目录 引言 安装抓包工具 抓包基础概念 抓包步骤 流程 抓包工具头的分析 14.3 以太网的完整帧格式 粘包与拆包现象解析及解决方案 发生原因 解决方案 14.3.1以太网头 14.3.2 IP头 14.3.3 UDP头 14.3.4 TCP头 引言 Wireshark是一款功能强大的开源网络协议分析器&am…

2024企业加密软件丨为什么企业需要防泄密

企业为什么需要防泄密? 企业的数据中包含了许多核心机密,如研发成果、商业计划、客户资料等。这些信息的泄露可能使竞争对手获得不正当的优势,给企业带来严重损失。 数据泄露事件往往会对企业的声誉造成负面影响,降低客户信任度…

数字化装备场转型,RFID军标桌面发卡器再现创新风暴

在过去,人们主要依靠条形码扫描枪、简单手工抄录等方式来记录数据。部队数字化装备场的出现,对普通发卡器有更高层次的需求:广州一芯未来在传统发卡器基础上,研发出一款利用无线射频信号与RFID军标标签进行通信的设备——RFID军标…

三线表学习记录

参考链接 1,必须使用三线表?全线表如何改为三线表? 这个帖子写的不错。 2,https://www.zhihu.com/question/609126613/answer/3368122091 我设置了三线表格式,可以直接套用。 这块学习先到此为止,7月4号…

新闻发布及管理系统-计算机毕业设计源码21929

新闻发布及管理系统的设计与实现 摘 要 新闻发布及管理系统的设计与实现,是当下信息社会发展的重要一环。随着互联网的普及和新闻媒体的数字化转型,一个高效、稳定且功能全面的新闻发布与管理平台显得尤为重要。SpringBoot框架以其简洁、快速和易于集成的…

什么是声明式编程?发展趋势怎么样的?

一、什么是声明式编程? 声明式编程(Declarative programming)是一种编程范式,与命令式编程相对立。它主要描述目标的性质,让计算机明白目标,而非具体的执行流程。在声明式编程中,开发者只需声明…

程序员,去哪个城市工作更幸福?

深漂、沪漂、京漂、杭漂……又是一年毕业季,作为CS专业or新手程序员会选择什么城市工作呢?希望这篇文章给各位一些参考。 根据拉勾招聘大数据研究院的数据显示,超六成程序员集中在一线城市,其中北京19%,深圳16%&#x…

程序员自由创业周记#37:程序员创业的几个方向

程序员自由创业周记#37:程序员创业的几个方向 报志愿 这几天亲戚一外甥报志愿,让我推荐,我基于自己的认知觉得还是计算机相关是第一优选,即便现在各大互联网公司都过得不怎么好,裁员的消息此起彼伏,很多计…

UE5 01-给子弹一个跟角色一致的向前的方向的冲量

默认Pawn 负责角色位置, 默认PlayerController 负责记录角色相机旋转

微信全民经纪人活动怎么搭建

在这个信息爆炸的时代,如何借助微信这一拥有数亿用户的社交平台,让每一个普通人都成为我们产品的“经纪人”,共同推动品牌的发展,成为了我们面临的重大课题。今天,我们将为您揭开一场以“全民经纪人”为主题的活动盛宴…

开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D导诊系统源码

开发一套java语言的智能导诊需要什么技术?java springboot mysql IDEA互联网智能3D导诊系统源码 医院导诊系统是一种基于互联网和3D人体的智能化服务系统,旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资;智慧…

google::protobuf命名空间下常用的C++ API----message.h

#include <google/protobuf/message.h> namespace google::protobuf 假设您有一个消息定义为: message Foo {optional string text 1;repeated int32 numbers 2; } 然后&#xff0c;如果你使用 protocol编译器从上面的定义生成一个类&#xff0c;你可以这样使用它: …

跳妹儿学编程之ScratchJr(7):动作积木篇—爸爸去散步

引言 在之前的文章中&#xff0c;我们共同踏出了使用ScratchJr编程的第一步。现在&#xff0c;我们对ScratchJr已经有了初步的认识。今天&#xff0c;我们将正式启程&#xff0c;深入探索ScratchJr的编程世界。我们将逐一学习并实践每一种类型的指令&#xff08;积木块&#x…

基于uniapp(Vue3)自定义开发云闪付小程序

云闪付小程没有类似微信或支付宝小程序那样自己的框架&#xff0c;本质是开发一个H5&#xff0c;部署到自己的服务器上&#xff0c;然后在云闪付小程序平台配置首页链接。开发的H5要保证能使用官方的SDK和组件库。 项目基础配置 将以下代码配置入package.json "uni-app…

Navicat Premium16 解锁版安装教程,亲测可用!

前言 “Navicat”是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库。Navicat 的功能足以符合专业开发人员的所有需求&#xff0c…

Spring 泛型依赖注入

Spring 泛型依赖注入&#xff0c;是利用泛型的优点对代码时行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改&#xff0c;同时在不增加代码的情况下增加代码的复用性。 示例代码&#xff1a; 创建实体类 Product package test.spri…

2024年APMCP亚太杯中文赛B题完整解析 | 代码与论文分享

B题 洪水灾害的数据分析与预测 解题思路问题一问题二问题三问题四 论文问题一2.1 Kolmogorov-Smirnov分布检验模型的建立与求解2.2 基于斯皮尔曼相关系数的相关性检验 代码问题一Q1_1.mQ1_2.mQ1_3.m &#xff08;后续资料更新 关注公众号 云顶数模 领取相关资料&#xff09; 解…

Twitter API接口教程编程指南!如何使用?

Twitter API接口教程怎么用&#xff1f;如何高效利用API接口发信&#xff1f; 无论是为了分析趋势、构建自动化工具&#xff0c;还是开发社交媒体应用&#xff0c;掌握Twitter API接口是至关重要的。AokSend将详细介绍Twitter API接口教程的相关内容&#xff0c;帮助您快速上手…