极本穷源:YOLO篇Ⅱ
本文最后更新于:2022年2月15日 上午
极本穷源:YOLO篇Ⅱ
- 上篇中我们提到了yolo的大概属性,今天接着总结一下yolo是基于什么样的背景发展而来。
- YOLO是如何实现目标的识别检测?
首先YOLO由多层网络组成以YOLOv3为例:
- yolov3
- yolov3.cfg
- yolov3
- 结构组成卷积层+池化层+激活函数+全连接层
- 卷积层
- 卷积层由一组滤波器组成输入图像与滤波器进行卷积产生输出图像
- 卷积核(filters)和滤波器(kernels)的区别
- filter和kernel之间的不同很微妙。很多时候,它们可以互换,所以这可能造成我们的混淆。那它们之间的不同在于哪里呢?一个”kernel”更倾向于是2D的权重矩阵。而’filter”则是指多个Kernel堆叠的3D结构。如果是一个2D的filter,那么两者就是一样的。但是一个3Dfilter, 在大多数深度学习的卷积中,它是包含kernel的。每个卷积核都是独一无二的,主要在于强调输入通道的不同方面
- 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性.因为经过池化后,得到的是 概要统计特征 。它们不仅 具有低得多的维度 (相比使用所有提取得到的特征),同时还会 改善结果(不容易过拟合)
- 卷积层由一组滤波器组成输入图像与滤波器进行卷积产生输出图像
- 池化层
- 池化层目的是进行特征选择,图像经过卷积提取的特征图会产生很多冗余特征,主要采用平均池化和最大池化。
- 下采样和池化应该是包含关系,池化属于下采样,而下采样不局限于池化,如果卷积 stride=2,此时也可以把这种卷积叫做下采样
- 下采样和池化的区别
- 池化 = 涨水
- 池化的过程 = 升高水位(扩大矩阵网格)
- 池化的目的是为了得到物体的边缘形状
- 可以想象水要了解山立体的形状,水位低时得出山脚的形状,水位中等时得出山腰的形状,水位高时得出山顶的形状,三点就可以大致描出山的简笔画
- 而卷积的过程是区分哪里是水,哪里是山
- 对于网络结构而言,上面的层看下面的层经过 pooling 后传上来的特征图,就好像在太空上俯瞰地球,看到的只有山脊和雪峰。这即是对特征进行宏观上的进一步抽象
- 下采样和池化的区别
- 激活函数
- 激活函数是啥?(Sigmoid函数、tanh函数、Relu函数) (2条消息) 神经网络之激活函数_August-us的博客-CSDN博客_神经网络激活函数 (1条消息) 激活函数的作用_atarik@163.com-CSDN博客_激活函数的作用 (1条消息) 常用激活函数(激励函数)理解与总结_tyhj_sf的博客空间-CSDN博客_激活函数
- 在YOLOv3中,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU。而在YOLOv4的主干网络CSPDarknet53中,使用Mish代替了原来的Leaky ReLU。Leaky ReLU和Mish激活函数的公式与图像如下:
- Softmax
- Softmax 函数不仅可以将输出值映射到[0,1]区间,还满足所有的输出值之和为 1 的特性。如下图的例子,输出层的输出为[2.,1.,0.1],经过 Softmax 函数计算后,得到输出为[0.7,0.2,0.1],可以看到每个值代表了当前样本属于每个类别的概率,概率值之和为 1。
- 通过 Softmax 函数可以将输出层的输出转译为类别概率,在多分类问题中使用的非常频繁
- 另外,在softmax函数多分类问题中,若损失函数选用交叉熵,则下降梯度计算起来将会非常方便,使得网络训练过程中的迭代计算复杂度大大降低。
- 全连接层
- 全连接层将学到的“分布式特征表示”映射到样本标记空间
- 假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了,全连接层就是这个蚂蚁大会。
- 卷积层
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的偏移量的值分布于有限范围内。
- 训练神经网络:Batch、Epoch和Iteration
- 概念解释:
讲这么多直接上操作感受下吧,打开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
- 288.cfg
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!