YOLO V7网络实现细节(2)—网络整体架构总结

YOLO V7网络整体架构总结

YOLO v7网络架构的整体介绍

不同GPU和对应模型:

  • ​​​​​​​边缘GPU:YOLOv7-tiny
  • 普通GPU:YOLOv7​​​​​​​
  • 云GPU的基本模型: YOLOv7-W6

激活函数:

  • YOLOv7 tiny: leaky ReLU
  • 其他模型:SiLU

同时,我们还针对不同的业务需求,使用基础模型进行模型缩放,得到不同类型的模型。 对于YOLOv7,我们对颈部进行stack scaling,并使用提出的复合缩放方法对整个模型的深度和宽度进行缩放,并以此获得YOLOv7-X。

  • YOLOv7缩放得到了YOLOv7-X
  • 对YOLOv7-W6我们使用新提出的复合缩放方法得到 YOLOv7-E6YOLOv7-D6
  • EELAN 用于 YOLOv7-E6,从而完成了 YOLOv7E6E

模型缩放模块

复合的模型缩放策略是YOLO v7中提出的一个核心的创新点之一。其中的缩放倍数包括了1.25倍和1.5倍

基础模块YOLOv7

在这里插入图片描述

首先论文中和Yolov7.yaml文件中使用到的基础模块是ELAN模块对应的结构图如下所示。

在这里插入图片描述
同时在Yolov7.yaml文件中的head部分我们使用了另外的一个基础模块ELAN’模块它是对ELAN模块进行模型变形处理得到了,ELAN’模块对应yolov7配置文件中的56到63层的信息。

之前的4个卷积组成了2个分路ELAN’可以看作是ELAN的变形,即4个卷积组成了4个分路

在这里插入图片描述

YOLOV7X模块

在这里插入图片描述

我们在这里先提前的进行总结和说明yolov7和yolov7x模型之间的差别点。首先yolov7x是在YOLOv7的基础上经过缩放得到的用于普通GPU的网络结构。

  1. 将yolov7中的所有ELAN和ELAN’模块全部替换为了ELAN+模块
  2. 将最后的三个repconv替换为了三个普通的Conv
  3. 所有通道数变为原来的1.25倍

ELAN+模块即将ELAN模块缩放1.25倍得到的结构。在原来的基础上多加了两个卷积层,通道数扩充为原来的1.25倍

在这里插入图片描述

YOLOv7w6模块

yolov7w6模块也可以看作是一个用于云GPU的基础模块,其他的云GPU使用的模型是在YOLOv7w6的基础上经过模型缩放改进的。

在这里插入图片描述

首先说明YOLOv7w6模型和YOLOv7模型的主要区别

  1. yolov7w6模型的预测特征层有4个多了一个10x10的预测特征层来进行预测。
  2. 使用3x3步长为2的普通卷积来替代yolov7模型中的MP1模块
  3. 使用3x3步长为2的普通卷积加上一个concat层来替代head中的MP2模块。
  4. 前两层的卷积被替换为了一个ReOrg模块
ReOrg模块

ReOrg模块可以简单的看作参考了YOLOV56.0版本中的focus模块,在common.py中的源代码如下所示。

class ReOrg(nn.Module):
    def __init__(self):
        super(ReOrg, self).__init__()

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        return torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)

作用每隔一个位置对输入图片的像素值进行抽取操作。将通道数扩展为四倍对应4c,宽高缩短为原来的一半。

在这里插入图片描述

YOLOV7e6模块

YOLOV7e6的网络结构也是一个用在云GPU上的网络结构,是在YOLOv7w6的基础上经过缩放得到的网络结构。

在这里插入图片描述

  1. 在w6网络模型的基础上进行缩放得到对应的网络结构将ELAN替换为ELAN+ 将ELAN’替换为了ELAN’+
  2. 将普通的卷积替换为了Downc这种固定的结构
ELAN’+

