Yolo系列论文解读之Yolov1

Yolo 简介

Yolo 全名 You Look Only Once,作者是Joseph Redmon。 作者认为像R-CNN, Fast R-CNN 这种 two stage 的目标检测方式用了很复杂的处理流程(complex pipelines)导致模型很慢而且很难优化。在人类的视觉系统中,只要瞥一眼图片就能分辨出图中有什么物体,在什么位置,以及它们之间怎么重叠。于是作者提出了统一实时的检测模型Yolo. Yolo的设计旨在保留比较高的精度的前提下,实现端到端(end-to-end)的目标检测训练和实时的检测速度。
Yolov1论文地址

Yolo 原理

  • 将整张图片分成 SxS 个网格单元。如果一个目标的中心点落在某网格单元, 那么该网格单元负责预测这个目标。
  • 每个网格单元预测 B 个 bbox 以及它们的 confidence score。每个 bbox 需要预测 5 个数据:x, y, w, h, score。(x, y)表示 bbox 相对于其所在网格单元的位置,而 (w, h) 则表示 bbox 相对于整个图片的宽高。score 贼表示预测的 bbox 和 任一 ground truth box 的 IOU值。
  • 每个网格单元同样要预测 C 个类的概率(Pr(classiObject)Pr(class_i|Object)) . 每个网格单元只预测一组类的概率, 跟 bbox 的数量 B 无关。
  • 在测试时,将类的条件概率和单个框的置信度相乘。

Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruthPr(Class_i|Object) ∗ Pr(Object) ∗ IOU^{truth}_{pred} = Pr(Class_i) * IOU^{truth}_{pred}

网络设计

image.png

  • 网络的设计灵感来自GoogLeNet;
  • 一共有24层卷积层和两层全连接层;
  • 把GoogLeNet的Inception模块换成 1x1 紧跟着 3x3 的卷积层。
  • 除了最后一个全连接层使用线性激活函数,其他层都使用了LeakeyReLu。

ϕ(x)={0.1xotherwisexifx>0\phi (x) = \left \{ ^{x \quad if x>0} _{0.1x \quad otherwise} \right.

训练

  • 预训练:首先使用ImageNet的1000个类别图片分类竞赛数据对模型进行与训练。预训练使用前20个卷积层加上一个平均池化层和一个全连接层。训练的图片输入大小为 224x224
  • 检测模型训练: 进行预训练之后,就将模型修改成检测模型,在分类模型的20层卷积层后面加上4层卷积层和2层全连接层。新加的6层使用随机的方式进行参数初始化。训练的图片输入大小为 448x448。

损失函数

yolov1的损失函数如下

loss=λcoordi=0S2j=0BIijobj[(xixi^)2+(yiyi^)2]+λcoordi=0S2j=0BIijobj[(wiwi^)2+(hihi^)2]+i=0S2j=0BIijobj(CiCi^)2+λnoobji=0S2j=0BIijnoobj(CiCi^)2+i=0S2Iiobjcclasses(pi(c)pi^(c))2\begin{aligned} loss &= \lambda _{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I^{obj}_{ij}[(x_i-\hat{x_i})^2 + (y_i-\hat{y_i})^2] \\ & + \lambda _{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w_i}})^2 + (\sqrt{h_i}-\sqrt{\hat{h_i}})^2] \\ & + \sum_{i=0}^{S^2}\sum_{j=0}^{B}I^{obj}_{ij}(C_i - \hat{C_i})^2 \\ & + \lambda _{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B} I^{noobj}_{ij}(C_i - \hat{C_i})^2 \\ & + \sum_{i=0}^{S^2} I^{obj}_{i}\sum_{c \in classes}(p_i(c) - \hat{p_i}(c))^2 \end{aligned}

  • IiobjI^{obj}_{i} 表示如果有目标在第 ii 个网格内
  • IijobjI^{obj}_{ij} 表示 第 ii 个网格的第 jj 个 bbox 负责预测该对象
  • 损失函数只有在网格中存在检测目标时才对分类误差进行惩罚。
  • 损失函数只有在该bbox负责预测某目标时才对bbox误差进行惩罚。

优化器

  • SGD优化器
  • batch-size = 64
  • momentum = 0.9
  • decay = 0.0005
  • 学习率策略:第一个epochs:学习率从10310^{-3}缓慢增长到10210^{-2},使用10210^{-2}训练75个epochs,再使用10310^{-3}训练30个epochs,最后使用10410^{-4}训练30个epochs。

Yolov的局限性

  • 由于每个网格单元只预测两个bbox和一个类概率,当目标重叠的时候模型的预测能力就受限了。yolo模型很难处理成群出现的小物体,比如小鸟。
  • 由于模型从数据中学习bbox,所以在预测时很难预测新出现的形状。
  • 由于我们的损失函数对不同大小的bbox的惩罚是一样的, 大的bbox里的小误差通常是良性的,但是小的bbox里的小误差会很大程度影响IOU。
阅读(56)
评论(0)
updated@2021-07-26
评论区
目录