YOLO学习笔记

135 阅读4分钟

深度学习经典检测方法:

  • Two-stage:Faster-rcnn Mask-Rrcnn
  • One-stage:YOLO系列(通常速度比较快,可以实时,适合做检测任务,但是效果通常不太好)

Yolo常见参数

常用参数:

  1. FPS(Frames Per Second): 表示每秒处理的图像帧数。对于实时目标检测应用,较高的FPS意味着模型能够更快地处理图像,实时性更好。
  2. FLOPs(Floating Point Operations Per Second): 表示每秒浮点运算次数。FLOPs用于衡量模型的计算复杂性,即模型需要执行的浮点运算数量。通常情况下,较低的FLOPs意味着模型更轻量化,更适合在资源有限的环境中运行,例如移动设备或嵌入式系统。
  3. mAP(mean Average Precision): 是目标检测中常用的性能指标之一。它结合了模型的准确性召回率,用于评估模型在不同类别上的检测性能。mAP是Precision-Recall曲线下的面积平均值,其范围通常从0到1,值越高表示模型性能越好。mAP在不同阈值下都能提供一个全面的评估,因为它考虑了不同的阈值对Precision和Recall的影响。

Precision(精确率)和Recall(召回率)

用于衡量分类或目标检测模型性能的两个重要指标。

  • True Positive (TP):模型正确地将正类别样本预测为正类别。
  • False Positive (FP):模型将负类别样本错误地预测为正类别。
  • False Negative (FN):模型将正类别样本错误地预测为负类别。
  • True Negative (TN):模型正确地将负类别样本预测为负类别。
  1. Precision(精确率):

    Precision 表示模型预测为正类别的样本中,有多少是真正的正类别。它的计算公式是:

    Precision = TPTP+FP\frac{TP}{TP + FP}

  2. Recall(召回率/查全率):

    Recall 表示实际正类别样本中,有多少被模型正确地预测为正类别。它的计算公式是:

    Recall = TPTP+FN\frac{TP}{TP + FN}

IOU

image.png

Yolo-v1

YOLO v1的核心思想和关键步骤:

  1. 图像划分为网格: YOLO将输入图像划分为 S×S 个网格单元,其中 S 是一个超参数。每个网格单元负责预测该单元格内是否包含物体以及物体的位置和类别信息。
  2. 每个网格单元的预测: 每个网格单元输出多个预测,每个预测包含以下信息:
  • Bounding box(边界框): 由四个值 x,y,w,h 表示,分别表示边界框的中心坐标和宽度、高度。这些值相对于当前网格单元的大小,取值范围在[0,1]。
  • Confidence score(置信度得分): 表示该边界框中包含物体的概率。 类别概率: 针对每个类别的概率得分。
  1. 损失函数: YOLO v1使用综合的损失函数,包括位置误差(bounding box 的坐标和大小误差)、置信度误差和类别误差。损失函数的计算会考虑不同的权重,以平衡不同部分的贡献。
  2. NMS(非极大值抑制): 为了减少冗余的边界框,YOLO在后处理阶段使用NMS。NMS通过抑制具有低置信度或与更高置信度的边界框重叠较多的边界框,从而提高检测的准确性。

image.png

image.png

损失函数