ELAN’+在ELAN’的基础上进行模型的缩放缩放倍数为1.25倍,输出的通道数也变为原来的1.25倍。

在这里插入图片描述

Downc模块
class DownC(nn.Module):
    # Spatial pyramid pooling layer used in YOLOv3-SPP
    def __init__(self, c1, c2, n=1, k=2):
        super(DownC, self).__init__()
        c_ = int(c1)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2//2, 3, k)
        self.cv3 = Conv(c1, c2//2, 1, 1)
        self.mp = nn.MaxPool2d(kernel_size=k, stride=k)

通过源代码可以看出Downc模块和之前的MP1模块结构上基本上是完全相同的,只有通道数有一些差异。1x1部分不改变通道数,输出结构的通道数翻倍

在这里插入图片描述

Yolov7d6模块

Yolov7d6模块是在YOLOV7e6模块的基础上再次进行缩放得到的结构,缩放的倍数达到了1.5倍。

在这里插入图片描述

整个模型及结构和之前的YOLOe6结构的主要的区别就在于将之前的ELAN+和ELAN’+模块进行进一步的模型缩放,得到了ELAN++和ELAN’++模块

本质上也就是在拓展一次得到最终的结果。

ELAN++和ELAN’++模块

在这里插入图片描述

YOLO V7e6e模块

YOLO V7e6e模块,顾名思义就是将YOLO V7e6模块中的所有ELAN相关的部分替换为了E-ELAN相关的元素组合。

在这里插入图片描述

YOLOv7tiny模块

YOLOv7tiny模块是YOLOv7向下进行缩放所得到的模块。整个模块使用的激活函数改为了使用LeakyReLU激活函数来进行实现。

在这里插入图片描述

  1. 直接使用了一个2x2的最大池化层来替代原来的MP1模块
  2. 使用了简化的模块ELAN’-
  3. 将MP2模块改为了使用普通的卷积在加一个concat拼接层
  4. 三个重参数化卷积替换为了conv
ELAN’-模块

ELAN’模块向下来进行缩放,减少两个输入的通道,来简化整个模型,整个模型全部使用的是ELAN’-

在这里插入图片描述

SPPCSPC-tiny

在边缘GPU网络中在head部分对SPPCSP模块也进行了一部分的简化操作
对应的是29到37层

[-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-2, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, SP, [5]],
   [-2, 1, SP, [9]],
   [-3, 1, SP, [13]],
   [[-1, -2, -3, -4], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [[-1, -7], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],  # 37

SP部分就可以看作是一个3x3步长为1的maxpooling层,通过padding填充使得大小保持不变。

class SP(nn.Module):
    def __init__(self, k=3, s=1):
        super(SP, self).__init__()
        self.m = nn.MaxPool2d(kernel_size=k, stride=s, padding=k // 2)

    def forward(self, x):
        return self.m(x)

在这里插入图片描述

在最后的训练用的模块中会在中间的部分加入一些辅助头,用来实现之前提到过的深度监督的相关功能。

正负样本匹配的SimOTA

SimOTA是由OTA(OptimalTransportAssignment)简化得到的,OTA也是旷视科技同年出的一篇文章,论文名称叫做《Optimal transport assignment for object detection》目的是将匹配正负样本的过程看成一个最优传输问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案,它被广泛应用于煤码头自动化翻堆及取料集控系统中,以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述: 格雷母线系统的工作原理基于电磁…

有趣的算法

目录: 1、百钱买百鸡 2、韩信点兵 1)概述 2)正常取余算法 3)循环算法 1、百钱买百鸡 我国古代《算经》中的“百钱买百鸡”问题: 鸡翁一,值钱五;鸡母一,值钱三;鸡…

机器学习第四十六周周报 FMP

文章目录 week46 FMP摘要Abstract1. 题目2. Abstract3. FMP3.1 优化框架3.2 优化器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现1. FMP2. fairGNN小结参考文献 week46 FMP 摘要 本周阅读了题为Chasing Fairness in Graphs: A GNN Architecture Per…

