清晰、幽默、轻松地深入理解YOLOv5网络结构和一些细节(查阅无数资料文献总结)

2023-11-15

最近的一篇关于YOLOv5检测小目标博客的点击量很高,没想到YOLOv5还是很有影响力的。既然这样,今天本人就本着幽默、清晰、轻松的风格带大家深入了解一下YOLOv5那倾倒众生的网络结构,和它较之其他算法的改进之处。还是一句话,希望我的不经意之谈能够帮助到各位,如果感兴趣可以收藏一下,有任何问题欢迎下方评论,我会倾尽全力解答的呦!

1.YOLOv5简介

YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:

输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;
基准网络:融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构;
Neck网络:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov5中添加了FPN+PAN结构;
Head输出层:输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms。

在Github上,大神已经更新了YOLOv5的6.0版本,其中主要是将SPP结构改成了串行结构,而且进过一顿的测试实验操作,证明了无论是从参数量的减少上还是FLOPS等指标上均有显著的提升。

本人认为,,技术,尤其是这日新月异的人工智能领域,当然是要学习最新的技术了。(ps:最近在忙着下一篇论文,时常感觉到新技术太多了,学不过来了,时刻都在进步,所以各位要趁着年轻多学习哦!)

2.YOLOv5的网络结构(个人绘制,如有转载,还请声明,铁粉除外哈哈)

3.一些需要强调的基本细节知识(跟紧学习的脚步,马上讲完了)

 YoloV5所使用的主干特征提取网络为CSPDarknet,它具有五个重要特点:
3.1、使用了残差网络Residual,CSPDarknet中的残差卷积可以分为两个部分,主干部分是一次1X1的卷积和一次3X3的卷积;残差边部分不做任何处理,直接将主干的输入与输出结合。整个YoloV5的主干部分都由残差卷积构成.

残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

def Bottleneck(x, out_channels, shortcut=True, name = ""):
    y = compose(
            DarknetConv2D_BN_SiLU(out_channels, (1, 1), name = name + '.cv1'),
            DarknetConv2D_BN_SiLU(out_channels, (3, 3), name = name + '.cv2'))(x)
    if shortcut:
        y = Add()([x, y])
    return y

3.2、使用CSPnet网络结构,CSPnet结构并不算复杂,就是将原来的残差块的堆叠进行了一个拆分,拆成左右两部分:主干部分继续进行原来的残差块的堆叠;另一部分则像一个残差边一样,经过少量处理直接连接到最后。因此可以认为CSP中存在一个大的残差边。

def C3(x, num_filters, num_blocks, shortcut=True, expansion=0.5, name=""):
    hidden_channels = int(num_filters * expansion)  # hidden channels 
    x_1 = DarknetConv2D_BN_SiLU(hidden_channels, (1, 1), name = name + '.cv1')(x) 
    x_2 = DarknetConv2D_BN_SiLU(hidden_channels, (1, 1), name = name + '.cv2')(x)
    for i in range(num_blocks):
        x_1 = Bottleneck(x_1, hidden_channels, shortcut=shortcut, name = name + '.m.' + str(i))  
    route = Concatenate()([x_1, x_2])
    return DarknetConv2D_BN_SiLU(num_filters, (1, 1), name = name + '.cv3')(route)


3.3、使用了Focus网络结构,这个网络结构是在YoloV5里面使用到比较有趣的网络结构,具体操作是在一张图片中每隔一个像素拿到一个值,这个时候获得了四个独立的特征层,然后将四个独立的特征层进行堆叠,此时宽高信息就集中到了通道信息,输入通道扩充了四倍。拼接起来的特征层相对于原先的三通道变成了十二个通道.

