zoukankan      html  css  js  c++  java
  • YOLO解读

    1. 检测算法

    1.1 传统检测算法

    传统的检测算法的步骤如上图所示:

    • 给定输入,获取候选框(regiion proposal);
    • 手动提取候选框的特征;
    • 利用传统的机器学习算法(SVM, NN)对候选框进行分类,得到最终的结果;

    传统检测算法的缺点是分阶段进行,且在每个阶段中都可能存在误差,且误差存在叠加的可能;

    1.2 Two-stage检测算法

    Two-Stage的检测算法如下图所示,会隐式地生成一些region proposal,并借助CNN完成目标检测

    1. 3 One-Stage检测算法

    One-Stage检测算法的思想,可以用下图简单的描述,就是给定输入,经过CNN一系列计算后,直接得到我们想要的输出;

    那么,相比于Two-stage检测算法, one-stage有:

    • 继承了Two-stage算法端到端的思想
    • 去掉生成region proposal的冗余步骤

    那么,如何保证算法的效果呢?

    2. YOLO v1

    YOLO的优势:

    • 特别快(18 faster rcnn [ZF] vs 45 yolo)
    • 逐渐流行标准化(62.1 mAP vs 63.4)

    2.1 核心思想

    首先,对输入图像进行划分成(S imes S)个格子(grid cell),如果物体(object)的中心落在某个cell中,则该cell就负责预测这个物体;

    每一个grid cell负责预测B个bounding box, 对于每一个bbx,有:

    • bbx的位置信息: x, y, w, h;
    • bbx的置信度:

    [P_r(object) cdot IoU_{pred}^{truth} ]

    其中,如果bbx中存在object,则(P_r(object) = 1), 否则为0;

    其中,(IoU_{pred}^{truth})表示,bbx与真实物体框的IoU;

    另外,每个grid cell也预测C个类别的条件概率, 表示每一个grid cell属于C个类别的概率;

    所以,网络最终的输出维度为:

    [S imes S imes (5 imes B + C) = 7 imes 7 imes (5 imes 2 + 20) = 7 imes 7 imes 30 ]

    2.2 损失函数

    如下图所示,为YOLO算法核心的损失函数,主要包含三个部分的损失:

    • bbx坐标预测的损失;
    • bbx置信度预测的损失;
    • grid cell类别预测的损失;

    2.2.1 bbx坐标预测的损失

    坐标预测的损失函数部分为(上图有点问题):

    [lambda_{coord}sum_{i = 0}^{S^2}sum_{j = 0}^{B} 1_{ij}^{obj}[(x_i - hat{x_i})^2+ (y_i - hat{y_i})^2] \ + lambda_{coord}sum_{i = 0}^{S^2}sum_{j = 0}^{B} 1_{ij}^{obj}[(sqrt{w_i} - sqrt{hat{w_i}})^2+ (sqrt{y_i} - sqrt{hat{y_i}})^2] ]

    其中,

    • (i in (0, S^2))表示共有(S^2)个grid cell, (j in (0, B))表示每个grid cell包含有(B)个bbx;

    • (1_{ij}^{obj})表示第(i)个grid cell中的第(j)个bbx中,是否负责预测这个物体, 判断是否预测的依据在于B个中的某一个bbx与真实物体Ground Truth的IoU最大; 如果,bbx负责对该物体的预测, 则值为1, 否则为0;;

    • 对于坐标(x, y)预测的损失,采用均方误差;(基于均方误差最小化来进行模型求解的方法称为"最小二乘法")

    • 对于坐标(w, h)预测的损失,也是采用均方误差;但是重要的是对值取开方(原因下面会解释);

    • (lambda_{coord})表示对坐标损失函数权重,该权重大一些,是因为图像中包含物体的cell比较少一些;

    在计算坐标(w, h)损失取开方的解释如下:

    取开方后,对于大的bbx与小的bbx,在相同大小差异条件下,损失差别不大;

    2.2.2 bbx置信度预测的损失

    bbx预测的置信度损失如下:

    [+sum_{i = 0}^{S^2}sum_{j = 0}^{B} 1_{ij}^{obj} (C_i - hat{C_i})^2 \ + lambda_{noobj}sum_{i = 0}^{S^2}sum_{j = 0}^{B} 1_{ij}^{noobj} (C_i - hat{C_i})^2 ]

    对于bbx置信度损失的计算分成两个部分,一部分是某些负责对Object预测的bbx的置信度损失,另一部分是剩下的bbx的置信度损失;

    • (1_{ij}^{obj})表示负责预测object的bbx,(1_{ij}^{noobj})表示不负责预测object的bbx;
    • (lambda_{noobj}=0.5)表示基于较小的权重,因为这样的bbx很多;
    • 另外,bbx置信度的损失也采用均方误差的形式;

    2.2.3 grid cell 类别预测的损失

    对于每一个grid cell中,类别预测的损失如下:

    [sum_{i = 0}^{S^2} 1_{ij}^{obj} sum_{c in classes}(p_i(c) - hat{p_i}(c))^2 ]

    • 类别损失只针对grid cell,且只计算负责预测object的bbx的损失;
    • grid cell类别损失的计算也采用均方误差的形式;

    2.3 总结

    优点:

    1. 速度更快;
    2. 站在全局的角度进行预测,网络的输入是整张图片,更小的背景误差;
    3. 能够学习到泛化能力更强的特征;

    缺点:

    1. 对密集的小物体检测效果不好;假如多个物体的中心落在同一个grid cell中;
    2. 难以泛化到新的不常见的长宽比物体; 利用anchor解决
    3. 损失函数同等对待小的bbx和大的bbx;
    4. 准确率无法达到state-of-art的水平;

    3. YOLO v2

    YOLO v2是在YOLO v1的基础上增加了一系列的设定,如下图所示:

    3.1 Batch Normalization

    加入BN层,移除Dropout,用于模型正则化,正常操作;

    3.2 hi-res classifier

    引入更高精度的分类器(classifier);

    • 使用小的size在ImageNet上做预训练:(224 imes 224)
    • 用大的size继续finetune:(448 imes 448)
    • 在customized的数据集上finetune;
    • 最终获得(13 imes 13)的feature map;

    3.3 Anchor

    3.3.1 anchor boxes

    • Anchor是预设好的虚拟边框;
    • 最终的生成框由Anchor回归而来;

    (为什么最终的预测框由Anchor回归而来呢?将每一个grid cell都设置一些anchor,那么由这些anchor向真实框进行回归,肯定比初始化预测框向真实框回归简单,因此,由anchor得到预测框;)

    因此,网络的输出为:

    [S imes S imes K (5+ C) = 13 imes 13 imes 5 imes (5+20) ]

    (Anchor如何起到的作用,下文会描述;)

    3.3.2 dimension priors

    在Faster R-CNN中,Anchor的选择是根据经验选择的,在训练的过程中会调整Anchor Box的尺寸;

    那么,如果一开始就选择了一个更好的、更有代表性的先验Anchor Box,网络就更加容易学到准确的位置;

    如何选择呢?

    YOLO v2采用K-means聚类的方式训练数据集中的Ground Truth Box,用于得到Anchor Box的维度;

    而一般k-means算法采用的是均方误差用于距离度量,这样会导致大的Box会产生更多的误差,聚类结果会产生偏离,因此使用IoU值作为距离度量函数;

    3.3.3 location prediction

    在YOLO v2中,没有直接对Bounding boxes求回归(即直接得到box的中心位置和长宽),其中心点可能会在图像中的任意位置,这样可能会导致模型训练不稳定;

    在这个检测任务中,共包含:Anchor Box、Ground Truth Box、Prediction Box;其中,Anchor Box和Ground Truth Box是不变的,前者是人为设定的,后者是真实存在的;因此,在训练的过程中,变化的只是Prediction Box;

    因为Anchor Box与Ground Truth Box的尺寸比较接近,因此由Anchor Box回归得到最终的Prediction Box更简单一些;

    因此,我们则希望Prediction Box与Anchor Box的位置偏差,趋近于Ground Truth Box与Anchor Box的位置偏差

    那么,Prediction Box与Anchor Box的位置偏差表示为:

    [t_x^p = dfrac{x_p - x_a}{w_a}, t_y^p = dfrac{y_p - y_a}{h_a} ]

    [t_w^p = log(dfrac{w_p}{w_a}), t_h^p = log(dfrac{h_p}{h_a}) ]

    其中,(x_p, y_p, w_p, h_p)表示Prediction Box的位置信息,(x_a, y_a, w_a, h_a)表示Anchor Box的位置信息;

    Ground Truth Box与Anchor Box的位置偏差表示为:

    [t_x^g = dfrac{x_g - x_a}{w_a}, t_y^g = dfrac{y_g - y_a}{h_a} ]

    [t_w^g = log(dfrac{w_g}{w_a}), t_h^g = log(dfrac{h_g}{h_a}) ]

    其中,(x_g, y_g, w_g, h_g)表示Ground Truth的位置信息;

    网络的输出是(x_p, y_p, w_p, h_p),再结合Anchor Box即可得到最终的bbx位置信息,即:

    [x = (t_x^p imes w_a) - x_a \ y = (t_y^p imes h_a) - y_a \ w = w_a e^{t_w^p} \ h = h_ae^{t_h^p} ]

    然而,上面这种计算方式是没有约束的;即:假如(t_x ^p = 1),则边界框的位置则向右移动先验框的一个宽度大小;当(t_x^p = -1),则边界框的位置则向左移动先验框的一个宽度大小;所以每个位置的预测的边界框可以落在图片的任何位置,这将导致模型不稳定,需要长时间才能预测出正确的offset;

    解决方法就是预测边界框的中心点对于对应grid cell左上角位置的相对偏移;为了将边界框中心点约束再grid cell中,使用sigmoid处理偏移值;因此,边界框的实际位置计算方式为:

    [b_x = sigma{(t_x)} + c_x \ b_y = sigma{(t_y)} + c_y \ b_w = p_we^{t_w} \ b_h = p_h e^{t_h} ]

    其中,(b_x, b_y, b_w, b_h)就是最终边界框的位置信息;(c_x, c_y)表示当前grid cell的左上角坐标(相对于feature map);

    (p_w, p_h)表示先验框的宽度与长度,它们的值也是相对于特征图大小的;

    因此,预测的边界框相对于整张图的位置为:

    [b_x = (sigma{(t_x)} + c_x)/W \ b_y = (sigma{(t_y)} + c_y)/H \ b_w = p_w e^{t_w} / W \ b_h = p_h e^{t_h} / H ]

    其中,(W, H)表示feature map的宽度和长度;

    因此,如果将上述得到的值再乘以原始图像的宽度和长度,则就可以得到最终的预测框的位置了;

    3.4 passthrough(Fine-grained feature)

    将网络的深层特征与浅层特征连接在一起,将输出的特征包含物理信息和语义信息;

    那么,如何连接高分辨特征与低分辨特征呢?作者reorg层,实现从高分辨向地分辨的转换;

    那么,连接的部分可以称为short-cut,或者skip-connnection;

    (小的feature map变成大的feature map,两种方式:转置卷积、上采样)

    3.5 multi-scale

    在训练的过程中,每10个epoch,网络会随机选择一个新的输入尺寸进行训练;

    尺度分布在:(320, 352, ..., 608)

    为了保证网络模型能够接入不同尺度的图像,移除了FC层,使其能够承接任意size的输入,提升模型的鲁棒性;

    4. YOLO v3

    上图表示了YOLO v3整体的网络结构,

    • 其中DBL表示Darknet conv2d + BN + Leaky ReLU,是YOLO v3的基本组件;

    • res unit表示残差块

    • concat表示拼接,也可以称为skip connection,short-cut;

    4.1 Backbone

    在YOLO v3中,没有池化层和全连接层,feature map尺度的降低时通过调整卷积核的步长进行实现的;

    YOLO v3的整体结构类似于YOLO v2,但具体细节则存在很大的不同:

    相同点:

    1. 沿用YOLO的“分而治之”的策略,即通过划分单元格来进行检测;
    2. 从YOLO v2开始,卷积后面一般跟着BN和Leaky ReLU;
    3. 端到端的训练,即一个loss function;

    不同点:

    1. YOLO v3抛弃了最大池化层,使用步长为2的卷积层代替;
    2. 引入了残差结构,
    3. 借鉴了特征金字塔网络(FPN),采用多尺度来对不同的size的目标进行检测;

    4.2 Output

    如下图所示,可以看得到YOLO v3的输出包含三个尺度的tensor,维度分别为(13 imes 13 imes 255, 26 imes 26 imes 255,52 imes 52 imes 255);这就是借鉴FPN的思想,特征金字塔:得到不同尺度下的特征,并利用该特征金字塔进行目标检测,越精细的特征可以检测除越精细的物体;

    [S imes S imes B imes (5 + C) = 3 imes (5 + 85) = S imes S imes 255 ]

    YOLO v3中设定一个grid cell中预测3个bbx;

    5. YOLO v4

    6. 总结

    Reference

  • 相关阅读:
    资产 = 负债 + 所有者权益
    并发编程四(3) 线程同步
    并发编程四(2) 线程同步
    并发编程四(1) 线程同步
    并发编程(三) 线程互斥
    并发编程(二)multiprocessing.dummy.Pool
    并发编程(一)

    mysql 存储过程演示造数据
    vue系列 箭头函数和this
  • 原文地址:https://www.cnblogs.com/chenzhen0530/p/14746680.html
Copyright © 2011-2022 走看看