【过一下14】自习室的一天

记录

今日计划

2022年7月20日10:58:34

我是从 博文的翻译里面去找找重点,然后去百度一下,最后回到作者论文。

所以作者开发YOLOV7目的—

  • 利用第一篇博文来看论文

    前言

    • FPS(每秒传输帧数(Frames Per Second)

      • FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数越多,所显示的动作就会越流畅。通常,要避免动作不流畅的最低是30。某些计算机视频格式,每秒只能提供15帧。
    • GPU V100

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pj7QXRv-1658312679071)(C:\Users\努力学习,不要让自己失望\AppData\Roaming\Typora\typora-user-images\1658286191228.png)]
      • 就是在这上面进行检测性能(应该是这个V100吧)
    • edge device

    • 目标识别里面有专注于GPU的,NPU的,CPU的。作者关注的是GPU

      • GPU/NPU边缘架构: 在本文中,作者提出的实时目标探测器能够更好的支持边缘移动端GPU设备和高算力GPU设备。

      • 如MCUNet和NanoDet,专注于适配低功耗移动端,以提高边缘设备CPU的推理速度。

      • 对于YOLOX和YOLOR等算法,他们专注于提高检测器在GPU上的推理速度。

      • CPU边缘架构: 对于可以在CPU上使用的实时探测器,骨干设计主要基于MobileNet、Shufflenet或Ghostnet。

      • **高算力GPU/NPU:**另一些主流的实时检测器是为GPU开发的,它们主要使用ResNet、DarkNet或DLA,然后借鉴CSPNet中的跨级策略来优化架构。

      • Bag-of-freebies: 除了架构优化外,作者提出的方法还集中在训练过程的优化,以提高检测器的准确性,但不增加推理耗时。作者称所提出的模块和优化方法为可训练的免费礼包(bag-of-freebies)。

    • 模型结构重参化和动态标签分配

      • 既然一组参数和一个结构是一一对应的,我们就可以通过将一组参数转换为另一组参数来将一个结构转换为另一个结构。结构重参数化指的是首先构造一系列结构(一般用于训练),并将其参数等价转换为另一组参数(一般用于推理),从而将这一系列结构等价转换为另一系列结构。[结构重参数化:利用参数转换解耦训练和推理结构 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/361090497)
        
      • 一个dense object detection model 可能有成千上万个anchor,而图片里的target通常只有几个几十个。在训练model的时候,需要匹配target和anchor,告诉网络哪个anchor要去预测哪个target,这个过程就是label assignement。[一文看懂Label Assignment--标签分配最新论文总结 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/395386669)。
        
    • 近年来,模型结构重参化和动态标签分配已成为网络训练和目标检测中的重要优化方向。在本文中,作者提出一些已经发现的问题,例如:

      • 对于模型结构重参化,用梯度传播路径的概念分析了适用于不同网络中各层结构重参化策略,提出了**规划的模型结构重参化**。
        
      • 当使用动态标签分配策略时,多输出层的模型在训练时会产生新的问题,比如怎样才能为不同分支更好的输出分配动态目标。针对这个问题,作者提出了一种新的标签分配方法,称为**coarse-to-fine**(由粗到细)**引导标签分配策略**。
        
    • 贡献

      • 设计了几种可训练的bag-of-freebies,使实时检测器可以在不提高推理成本的情况下大大提高检测精度;
        
      • 对于目标检测的发展,作者发现了两个新的问题,即模块重参化如何高效替代原始模块,以及动态标签分配策略如何处理好不同输出层的分配。因此在本文中提出了方法进行解决。
      • 作者为实时探测器提出了“扩展”和“复合缩放”(extend” and “compound scaling”)方法,可以更加高效地利用参数和计算量,同时,作者提出的方法可以有效地减少实时探测器50%的参数,并且具备更快的推理速度和更高的检测精度。(这个其实和YOLOv5或者Scale YOLOv4的baseline使用不同规格分化成几种模型类似,既可以是width和depth的缩放,也可以是module的缩放)
        在这里插入图片描述

    从第二部分【二、相关工作】

    • 目前最先进的实时探测器主要基于YOLO和FCOS,如果需要研发更先进的实时检测器,通常需要具备以下特征:
      • (1)更快和更高效的网络架构;
      • (2)更有效的特征积分方法;
      • (3)更准确的检测方法;
      • (4)更鲁棒的损失函数;
      • (5)更有效的标签分配方法;
      • (6)更有效的训练方式。
    • 了解到模块级集成和模型级集成两类。
      • 模型级重新参数化有两种常见的操作:
        • 一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。
        • 一种是对不同迭代次数下模型权重进行加权平均。
      • 作者开发了新的重参数化模块,并为各种架构设计了相关的应用程序策略。
    • 模型缩放
      • 调整缩放因子
        • input size(输入图像大小)
        • depth(层数)
        • width(通道数)
        • stage(特征金字塔数量)
      • 利用网络架构搜索(NAS)
        • 类似sklearn里面的网格搜索,但高级的多。
        • NAS算法是一种给定模型结构搜索空间的搜索算法,当然这个搜索空间不可能只有几个参数组合,而搜索算法也不可能通过枚举模型结构分别训练来解决,而需要一种更有效的启发式的搜索算法,这种算法就是后面会提到的贝叶斯优化、增强学习、进化算法等。

    模型设计架构

    • 高效的聚合网络
      • 在大多数关于设计高效网络的论文中,主要考虑的因素是参数量、计算量和计算密度。但从内存访存的角度出发,还可以分析输入/输出信道比、架构的分支数和元素级操作对网络推理速度的影响(shufflenet论文提出)。在执行模型缩放时还需考虑激活函数,即更多地考虑卷积层输出张量中的元素数量。

    到这里 有点蒙了

    感觉把握不了重点

    或者说对于无知的我来说,都是重点


    简易版 YOLOv7速度精度超越其他变体,大神AB发推,网友:还得是你!|开源 - 腾讯云开发者社区-腾讯云 (tencent.com)

    首先,YOLOv7扩展了高效长程注意力网络,称为Extended-ELAN*(简称E-ELAN)*。

    在大规模的ELAN中,无论梯度路径长度和块的数量如何,网络都能达到稳定状态。

    但是如果无限地堆叠计算块,这种稳定状态也可能会被破坏,参数利用率也会降低。

    E-ELAN对基数(Cardinality)做了扩展(Expand)、乱序(Shuffle)、合并(Merge cardinality),能在不破坏原始梯度路径的情况下,提高网络的学习能力。

    在架构方面,E-ELAN只改变了计算块中的体系结构,没有改变过渡层的体系结构。

    img

    除了保持原来ELAN的设计架构外,E-ELAN还可以引导不同的计算块组来学习更多样化的特性。

    而后,YOLOv7采用基于级联的(Concatenation-based)模型缩放方法。

    模型缩放是指调整模型的一些属性,生成不同尺度的模型,以满足不同推理速度的需求。

    然而,模型缩放如果应用于基于连接的架构,当扩大或缩小执行深度时,基于连接的翻译层的计算块将减少或增加。

    由此可以推断,对于基于级联的模型,不能单独分析不同的缩放因子,必须一起考虑。

    基于级联的模型缩放方法是一个复合模型缩放方法,当缩放一个计算块的深度因子时,同时也要计算该块输出通道的变化。

    然后,对过渡层以相同的变化量进行宽度因子缩放,这样就可以保持模型在初始设计时的特性,并保持最优结构。

    img

    在论文研究中,作者还设计了有计划的重新参数化卷积*(Planned re-parameterized convolution)*。

    RepConv在VGG中有比较优异的性能,但当它直接应用于ResNet、DenseNet或者其他架构时,精度会明显降低。

    这是因为RepConv中的直连(Identity connection)破坏了ResNet中的残差和DenseNet中的连接。

    因此,论文研究中使用没有直连的RepConv*(RepConvN)*来设计网络结构。

    img

    在YOLOv7的标签分配机制中,需要同时考虑网络预测结果与基准,然后将软标签*(综合考虑,优化之后的标签)*分配到“label assigner”机制。

    那么接下来,“软标签要分配给auxiliary head还是lead head呢?”

    论文提出了一种新的标签分配法,如下图中的*(d)(e)*,基于lead head预测,生成从粗到细的层次标签,分别用于lead head和auxiliary head的学习。

    图(d)让较浅的auxiliary head学习lead head已经学习到的信息,而输lead head则可以更专注于为学习到的残差信息。

    而e图中,会生成两组软标签,即粗标签和细标签。auxiliary head不如lead head学习能力强,因此要重点优化它的召回率,避免丢失掉需要学习的信息。

    img

    复杂原文版

    四、可训练的赠品礼包(bag-of-freebies)

    4.1 卷积重参化

    尽管RepConv在VGG上取得了优异的性能,但将它直接应用于ResNet和DenseNet或其他网络架构时,它的精度会显著降低。作者使用梯度传播路径来分析不同的重参化模块应该和哪些网络搭配使用。通过分析RepConv与不同架构的组合以及产生的性能,作者发现RepConv中的identity破坏了ResNet中的残差结构和DenseNet中的跨层连接,这为不同的特征图提供了梯度的多样性(题外话,之前在YOLOv5 Lite上做过此类实验,结果也是如此,因此v5Lite-g的模型也是砍掉了identity,但分析不出原因,作者也没给出具体的分析方案,此处蹲坑)。基于上述原因,作者使用没有identity连接的RepConv结构。图4显示了作者在PlainNet和ResNet中使用的“计划型重参化卷积”的一个示例。

    4.2 辅助训练模块

    深度监督是一种常用于训练深度网络的技术,其主要概念是在网络的中间层增加额外的辅助头,以及以辅助损失为指导的浅层网络权重。即使对于像ResNet和DenseNet这样收敛效果好的网络结构,深度监督仍然可以显著提高模型在许多任务上的性能(这个和Nanodet Plus相似,按笔者理解可以当成是深层局部网络的ensemble,最后将辅助头和检测头的权重做融合)。图5(a)和(b)分别显示了“没有”和“有”深度监督的目标检测器架构,在本文中,作者将负责最终的输出头称为引导头,将用于辅助训练的头称为辅助头。

    接下来讨论标签分配的问题。在过去,在深度网络的训练中,标签分配通常直接指的是ground truth,并根据给定的规则生成hard label(未经过softmax)。然而近年来,以目标检测为例,研究者经常利用网络预测的质量分布来结合ground truth,使用一些计算和优化方法来生成可靠的软标签(soft label)。例如,YOLO使用bounding box预测和ground truth的IoU作为软标签。

    在本文中,作者将网络预测结果与ground truth一起考虑后再分配软标签的机制称为“标签分配器”。无论辅助头或引导头,都需要对目标进行深度监督。那么,‘’如何为辅助头和引导头合理分配软标签?”,这是作者需要考虑的问题。目前最常用的方法如图5(c)所示,即将辅助头和引导头分离,然后利用它们各自的预测结果和ground truth执行标签分配。

    本文提出的方法是一种新的标签分配方法,通过引导头的预测来引导辅助头以及自身。换句话说,首先使用引导头的prediction作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习,具体可看图5(d)和(e)。
    Lead head guided label assigner: 引导头引导“标签分配器”预测结果和ground truth进行计算,并通过优化(在utils/loss.py的SigmoidBin()函数中,传送门:https://github.com/WongKinYiu/yolov7/blob/main/utils/loss.py生成软标签。这组软标签将作为辅助头和引导头的目标来训练模型。(之前写过一篇博客,【浅谈计算机视觉中的知识蒸馏】]https://zhuanlan.zhihu.com/p/497067556)详细讲过soft label的好处)这样做的目的是使引导头具有较强的学习能力,由此产生的软标签更能代表源数据与目标之间的分布差异和相关性。此外,作者还可以将这种学习看作是一种广义上的余量学习。通过让较浅的辅助头直接学习引导头已经学习到的信息,引导头能更加专注于尚未学习到的残余信息。

    Coarse-to-fine lead head guided label assigner: Coarse-to-fine引导头使用到了自身的prediction和ground truth来生成软标签,引导标签进行分配。然而,在这个过程中,作者生成了两组不同的软标签,即粗标签和细标签,其中细标签与引导头在标签分配器上生成的软标签相同,粗标签是通过降低正样本分配的约束,允许更多的网格作为正目标(可以看下FastestDet的label assigner,不单单只把gt中心点所在的网格当成候选目标,还把附近的三个也算进行去,增加正样本候选框的数量)。原因是一个辅助头的学习能力并不需要强大的引导头,为了避免丢失信息,作者将专注于优化样本召回的辅助头。对于引导头的输出,可以从查准率中过滤出高精度值的结果作为最终输出。然而,值得注意的是,如果粗标签的附加权重接近细标签的附加权重,则可能会在最终预测时产生错误的先验结果。

    4.3 其他可训练的bag-of-freebies
    1. Batch normalization:目的是在推理阶段将批归一化的均值和方差整合到卷积层的偏差和权重中。
    2. YOLOR中的隐式知识结合卷积特征映射和乘法方式:YOLOR中的隐式知识可以在推理阶段将计算值简化为向量。这个向量可以与前一层或后一层卷积层的偏差和权重相结合。
    3. EMA Model:EMA 是一种在mean teacher中使用的技术,作者使用 EMA 模型作为最终的推理模型。
    • 六、结论
      • 本文提出了一种新的实时检测器。在研究过程中,本文发现了重参化模块的替换问题和动态标签的分配问题。为了解决这一问题,提出了一种可训练的bag-of-freebies策略来提高目标检测的精度。基于此,本文开发的YOLOv7系列目标检测模型获得了最先进的结果。

    意外收获

    以上主要看的:就是 如何评价Alexey Bochkovskiy团队提出的YoloV7? - pogg的回答 - 知乎
    https://www.zhihu.com/question/541985721/answer/2564439662

    从博文的图片上面找到了答主本人,然后扫了一下,答主的知乎动态,找到了另一位对yolov7的解读

    接下来可能看:

    如何评价Alexey Bochkovskiy团队提出的YoloV7? - Cydiachen的回答 - 知乎
    https://www.zhihu.com/question/541985721/answer/2562691635

    扫了一下知乎动态,看一看大佬都在看什么

    《目标检测》-第30章-YOLOv7的网络结构 - Kissrabbit的文章 - 知乎
    https://zhuanlan.zhihu.com/p/541839302

    以及如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2fnZid2-1658312679108)(C:\Users\努力学习,不要让自己失望\AppData\Roaming\Typora\typora-user-images\1658311284426.png)]

    然后瞥到了 flexible-yolov5

    又是找到了个这个教程

    第一卷-目标检测入门科普教程 - 知乎 (zhihu.com)

    看了这个回答

    作为一名偏应用的算法工程师,想要深入学习一个框架的底层,该怎么学习呢? - zzzk的回答 - 知乎
    https://www.zhihu.com/question/477195337/answer/2039470291

    为了努力成为一名 偏应用的算法工程师 我也要好好熟练一个工具

    可以复现的项目:

    从零开始实现yolox四:模型的训练(一)损失函数与标签分配_weixin_44457930的博客-CSDN博客_标签分配策略

    (3 封私信) Cydiachen - 知乎 (zhihu.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值