损失函数=λcoordi=0S2j=0B1ij(obj)[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ij(obj)[(wiw^i)2+(hih^i)2]+i=0S2j=0B1ij(obj)(CiC^i)2+λnoobji=0S2j=0B1ij(noobj)(CiC^i)2+i=0S21i(obj)cclasses(pi(c)p^i(c))2\begin{equation} \begin{split} \text{损失函数} = & \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{(obj)} \left[(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] \\ & + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{(obj)} \left[(\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \\ & + \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{(obj)} \left(C_i - \hat{C}_i\right)^2 \\ & + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{(\text{noobj})} \left(C_i - \hat{C}_i\right)^2 \\ & + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{(obj)} \sum_{c \in \text{classes}} \left(p_i(c) - \hat{p}_i(c)\right)^2 \end{split} \end{equation}
  • SS:划分图像的网格数量。
  • BB:每个网格单元预测的边界框数量。
  • λcoord\lambda_{\text{coord}}:坐标损失的权重。
  • λnoobj\lambda_{\text{noobj}}:不包含物体的置信度损失的权重。
  • 1ijobj\mathbb{1}_{ij}^{obj}:指示函数,表示第 ii 个网格单元的第 jj 个边界框是否包含物体。
  • 1ijnoobj\mathbb{1}_{ij}^{\text{noobj}}:指示函数,表示第 ii 个网格单元的第 jj 个边界框是否不包含物体。
  • xi,yi,wi,hix_i, y_i, w_i, h_i:第 ii 个网格单元的真实边界框的位置和大小。
  • x^i,y^i,w^i,h^i\hat{x}_i, \hat{y}_i, \hat{w}_i, \hat{h}_i:第 ii 个网格单元的预测边界框的位置和大小。
  • CiC_i:第 ii 个网格单元的真实置信度得分。
  • C^i\hat{C}_i:第 ii 个网格单元的预测置信度得分。
  • pi(c)p_i(c):第 ii 个网格单元对类别 cc 的真实概率得分。
  • p^i(c)\hat{p}_i(c):第 ii 个网格单元对类别 cc 的预测概率得分。

YOLO-v2

相对于 YOLOv1,YOLOv2(YOLO9000)在网络结构上进行了一些重要的改进和变化。以下是一些主要的结构上的区别:

  1. Darknet-19网络结构: YOLOv2使用了一种名为 Darknet-19 的新的神经网络结构,相较于 YOLOv1 的网络结构更加深入。Darknet-19 包括19个卷积层和5个maxpooling层,用于特征提取。
  2. Anchor Boxes: 使用先验框Anchor Box替换全连接层。YOLO v1中,直接采用全连接层来预测边界框,效果不好。作者预测bounding box与Anchor框的偏移(offset)而不是直接预测bounding box的坐标。作者去除了一个池化层,来使得输出的卷积特征图有更高的分辨率。其次作者缩减了网络,把原本网络的输入448x448缩减成416x416.因为YOLO v2模型下采样的总步长为32,对于 416x416 大小的图片,最终得到的特征图大小为13x13,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点而不是四个中心点去预测这些物体的边界框相对容易些。
  3. Batch Normalization: 批度归一化有助于解决反向传播过程中出现的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,并且起到一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。
  4. Multi-Scale Training(多尺寸训练):因为Yolo v2去掉了全连接层,只有卷积层与池化层,所以对于网络的输入大小,并没有限制,整个网络的降采样倍数为32,只要输入的特征图尺寸为32的倍数即可。所以Yolo v2可以使用不同尺寸的输入图片训练,来使模型适应不同分辨率的图片,让模型更鲁棒。
  5. 1x1 卷积核: YOLOv2 使用了 1x1 大小的卷积核,这种卷积核通常用于降低维度和增加非线性。在 YOLOv2 中,这些 1x1 的卷积核被用于减小通道数,从而改善模型的计算效率。
  6. 降采样:YOLOv2 使用了池化层(如最大池化)来进行降采样,以进一步减小特征图的尺寸。
  7. 使用高分辨率的图片:YOLO v2增加了在ImageNet数据集上使用输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适应高分辨率输入。
  8. Fine-Grained Features(细粒度特征):YOLO v2引入一种称为passthrough层的方法在特征图中保留一些细节信息。YOLO v2所利用的Fine-Grained Features是 26x26 大小的特征图(最后一个maxpooling层的输入)。passthrough层与ResNet网络的identity mappings类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2x2,然后将其转化为channel的维度,对于 26x26x512 的特征图,经passthrough层处理之后就变成了 13x13x1024 的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面的 13x13x3072 特征图连接在一起形成大小的特征图。
  9. Direct location prediction(直接位置预测):YOLO v2调整了预测公式,将预测边框的中心约束在网格内
  • x=σ(bx)+cxx = \sigma(b_x) + c_x
  • y=σ(by)+cyy = \sigma(b_y) + c_y
  • w=pwexp(bw)w = p_w \cdot \exp(b_w)
  • h=phexp(bh)h = p_h \cdot \exp(b_h)
  • Pr(Object)IOU(b,Object)=σ(t0)P_r(Object) * IOU(b,Object) = \sigma(t_0)

其中,σ\sigma 是 sigmoid 函数,cx,cyc_x, c_y 是网格单元左上角的坐标,pw,php_w, p_h 是先验框的宽度和高度。 σ(t0)\sigma(t_0)是预测边框的置信度,YOLO v1是直接预测置信度的值,这里对预测参数进行σ变换后作为置信度的值。

先验框

先验框是在训练神经网络之前定义的框,用于指导网络学习如何预测目标的位置和类别。YOLOv2中的先验框是基于训练数据集中的目标边界框而来的,它们代表了不同尺寸和比例的目标。K-means是一种无监督学习算法,用于将数据点分为K个不同的簇,以便找到数据的聚类结构。在YOLOv2中,K表示使用的先验框数量,值为5

使用K-means聚类算法对训练数据中的边界框进行聚类,以确定先验框的大小和比例。聚类通常在边界框的宽度和高度上进行,以找到不同尺寸和比例的先验框。

K-means聚类算法中所用的距离公式是: Intersection over Union(IOU)的补数,即 : d = 1 - IOU。(一般用的欧式距离公式d=i=1n(x2ix1i)2 d = \sqrt{\sum_{i=1}^{n}(x_{2i} - x_{1i})^2}

感受野

感受野(Receptive Field)是指神经网络中某一层输出的特征图上的单元对输入图像的区域大小。(特征图上的点能看到原始图像的多大区域).

较小的感受野通常用于捕捉图像的细节,而较大的感受野则有助于理解更大范围的上下文信息。

Yolo-v3

  1. 为了检测到不同大小的物体,设计了3个scale(特征图的尺寸).

在 YOLOv3 中,网络的最后三个输出层分别对应于三个不同的尺度。这三个尺度的输出分别为:13x13、26x26 和 52x52。每个尺度负责检测不同范围的目标。

通常,较小的尺度(如 13x13)负责检测较大的目标,而较大的尺度(如 52x52)则负责检测较小的目标。

  1. 利用上采样(用于将低分辨率的特征图恢复到更高的分辨率)将不同特征图融合进行预测.
  2. 残差连接(resnet):能够实现堆叠更多的层来进行特征提取

image.png

  1. 没有池化和卷积层,全部卷积
  2. 可以实现多个标签的检测
  3. 下采样通过stride为2实现 image.png

先验框

image.png

image.png