极本穷源:YOLO篇Ⅱ

本文最后更新于:2022年2月15日 上午

极本穷源:YOLO篇Ⅱ

  • 上篇中我们提到了yolo的大概属性,今天接着总结一下yolo是基于什么样的背景发展而来。
  • YOLO是如何实现目标的识别检测?
  • 首先YOLO由多层网络组成以YOLOv3为例:

  • 结构组成卷积层+池化层+激活函数+全连接层
    • 卷积层
      • 卷积层由一组滤波器组成输入图像与滤波器进行卷积产生输出图像
        (16 条消息) 如何理解卷积神经网络(CNN)中的卷积和池化? - 知乎 (zhihu.com)
        • 卷积核(filters)和滤波器(kernels)的区别
          科普-深度学习中的卷积-卷积核和滤波器的区别 - 重大的小鸿 - 博客园 (cnblogs.com)
          • filter和kernel之间的不同很微妙。很多时候,它们可以互换,所以这可能造成我们的混淆。那它们之间的不同在于哪里呢?一个”kernel”更倾向于是2D的权重矩阵。而’filter”则是指多个Kernel堆叠的3D结构。如果是一个2D的filter,那么两者就是一样的。但是一个3Dfilter, 在大多数深度学习的卷积中,它是包含kernel的。每个卷积核都是独一无二的,主要在于强调输入通道的不同方面
      • 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性.因为经过池化后,得到的是 概要统计特征 。它们不仅 具有低得多的维度 (相比使用所有提取得到的特征),同时还会 改善结果(不容易过拟合)
    • 池化层
      • 池化层目的是进行特征选择,图像经过卷积提取的特征图会产生很多冗余特征,主要采用平均池化和最大池化。
      • 下采样和池化应该是包含关系,池化属于下采样,而下采样不局限于池化,如果卷积 stride=2,此时也可以把这种卷积叫做下采样
        • 下采样和池化的区别
          • 池化 = 涨水
          • 池化的过程 = 升高水位(扩大矩阵网格)
          • 池化的目的是为了得到物体的边缘形状
          • 可以想象水要了解山立体的形状,水位低时得出山脚的形状,水位中等时得出山腰的形状,水位高时得出山顶的形状,三点就可以大致描出山的简笔画
          • 而卷积的过程是区分哪里是水,哪里是山
          • 对于网络结构而言,上面的层看下面的层经过 pooling 后传上来的特征图,就好像在太空上俯瞰地球,看到的只有山脊和雪峰。这即是对特征进行宏观上的进一步抽象
    • 激活函数
    • 全连接层
      • 全连接层将学到的“分布式特征表示”映射到样本标记空间
      • 假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了,全连接层就是这个蚂蚁大会。
  • yolo基础知识

    • 概念解释:
      • 训练神经网络:Batch、Epoch和Iteration
        • Batch(批 / 一批样本):将整个训练样本分成若干个Batch。
        • Batch_Size(批大小):每批样本的大小。
        • Iteration(一次迭代):训练一个Batch就是一次Iteration(这个概念跟程序语言中的迭代器相似)
        • Epoch(时期):当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次>epoch。(也就是说,所有训练样本在神经网络中都 进行了一次正向传播 和一次反向传播 )再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。
          • 随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。
          • 那么,问题来了,几个epoch才是合适的呢?
          • 不幸的是,这个问题并没有正确的答案。对于不同的数据集,答案是不一样的。但是数据的多样性会影响合适的epoch的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。
      • 梯度下降算法原理讲解——机器学习
        • 梯度是微积分中一个很重要的概念,之前提到过梯度的意义
        • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
        • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
        • 这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点
      • 学习率
        • 学习率越低,损失函数的变化速度就越慢,容易过拟合。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在局部最优点的时候。而学习率过高容易发生梯度爆炸,loss振动幅度较大,模型难以收敛。下图是不同学习率的loss变化,因此,选择一个合适的学习率是十分重要的。
      • 通道channel、特征图feature map、过滤器filter和卷积核kernel
      • BN)批量归一化全面解析,backbone:主干网络.head:head是获取网络输出内容的网络,neck:是放在backbone和head之间的,是为了更好的利用backbone提取的特征.GAP:Global Average Pool全局平均池化(AP)平均预测
      • 上采样,下采样 《图像的上采样(upsampling)与下采样(subsampled)》 https://blog.csdn.net/stf1065716904/article/details/78450997?utm_source=app&app_version=4.17.2&code=app_1562916241&uLinkId=usr1mkqgl919blen
        • 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
        • 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。
        • 对图像的缩放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量的。
      • Anchor Boxes机制
        • 论文学习 FoveaBox: Beyond Anchor-based Object Detector_何以解忧唯有杜康的博客-CSDN博客_foveabox
        • YOLO会将输入的图片分成S*S个网格,每个小网格会生成n个anchor Box。图像的真实框会和图像中心点所在的小网格生成的anchor box做IOU计算。回归出来的框就是Bounding Box(也就是网络输出的框,他与真实框和anchor Box都有差距)
        • 通过引入anchor box,一方面,模型学习到的是物体真实边框与对应的anchor box的偏移量,而不是目标物体在图像中的绝对坐标,保证了检测任务的平移不变性;另一方面,通过这种对齐,可以使模型对多尺度物体检测的训练变得容易,因为物体边框对相应anchor box的偏移量的值分布于有限范围内。
  • 讲这么多直接上操作感受下吧,打开YOLOv4-Tiny的.cfg文件

  • NMS调参
    • 288.cfg
      • ignore_thresh = .7
      • beta_nms=0.7
      • result
    • 288.cfg
      • ignore_thresh = .7
      • beta_nms=0.8
      • result
    • 416.cfg
      • ignore_thresh = .7
      • beta_nms=0.7
      • result
    • 416.cfg
      • ignore_thresh = .7
      • beta_nms=0.5
      • result