YOLO笔记

作者: yanghedada | 来源:发表于2018-10-17 12:19 被阅读119次

    YOLO

    1. YOLO将全图划分为SXS的格子,在介绍yolo的论文里S=7,即将图像分为7 x 7格子,其中C=20(使用VOC数据集,一共有20类)。

    2. 每个格子都会生成B个 Bounding Box 去进行物体的框定和分类,B在论文里给的是2,因此在此例中有98个Bounding Box。
      Confidence包含两方面,边界框含有目标的可能性以及边界框的准确度。

    3. 每个边界框对应一个分值,代表该处是否有物体及定位准确度:

    如果box框里面没有物体则Pr(object)=0。Pr(object)=1是存在物体的意思,是指物体的ground truth中心点在这个cell里面。一个grid cell里面虽然有两个Bounding Box, 但是它们共享同一组分类概率,因此同一个cell只能识别同一个物体。
    边界框的大小和位置用4个值来表示:(x, y, w, h), 其中(x,y)是边界框的中心坐标,w和h是边界框的宽与高。(x, y)是相对于每个单元格左上角坐标点偏移值,并且单位是相对于单元格大小的,而w和h预测值是相对于整个图片的宽和高的比例,这样理论上4个元素的大小在[0, 1]范围内,而且每个边界框的预测值实际上包含5个元素:(x, y, w, h, c)。这里的c是否有物体(下面有一个C,是类别),前四个元素表征边界框的大小和位置,最后一个值是置信度。

    5.每个小格会对应C个概率值,找出最大概率对应的类别C:

    1. 单个边界框的类别置信度
    1. 利用NMS (非极大值抑制) 算法得到最后的final 的detections。
      对于每一个单元格要给出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。这些概率值其实是在各个边界框置信度下的条件概率。
      非极大值抑制:抑制的过程是一个迭代-遍历-消除的过程。
      (1.将所有框的得分排序,选中最高分及其对应的框。
      (2.遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。
      (3.从未处理的框中继续选一个得分最高的,重复上述过程。 针对其他类别,比如cat,vehicle等,均采用这种方式,直到将所有的score值得到。 然后,针对每一个Bounding Box,查看其最大的值,如果在20个值里面最大值非0,那么就把这个bounding box认定为是识别对应物体的框。

    2. 每个单元格需要预测(B*5+C)个值。输入的图片为S x S网络,因此最终的预测值为S x S x (B x 5 + C)=SxSx(Bx(x,y,w,h,c),C)大小的张量,在论文里给出的例子为S=7,B=2,C=20 因此最终的张量大小为7 x 7 x 30。

    LOSS函数

    LOSS函数和其他神经网络一样,是优化的目标,在yolo v1里LOSS函数相当复杂,大体可以分为三部分,下面具体介绍一下LOSS函数:

    (1) 整个损失函数针对边界框损失(图中1, 2, 3部分)与格子(4部分)主体进行讨论。

    (2) 部分1为边界框位置与大小的损失函数,式中对宽高都进行开根是为了使用大小差别比较大的边界框差别减小。例如,一个同样将一个100x100的目标与一个10x10的目标都预测大了10个像素,预测框为110 x 110与20 x 20。显然第一种情况还可以接受,但第二种情况相当于把边界框预测大了一倍,但如果不使用根号函数,那么损失相同,都为200。但把宽高都增加根号时:

    (3) 若有物体落入边界框中,则计算预测边界框含有物体的置信度Ci和真实物体与边界框IoUCiˆ的损失,我们希望两差值越小损失越低。

    (4) 若没有任何物体中心落入边界框中,则Ciˆ为0,此时我们希望预测含有物体的置信度Ci越小越好。然而,大部分边界框都没有物体,积少成多,造成loss的第3部分与第4部分的不平衡,因此,作才在loss的三部分增加权重λnobj=0.5。

    (5) 对于每个格子而言,作者设计只能包含同种物体。若格子中包含物体,我们希望希望预测正确的类别的概率越接近于1越好,而错误类别的概率越接近于0越好。loss第4部分中,若pi(c)ˆ中c为正确类别,则值为1,若非正确类别,则值为0。

    一些细节:

    这里的x, y, w和h都是经过归一化的。作者对bounding box的坐标(x, y, w, h)进行了normalization,以便进行回归。
    作者的原文:最后一层预测了类概率和边界框坐标。将边界框宽度和高度标准化为图像宽度和高度,使它们落在0和1之间。我们将边界框x和y坐标参数化为特定网格单元位置的偏移量,因此它们也在0到1之间。

    (1)如图中,在YOLO中输入图像被分为SxS网格。假设有一个bounding box(如图4红框),其中心刚好落在了(row,col)网格中,则这个网格需要负责预测整个红框中的dog目标。假设图像的宽为widthimage,高为heightimage;红框中心在(xc,yc),宽为widthbox,高为heightbox那么:(1) 对于bounding box的宽和高做如下normalization,使得输出宽高介于0~1:

    (2)使用(row, col)网格的offset归一化bounding box的中心坐标

    上述公式得到的normalization的(x, y, w, h),再加之前提到的confidence,共同组成了一个真正在网络中用于回归的bounding box; 而当网络在Test阶段(x,y,w,h)经过反向解码又可得到目标在图像坐标系的框,相关代码在点这里的yolo_net.py关键部分如下:
    这是反向解码:

    offset = tf.tile(offset, [self.batch_size, 1, 1, 1])
    #shape为(45, 7, 7, 2)
    offset_tran = tf.transpose(offset, (0, 2, 1, 3))
    #shape为(45, 7, 7, 2, 4)
    predict_boxes_tran = tf.stack(
                    [(predict_boxes[..., 0] + offset) / self.cell_size,
                     (predict_boxes[..., 1] + offset_tran) / self.cell_size,
                     tf.square(predict_boxes[..., 2]),
                     tf.square(predict_boxes[..., 3])], axis=-1)
    

    参考:
    目标检测YOLO原理
    Yolov1原理及实现
    YOLO模型 训练及预测

    相关文章

      网友评论

        本文标题:YOLO笔记

        本文链接:https://www.haomeiwen.com/subject/ypylzftx.html