详解 YOLOv2

作者: zidea | 来源:发表于2020-10-05 23:04 被阅读0次

    YOLOv2

    <img src="./images/yolov2_cover.jpeg">

    简单回归 YOLOv1

    <img src="./images/yolov1_012.jpeg">

    yolov1 中存在问题

    • yolo 难以应付小目标
    • yolo 漏检,也就是召回率

    针对这些问题,作者 AlexAB 做了很多实验,尝试在 YOLOv1 基础上进行优化
    <img src="images/yolov2_optimization.jpeg">

    解决方案是从直接预测到间接预测,这是在 yolov2 中提出针对召回率低的优化方案

    • local prediction
    • anchor based
    • anchor free

    预测框的优化

    local prediction 机制

    作者为什么在 yolov2 没有采用 Anchor 机制来生成预选框,而采用局部预测(local prediction) 宽和高基于 anchor 的宽和高,位置是与 anchor 不同,是基于位置。

    • 将直接拟合改为偏移预测 anchor 机制
    • 在 RCNN 的预测是基于 anchor box 的偏移量进行预测,
    • 在 yolov2 采用局部预测(local prediction) 而没有采用 Anchor 机制进行预选

    <img src="./images/yolov3_01.jpg" width="50%">

    基于 cell 左上角点预测框的相对偏移量
    中心点坐标表示如下
    \begin{aligned} b_x = \sigma(t_x) + c_x(2)\\ b_y = \sigma(t_y) + c_y(1)\\ \end{aligned}

    • c_x,c_y 表示网格数

    • 预测位置通常都是预测残差,

    • 缺点在于 sigma 函数 \sigma(x) \in (0,1) 不是闭区间,不能等于 0 或者 1 ,也就是不管 t_xt_y 取值多大或者多小都不会到。在 yolov4 随后版本乘以 1.1 或者 1.2

    Pr(object) * IOU(b,object) = \sigma (t_o)

    那么接下来我们说一说 RCNN 的 Anchor 机制

    Anchor 机制

    • 指定大小一定尺寸的框
    • 偏移量是基于 Anchor,也就是预测值与 Anchor 值的一种偏移量
    • 对于每一个 Anchor 都会预测一个置信度,和位置信息和框高

    Anchor free

    每一个网络上,每一个点都预测,一般都是密集\frac{1}{4} 或者\frac{1}{8} 也就是会生成很多预选框。

    多尺度融合

    预测效果好,和输入到卷积网络图片尺度是有关系的这一点不能否认,RCNN 通过 ROI 可以神经网络接受多尺度输入,而现在 yolo 还只能接受一个尺度 416 x 416,所以 yolo 没有在网络上考虑多尺度,这样也就是很容造成漏检。

    在 yolov4 做了一些优化

    • 输入图片尺寸要大,也就是训练时候输入大尺寸图片效果就好
    • 为了多尺度 passthrough ,检测头不能输出不能用全连接,用卷积替换卷积
      在yolov1 中 FC 连接到 7\times7(5 \times 2 + 20),而在 YOLOv2 中使用 13 \times 13 \times anchor \times (5 + 20)

    <img src="./images/yolov2_passthrough.jpeg">

    • 多尺度训练
    • 推理时候也要用尺寸图片
    • 多尺度提取特征
    • 多尺度检测头

    <img src="images/yolov2_001.jpeg">

    YOLOv2 设计的亮点

    • 检测网络设计思路整理
    • 在 yolov1 中采用 googleNet 网络,采用类似 VGG ,也就是 Darknet19

    <img src="images/yolov2_nb.jpeg" width="80%">

    • mini-batch

    <img src="./images/yolov2_sigmoid.jpeg" width="65%">

    • 每一层卷积层都加上 BN 层,加上 BN 可以防止梯度弥散,参考 batch normalization
    • 为什么对标准化,还需要进行乘以 \gamma 再加上 \beta,sigmoid 函数,虽然是非线性函数,但是函数中一段是接近于线性函数,这样做函数就是为解决这个问题,引入 \gamma\beta 让其变成非线性,这两个参数也是由网络是学习到的。

    <img src="./images/yolov4_cbn.png">

    • CBN(Cross-Iiteration Batch Normalization)
      这里引入 CBN 目标也就是原因是因为 batch 过小不利于统计,造成在 batch 上统计不准确,造成准确率下降。在无法扩大batch训练的前提下,是否可以通过收集最近几次迭代信息来更新当前迭代时刻的均值和方差,这样就变向实现了扩大 batch 目的。
    • CmBN

    YOLOv2 结构图

    损失函数详解

    <img src="./images/yolov2_loss.jpeg">

    这里损失函数对于我们还是比较难懂,同时也是最重要部分,所以觉得有必要花费时间在上面。算是函数开始就是一个遍历, W \times H \times A 其中 A 表示是 Anchor。

    • 先看第一行,这里 thresh 在论文中取 0.6,通过计算所以预测框和所有的ground truth 之间的 IOU 值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为 background
    • 计算 Anchor boxes 和预测框的坐标误差,但是在前 12800 个 iter 计算,作用是让网络可以学习到 Anchor 的形状
    • 计算坐标损失: 这里的匹配原则是指对于某个特定的 ground truth,首先要计算其中心点落在哪个 cell 上,然后计算这个 cell 的 5 个先验框和grond truth 的 IOU 值,计算 IOU 值的时候不考虑坐标只考虑形状,所以先将 Anchor boxes 和 ground truth 的中心都偏移到同一位置,然后计算出对应的 IOU 值,IOU 值最大的先验框和 ground truth 匹配,对应的预测框用来预测这个 ground truth。x,y,w,h 直接用误差平方值来表示
    • 计算置信度损失: 增加了一项权重系数,也被称为rescore参数,当其为1时,损失是预测框和ground truth 的真实 IOU 值而对于没有和 ground truth 匹配的先验框,除去那些 Max_IOU 低于阈值的,其他就全部忽略。
    • 计算类别误差:有关类别损失计算与之前 YOLOv1 没有什么差别

    相关文章

      网友评论

        本文标题:详解 YOLOv2

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