YOLO v1 笔记

YOLO v1 是 one-stage 的鼻祖,将目标检测看作为单一的回归问题,直接由图像像素优化得到物体边界位置和分类。

网络结构

模型输入

输入大小

用 ImageNet 数据集做预训练(图片尺寸 224×224 ),做检测模型优化时对输入图片尺寸放大了两倍(图片尺寸 448×448 )。

数据增强

模型输出

S × S × (B ∗ [x, y, width, height, confidence] + C)

\[\operatorname { confidence } = \operatorname { Pr } ( \text {Object} ) * \mathrm { IOU } _ { \text { pred } } ^ { \text { truth } } \text { , 其中} \operatorname { Pr } ( \text {Object} ) \in \{ 0,1 \}\]

在检测目标时,bbox class-specific confidence score

\[Pr\left ( Class_{i} |Object \right ) \ast Pr\left ( Object \right ) \ast IOU_{pred}^{truth} = Pr\left ( Class_{i} |Object \right ) \ast confidence\] \[Pr\left ( Class_{i} |Object \right ) \text {:grid cell 预测的类别信息}\] \[Pr\left ( Object \right ) 、IOU_{pred}^{truth}\text {:每个 bbox 预测的 confidence}\]

YOLO v1:7×7×(2x(4+1)+20)

每个 grid 有 30 维,这 30 维中,8 维是回归 box 的坐标(B=2),2 维是 box 的 confidence,还有 20 维是类别。其中坐标的 x, y 用对应网格的 offset,w、h 用图像的 width 和 height 归一化到 0-1。

损失函数

粗暴的对所有的项统一用 sum-squared error loss 进行优化。

\[\text {bbox loss:} \qquad \lambda _ { \text { coord } } \sum _ { i = 0 } ^ { S ^ {2} } \sum _ { j = 0 } ^ { B } 1 _ { i j } ^ { o b j } \left[ \left( x _ { i } - \hat { x } _ { i } \right) ^ { 2 } + \left( y _ { i } - \hat { y } _ { i } \right) ^ { 2 } \right] \qquad //中心点损失\] \[\qquad \qquad + \lambda _ { \text {coord} } \sum _ { i = 0 } ^ { S ^ {2} } \sum _ { j = 0 } ^ { B } 1 _ { i j } ^ { o b j } \left[ \left( \sqrt { w _ { i } } - \sqrt { \widehat { w } _ { i } } \right) ^ { 2 } + \left( \sqrt { h _ { i } } - \sqrt { \hat { h } _ { i } } \right) ^ { 2 } \right] \quad //宽高损失\] \[\text {confidence loss:} \qquad + \sum _ { i = 0 } ^ { S ^ {2} } \sum _ { j = 0 } ^ { B } 1 _ { i j } ^ { o b j } \left( C _ { i } - \hat { C } _ { i } \right) ^ { 2 } //含物体的 BB 的 confidence\] \[\qquad \qquad \qquad + \lambda _ { n o o b j } \sum _ { i = 0 } ^ { S ^ {2} } \sum _ { j = 0 } ^ { B } 1 _ { i j } ^ { n o o b j } \left( C _ { i } - \hat { C } _ { i } \right) ^ { 2 } //不含物体的 BB 的 confidence\] \[\text {classification loss:} \qquad \qquad \ + \sum _ { i = 0 } ^ { S ^ {2} } 1 _ { i } ^ { o b j } \sum _ { c \in c l a s s e s } \left( p _ { i } ( c ) - \hat { p } _ { i } ( c ) \right) ^ { 2 } //类别预测\]

小结

训练细节

Leaky ReLU

dropout

优化器

YOLO v1优点

  1. YOLO v1 检测物体非常快。 因为没有复杂的检测流程,YOLO 将目标检测重建为一个单一的回归问题,从图像像素直接到边界框坐标和分类概率,而且只预测 98 个框,YOLO 可以非常快的完成物体检测任务。YOLO 在 Titan X 的 GPU 上能达到 45 FPS。Fast YOLO 检测速度可以达到 155 FPS。

  2. YOLO 可以很好的避免背景错误,其它物体检测算法使用了滑窗或 region proposal,分类器只能得到图像的局部信息。YOLO 在训练和测试时,由于最后进行回归之前接了 4096 全连接,所以每一个 Grid cell 对应的预测结果都相当于使用了全图的上下文信息,从而不容易在背景上预测出错误的物体信息。和 Fast-R-CNN 相比,YOLO 的背景错误不到 Fast-R-CNN 的一半。

  3. YOLO 可以学到更泛化的特征。 当 YOLO 在自然图像上做训练,在艺术作品上做测试时,YOLO 表现的性能比 DPM、R-CNN 等之前的物体检测系统要好很多。因为 YOLO 可以学习到高度泛化的特征,从而迁移到其他领域。

YOLO v1缺点

  1. 对邻近物体检测效果差,由于每个 grid cell 仅预测两个框和一个分类,对于 多物体的中心位置落入同一 cell,YOLOv1 力所不及;

  2. 用全连接的问题在于,虽然获取了全局信息,但是比起1×1卷积来说也丢失了局部细节信息;全连接带来了参数量的巨增;

  3. 对不常见的长宽比物体泛化能力偏弱,这个问题主要是YOLO没有Anchor的不同s尺度框的设计,只能通过数据去驱动;

  4. 损失函数的设计问题,对坐标的回归和分类的问题同时用 MSE 损失明显不合理;

  5. 由于YOLOv1是直接预测的BBox位置,相较于预测物体的偏移量,模型会不太好稳定收敛;

Table of Contents