初识java—jdk17的一些新增特性

文章目录 前言一 : yield关键字二 :var关键字三 :密封类四 :空指针异常:五:接口中的私有方法:六:instanceof关键字 前言 这里介绍jdk17相对于jdk1.8的部分新增特性。 一 &#xff…

Spring Boot的无缝衔接:深入解析与实践

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 🚀The begin🚗点点关注,收藏不迷路🚩 引言 在快速迭代的软件开发环境中,无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boo…

STM32芯片系列与产品后缀解读

一. 产品系列 STM32单片机是一系列基于ARM Cortex-M内核的32位微控制器,广泛应用于嵌入式系统中。 STM32系列由STMicroelectronics(意法半导体)开发和生产,并凭借其灵活的设计、丰富的外设和强大的生态系统,成为嵌入式…

LLM - 卷积神经网络(CNN)

1. 卷积神经网络结构:分为输入层,卷积层,池化层,全连接层; (1)首先进入输入层,对数据数据进行处理,将输入数据向量化处理,最终形成输入矩阵。 (…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

📚 当谈到虚函数时,通常是指在面向对象编程中的一种机制,它允许在派生类中重写基类的函数,并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 🔥 虚函数 🔥 纯虚函数 🔥 两者区别…

用 Echarts 画折线图

https://andi.cn/page/621503.html

leetcode每日一题-3033. 修改矩阵

题目描述: 解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-1替换为最大值。需要注意的是进行列遍历和行遍历是不同的。 官方题解: class Solution { public:v…

VRay渲染有什么技巧?渲染100邀请码1a12

渲染是视觉行业非常重要的一环,没有渲染就没有效果图,常用的渲染器有Vray,而Vray渲染有很多技巧,可以让渲染更快更省,下面我们总结下。 1、删除无用对象 检查场景,看是否有一些不需要渲染的物体和灯光&am…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接: https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中,多智能体合作问题因原始感官观察、高昂…

绝区肆--2024 年AI安全状况

前言 随着人工智能系统变得越来越强大和普及,与之相关的安全问题也越来越多。让我们来看看 2024 年人工智能安全的现状——评估威胁、分析漏洞、审查有前景的防御策略,并推测这一关键领域的未来可能如何。 主要的人工智能安全威胁 人工智能系统和应用程…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项&#xff1a;注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

Blender新手入门笔记收容所(一)

基础篇 基础操作 视角的控制 控制观察视角&#xff1a;鼠标中键平移视图&#xff1a;Shift鼠标中键缩放视图&#xff1a;滚动鼠标中键滚轮 选中物体后&#xff1a;移动物体快捷键G&#xff0c;移动后单击鼠标就会定下来。 进入移动状态后&#xff1a;按Y会沿着Y轴移动进入移动…

成人高考本科何时报名-深职训学校帮您规划学习之路

你有想过继续深造自己的学历吗&#xff1f;也许你已经工作多年&#xff0c;但总觉得学历是一块心病&#xff0c;想要通过成人高考本科来提升自己。不用着急&#xff0c;今天我们来聊一聊成人高考本科的报名时间&#xff0c;以及深职训学校如何帮助你顺利完成报名。 深圳成人高…

2024上半年网络工程师考试《应用技术》试题一

阅读以下说明&#xff0c;回答问题。 【说明】 MPLS基于(1)进行转发&#xff0c;进行MPLS标签交换和报文转发的网络设备称为(2)&#xff0c;构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时&#xf…

文件管理下:文件函数的学习

前言 Hello,小伙伴们你们的作者君又来了&#xff0c;上次我们简单介绍了文件的坐拥并简单提到了数据的读取&#xff0c;和C语言的默认流的作用&#xff0c;今天我将继续带领大家探索文件的奥秘&#xff0c;大家准别好了吗&#xff1f; 在内容开始之前还是按照惯例&#xff0c…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…