YOLO 学习笔记(一)

前言

本系列将记录笔者在 YOLO(You Only Look Once) 学习中遇到的困难与心得,分享给其他有需求的同学,做为知识库使用。

YOLO 是什么?

YOLO是目标检测模型,目前已发展到 v5 版本。
目标检测是计算机视觉中比较简单的任务,用来在一张图篇中找到某些特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置

显然,类别是离散数据,位置是连续数据。

机算机视觉的三类任务:分类,目标检测,实例分割。整体上这三类任务从易到难,我们要讨论的目标检测位于中间。
YOLO 的全称是 You Only Look Once,指只需要浏览一次就可以识别出图中的物体的类别和位置。
因为只需要看一次,YOLO 被称为 Region-free 方法,相比于 Region-based 方法,YOLO 不需要提前找到可能存在目标的Region

Region-free 也被称为单阶段(one-stage)模型
Region-based 也被称为两阶段(two-stage)模型

YOLO 版本对比

YOLO-V1

优点:快速,简单。

缺点:每个 Cell 只预测一个类别,重叠无法解决,小物体检测效果一般。

YOLO-V2

每个卷积层后都加入 Batch Normalization。

相当于网络每一层的输入都做了归一化,收敛相对更容易,从现在的角度来看 BN 已经是必备处理

经过 BN 处理后的网络大约会提升2%的mAP

使用更大的分辨率分类器,V2 训练时额外又进行了10次448*448的微调。

V1 训练时使用的是224*224,测试使用448*448

使 YOLOv2的 mAP 提升了约4%

舍弃全连接层,使用卷积来预测 Anchor Boxes,并且去掉 V1 网络中的池化层,以提高卷机输出的分辨率。

V2 网络的输入分辨率更改为416X416而不是448X448

聚类提取先验框。

YOLO-V3

最大的改进就是网络结构,使其更适合小目标检测。

DarkNet 和 YOLO 系列作者 Joseph Redmon 宣布退出 CV 界,因为YOLO被用于军事,是他不想看到的。

YOLO-V4

设计了强大而高效的检测模型,进一步降低了使用门槛。

修改了很多 SOTA 的方法,对单 GPU 训练更加高效。

YOLO-V5

相比于 YOLOv4,YOLOv5 在原理性方法没有太多改进,在速度与模型大小上比 YOLOv4 有较大提升,可以认为是通过模型裁剪后的工程化应用。

指标分析

  • mAP:综合衡量检测效果。

    在不同置信度阈值中综合考虑所有的 Precision 与 Recall 的情况,综合得出的一个指标值。

  • IOU:交集和并集的比值。
    $$
    \begin{flalign*} &
    IOU = \frac{Area \space of \space Overlap}{Area \space of \space Union}
    & \end{flalign*}
    $$

    交集:真实值和预测值重叠的部分。

    并集:真实值 + 预测值。

  • TP:true positives,正类判定为正类。

    真实是好瓜,并正确识别为好瓜。

  • FP:false positives,负类判定为正类。

    真实是坏瓜,并错误识别为好瓜。

  • FN:flase negatives,正类判定为负类。

    真实是好瓜,并错误识别为坏瓜。

  • TN:true negatives,负类判定为负类。

    真实是坏瓜,并正确识别为坏瓜。

  • precision:精度(真实标注的范围与检测到的范围的重合率)
    $$
    \begin{flalign*} &
    precision = \frac{TP}{TP \space + \space FP}
    & \end{flalign*}
    $$

  • Recall:召回(查全率,被真实标注的是否被检测到)
    $$
    \begin{flalign*} &
    Recall = \frac{TP}{TP \space + \space FN}
    & \end{flalign*}
    $$

训练参数

  • epoch:一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。

    使用训练集中的全部样本训练一次。

  • batch_size:决定一次训练的样本数目。

    从零开始训练模型的话,batch_sise 可以给小一点。

    从预训练模型开始的话,batch_sise 可以尽可能给大一点。

    因为大的 batch_sise 代表模型迭代每一步会稳定一些。

    总的来说 batch_size 太小会有欠拟合倾向(没那么明显), 对模型拟合数据的影响没有 learningrate 大。

    建议 learningrate 的值给的稳健一些,不要太大,然后给一个 gpu 范围内承受的最大的 batch_sise。

  • iteration:使用 batch_size 个样本训练一次。