class Focus(Layer):
    def __init__(self):
        super(Focus, self).__init__()

    def compute_output_shape(self, input_shape):
        return (input_shape[0], input_shape[1] // 2 if input_shape[1] != None else input_shape[1], input_shape[2] // 2 if input_shape[2] != None else input_shape[2], input_shape[3] * 4)

    def call(self, x):
        return tf.concat(
            [x[...,  ::2,  ::2, :],
             x[..., 1::2,  ::2, :],
             x[...,  ::2, 1::2, :],
             x[..., 1::2, 1::2, :]],
             axis=-1
        )


3.4、使用了SiLU激活函数,SiLU是Sigmoid和ReLU的改进版。SiLU具备无上界有下界、平滑、非单调的特性。SiLU在深层模型上的效果优于 ReLU。可以看做是平滑的ReLU激活函数。

class SiLU(Layer):
    def __init__(self, **kwargs):
        super(SiLU, self).__init__(**kwargs)
        self.supports_masking = True

    def call(self, inputs):
        return inputs * K.sigmoid(inputs)

    def get_config(self):
        config = super(SiLU, self).get_config()
        return config

    def compute_output_shape(self, input_shape):
        return input_shape

3.5、使用了SPP结构,通过不同池化核大小的最大池化进行特征提取,提高网络的感受野。在YoloV4中,SPP是用在FPN里面的,在YoloV5中,SPP模块被用在了主干特征提取网络中.

def SPPBottleneck(x, out_channels, name = ""):
    x = DarknetConv2D_BN_SiLU(out_channels // 2, (1, 1), name = name + '.cv1')(x)
    maxpool1 = MaxPooling2D(pool_size=(5, 5), strides=(1, 1), padding='same')(x)
    maxpool2 = MaxPooling2D(pool_size=(9, 9), strides=(1, 1), padding='same')(x)
    maxpool3 = MaxPooling2D(pool_size=(13, 13), strides=(1, 1), padding='same')(x)
    x = Concatenate()([x, maxpool1, maxpool2, maxpool3])
    x = DarknetConv2D_BN_SiLU(out_channels, (1, 1), name = name + '.cv2')(x)
    return x

4.在小目标领域内的应用及原理

之前介绍过,可以参考我这篇文章,里面主要介绍了两种常用简单的思想以及他们代码。

(37条消息) yolov5小目标检测-提高检测小目标的检测精度_Hack Hui的博客-CSDN博客_yolov5小目标检测https://blog.csdn.net/m0_58508552/article/details/124204882?spm=1001.2014.3001.5501       首先我们先明白一个事儿,啥叫小目标。人生三连问:怎么小,哪里小,为啥小。说白了啊,所谓小目标就是由于其自身的尺寸小,再加上采集的时候导致目标像素太小,一般认为20×20--40×40像素都可以认为是小目标。

        那么咋办呢?问的好,再介绍个方法,在YOLOV5中有个锚框的定义,问题又来了,锚框是什么。所谓锚框就是网络能把目标物体圈出来的框框,这里又有两种方法。一种是在我上面链接里的文章写的自己根据自己的数据集去人为地规定好锚框大小,这需要你有耐心,一点点去改锚框尺寸大小以适应你自己的数据集。注意三个锚框从上到下分别为检测大、中、小目标的,至于为啥,一般都懂,不懂在下方评论问我吧。那么好,第二种就是在letterbox.py里面的自适应计算锚框了,他是根据遗传算法进行1000次的迭代更新找到最适合的锚框的。同样如果遗传算法也不懂,那你下方评论问我(放弃程序员吧)哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

清晰、幽默、轻松地深入理解YOLOv5网络结构和一些细节(查阅无数资料文献总结) 的相关文章

随机推荐

  • 杨辉三角形(c++题解)

    问题描述 打印出杨辉三角的前N行 N lt 50 输入格式 一个数字N 输出格式 杨辉三角形的前N行 样例输入 5 样例输出 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 提示 结果会超过int的范围 建议用long long
  • GB9706.1-2007+2020和IEC60601-1:2005 Ed3.0第三版+2012 Ed3.1新三版标准主要差异解析

    链接 https pan baidu com s 1m9Ir7fG6EP8WH6rd DdS4Q 提取码 abc1 复制这段内容后打开百度网盘手机App 操作更方便哦 国际标准IEC版本和国家标准GB版本对应关系 国际标准IEC 国家标准
  • mybatis批量更新

  • 创新工场笔试题----有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

    题目 有1分 2分 5分 10分四种硬币 每种硬币数量无限 给定n分钱 求有多少种组合可以组合成n分钱 代码如下 void Combination int a int index int n vector
  • 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position问题

    原文地址 http blog sina com cn s blog 64a3795a01018vyp html 解决方法1 在开头加上 import sys reload sys sys setdefaultencoding utf 8 解
  • Jetpack学习之LiveData

    LiveData是一个可被观察的数据容器类 它是一个数据的容器 将数据包装起来 使数据成为被观察者 当该数据发生变化时 观察者能够获得通知 和ViewModel的关系 ViewModel用于存放页面所需的各种数据 以及数据相关的业务逻辑 因
  • sc 不是内部或外部命令

    安装nodejs 或yarn后 发现控制台命令会提示 sc 不是内部或外部命令 问题原因 nodejs或yarn安装后 会把系统默认环境变量Path的值给替换了 解决方案 将系统环境变量Path的值后面加上 SystemRoot syste
  • java superclass_java Class的 getSuperclass与getGenericSuperclass区别

    Class的getInterfaces与getGenericInterface区别 http www cnblogs com maokun p 6773076 html 一 getSuperclass 返回直接继承的父类 由于编译擦除 没有
  • 【好题】第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 F-第二大数 思维

    题 求各个范围的第二大数 举个例子 4 9 6 4 5 6 4 4 6 5 6 第二大数分别是 6 4 4 6 5 6 我们的做法就是按照题目顺序 i从1开始 j从i 1开始 每次记录当前最大数和第二大数 对于每次新出现的数a j 如果它大
  • 二维动态规划>>01背包问题与普遍应用

    0 内容梗概 在二维动态规划中 01背包问题是动态规划中的经典问题 本文首先学习 总结01背包问题的思路 方法与实现 之后 01背包问题与其说是问题 更可以是一种解题思路 或者说套路 如果遇到别的题目时 能够清楚地判断出它是一个01背包的类
  • 【Metashape精品教程2】创建工程

    Metashape精品教程2 创建工程 文章目录 Metashape精品教程2 创建工程 前言 一 导入照片 二 导入pos 三 设置相机参数 没有可不设置 让软件反算相机参数 四 导入控制点 五 保存工程 前言 本章内容主要讲解工程的创建
  • statsmodels中的summary解读(OLS)

    Dep varible y 输出y变量的名称 Model OLS 使用的参数确定的模型OLS Method Least Squares 使用最小二乘法确定参数 Date Sat 10 Aug 2019 日期 Time 18 10 04 时间
  • 什么是Spring Cloud Config

    Spring Cloud Config 是一个解决分布式系统的配置管理方案 它包含 Client和 Server 两个部分 Server 提供配置文件的存储 以接口的形式将配置文件的内容提供出去 Client 通过接口获取数据 并依据此数据
  • 艺术+DeFi,看MEME如何玩转NFT

    内容概述 MEME代币已经成功登陆加密货币交易所Poloniex 就在成功上市之后 MEME代币价格一度飙升至1800美元高位 MEME协议允许人们赚取 菠萝积分 并将其兑换为NFT代币 9月22日 加密货币交易所Poloniex在其DeF
  • 机器学习阶段总结一

    最近一直在看机器学习相关内容 主要是看的斯坦福的Andrew Ng教授的公开课视频 可以点这里 看了前四讲 最大的感觉就是这简直就是概率论 线代 用到的数学知识着实不少 不过也挺有趣的 继续学下去 初步总结一下 主要是关于监督学习 回归分类
  • Redis学习:Redis的持久化

    Redis的持久化方式有两种 rdb和aof rdb理解为快照 save规则出发会的得到一个快照 aof是追加的形式 可以理解为binlog那种 RDB 在进行 RDB 的时候 redis 的主线程是不会做 io 操作的 主线程会 fork
  • 独门秘籍奉上!听说这是CCF遥感地块分割比赛冠军的“获胜法宝”!

    飞桨开发者说 黎昆昌 CCF BDCI遥感影像地块分割赛道冠军团队 CCF BDCI 2020 综合特等奖团队队长 中国科学院深圳先进技术研究院20级硕士 CCF大数据与计算智能大赛 CCF BCI 由中国计算机学会于2013年创办 作为全
  • Nginx配置不缓存html

    Nginx配置不缓存html 1 配置nginx不缓存html 1 1 修改配置文件 1 2 验证 2 Vue项目修改根目录index html 1 配置nginx不缓存html 1 1 修改配置文件 location expires 1h
  • 有特别有创意的网站设计案例

    有人说 UI 设计师集艺术性与科学性于一身 不仅需要对工具的使用熟练 更需要对美术艺术有一定的基础了解 如果想要成为优秀的 UI 设计师是一个需要磨砺的过程 需要不断的学习和积累 多看多练多感受 其中对于优质的设计案例的收集和练习是重要的
  • 清晰、幽默、轻松地深入理解YOLOv5网络结构和一些细节(查阅无数资料文献总结)

    最近的一篇关于YOLOv5检测小目标博客的点击量很高 没想到YOLOv5还是很有影响力的 既然这样 今天本人就本着幽默 清晰 轻松的风格带大家深入了解一下YOLOv5那倾倒众生的网络结构 和它较之其他算法的改进之处 还是一句话 希望我的不经