目标检测 YOLO - You only look once

You only look once (YOLO) is a state-of-the-art, real-time object detection system. On a Pascal Titan X it processes images at 30 FPS and has a mAP of 57.9% on COCO test-dev.

1. YOLO v1

论文 https://arxiv.org/abs/1506.02640
之前的网络是分类和定位之后把物体检测出来。Yolo 将物体检测任务把位置和某一类的概率放在张量里,通过回归拟合出一个张量进行检测,通过YOLO,每张图像只需要“看一眼”就能得出图像中都有哪些物体和这些物体的位置。
为了图像能够找到小的物体将图像上采样到 \(448\times448\)作为输入图像。一个神经网络从一张图像预测 bounding box 的坐标及包含物体的置信度和物体的可能性。然后进行非极大值抑制、筛选Boxes。

使用相当于简化的 GoogLeNet,包含20层。数据集采用 ImageNet 1000-class 分类任务数据集的 Pretrain 卷积层,20层卷积层,加上一个 average pooling layer 再加上一个全连接层作为 Pretrain 网络。
输入的图像\(224\times224\)上采样至 \(\mathbf{448\times 448}\)。预测结果归一化至 \(0\sim 1\),使用 Leaky RELU作为激活函数
为了防止过拟合第一个全连接层后面使用 ratio=0.5 的 Dropout层
image

1.1 网络结构

image

YOLO网络结构由24个卷积层与2个全连接层构成,在Pascal VOC数据上网络入口\(448\times448\),输出为最后一个全连接层reshape后的 \(7\times 7\times 30\)的张量数据块。

栅格 Grid Cell
将图像分成 \(S\times S\)个网格,比如 \(7\times 7\)。下图中物体的中心点在第5行、第2列的格子内,这个格子负责预测图像中的该物体。
image

预测 Bounding box 和 物体
具体地每个格子预测 \(B=2\)个 Bounding box,一个竖向矩形,一个横向矩形。
image
预测的准确度综合考虑这个格子存在物体的概率以及 Predicted Bounding box 与 Ground truth box 的 IoU(Intersection over Union)进行打分 Confidence score,\(\text{Confidence} < 1\)\(\text{Confidence} = Pr(\text{object})\times \text{IoU}_\text{pred}^\text{truth}\),如果该格子不存在物体 \(Pr(\text{object})=0\),则 \(\text{Confidence} =0\)
每个格子的预测包含 Boundging box中心的坐标 \(x\)\(y\) 和长宽 \(h\)\(w\)以及是否存在物体的 \(\text{Confidence}\)值,并且全部归一化到 \([0,1]\)之间。两个 Bounding box 的预测结果共占用\(10\)个维度。

已知物体预测类别\(Pr(\text{class}_i\mid\text{object})\)
每个格子需要预测已知包含一个物体的条件下属于某一类\(\text{class}_i\)的概率 \(Pr(\text{class}_i\mid\text{object})\) ,对于 Pascal VOC 数据共有 \(c=20\) 个类别。所以共有 \(20\) 个维度的结果。所以对于对于 Pascal VOC 数据共有 \(5\times B+c=5\times 2+20=30\) 个维度的结果,其中前面 \(10\) 个为两个 Bounding box 的预测结果,后面为类别的预测结果。

所以在Pascal VOC数据上总的输出维度为 \(S\times S\times(5\times B+c)=7\times7\times(5\times 2+20)=7\times 7\times 30\)

在测试阶段的总分综合考虑该格子是物体的概率和 IoU 值以及物体所属类别的条件概率:

\(\text{Confidence} \times Pr(\text{class}_i\mid\text{object})= Pr(\text{object})\times \text{IoU}_\text{pred}^\text{truth}\times Pr(\text{class}_i\mid\text{object})= Pr(\text{object})\times Pr(\text{class}_i\mid\text{object})\times\text{IoU}_\text{pred}^\text{truth}=\text{IoU}_\text{pred}^\text{truth}\times Pr(\text{class}_i)\)

目标函数

image

由坐标\(x,y,w,h\)预测误差、IoU误差、分类误差三部分组成,并使用了 \(\lambda_{\text{coord}}\), \(\lambda_{\text{noobj}}\)进行协调。\(i\) 表示网格 \(i\in[0,S^2)\)\(j\) 表示Bounding box,\(j\in[0,B)\)\(1_{ij}^{\text{obj}}=1\) 表示第 \(i\) 个格子第\(j\)个Bounding box含有物体,\(1_{ij}^{\text{obj}}=0\)表示没有物体,即对于大量没有物体的Bounding box不进行处理。
坐标预测误差
\(\color{darkcyan}{\lambda_{\text{coord}}\sum\limits_{i=0}^{S^2}\sum\limits_{j=0}^B 1_{ij}^{\text{obj}}[(x_i-\hat{x}_i)^2+(y-\hat{y}_i)^2]+\lambda_{\text{coord}}\sum\limits_{i=0}^{S^2}\sum\limits_{j=0}^B 1_{ij}^{\text{obj}}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h}-\sqrt{\hat{h}_i})^2}]\)

开根号是为了让大的 Bounding box 和 小的 Bounding box损失平衡,不至于差异太大。让小的 Bounding box 的偏移有更大的损失,因为小的 Bounding box 的偏移更不能容忍。

image

IoU误差

  • 含有物体object的 Bounding box 的 Confidence 误差
    \(\color{red}{+\sum\limits_{i=0}^{S^2}\sum\limits_{j=0}^B 1_{ij}^{\text{obj}}(C_i-\hat{C}_i)^2}\)
  • 不含物体object的 Bounding box 的 Confidence 误差
    \(\color{orange}{+\lambda_{\text{noobj}}\sum\limits_{i=0}^{S^2}\sum\limits_{j=0}^B 1_{ij}^{\text{noobj}}(C_i-\hat{C}_i)^2}\)

分类误差
\(\color{purple}{+\sum\limits_{i=0}^{S^2} 1_{i}^{\text{obj}}\sum\limits_{c\in classes}(p_i(c)-\hat{p}_i(c))^2}\)

非极大值抑制NMS
从所有检测框中找到Confidence最大的框,对剩余框与其计算IoU,如果IoU大于一定的阈值即重合度过高,则将该框剔除。

类别检测方法

  • 对于 \(S\times S\times B=7\times7\times2=98\) 个 Bounding boxes,将Confidence 值小于某个阈值的Confidence 值归 \(0\)
  • 采用非极大值抑制NMS,重合度过高的框的Confidence 值归 \(0\)
  • 对于Confidence 不为\(0\)的box,确定其box的类别

优点
检测速度快( \(S\times S\times B=7\times7\times2=98\) 候选框较少)。
假阳性率低,误判的情况少。
能够学到更加抽象的物体的特征。

缺点
精度不高。
容易对物体定位错误。
每个格子只能预测2个物体,密集的小物体在一块不好预测。

2. YOLO v2 / YOLO 9000

论文 https://arxiv.org/abs/1612.08242

First we improve upon the base YOLO detection
system to produce YOLOv2, a state-of-the-art, real-time
detector. Then we use our dataset combination method
and joint training algorithm to train a model on more than
9000 classes from ImageNet as well as detection data from
COCO.

2.1 YOLO v2

数据集 ImageNet 在 finetune
主要创新:

  • 使用 Batch Normalization 提高模型收敛速度,减少过拟合。在所有卷层都应用 Batch Normalization 使结果提升 2%。
  • 在ImageNet上进行预训练时大部分模型使用\(256\times256\),这里使用 \(448\times 448\) 在ImageNet上进行预训练,在此预训练的网络基础上进行 finetune 使网络适应高分辨率输入有利于识别小物体,使得结果提升 4% mAP
  • 不止使用两个 Bounding box,而是借鉴 Faster R-CNN 的 anchor 思想,使用多个 anchor boxes(经验值 5 个 anchor boxes),虽然准确率有小幅度下降,召回率提升了 7%,即找到了 YOLO v1 中找不到的物体。
  • 使用 K-means 聚类方法对数据集标出的 Bounding box 框进行聚类,经验设定 \(K=5\),发现瘦高矩形框比较多,其次是扁宽的,正方的很少等现象,以此来选择 9 种 anchor boxes 中的 5 种进行训练,聚类选出的是IoU和效率比较好的平衡的结果。
  • Bounding box 的预测值与Ground-truth 的差距可能会很大,会导致出现不能回归的情况,比如出现负数等情况,之前的方法是使用 \(\mathrm{log}\) 让其为正进行限定方便运算。这里使用 sigmod: \(f(z)=\frac{1}{1+e^{−z}}\),把\((−\infty,\infty)\)映射到\((0,1)\) 使得 anchor boxes 的预测更稳定。
  • 增加 passthrough 层,类似于 ResNet (\(H(x)=F(x)+x\)),将低分辨率与高分辨率特征结合,使 \(26\times26\times512\) 的特征图转化为 \(13\times13\times2048\)的特征图进而进行后续检测有利于小目标的检测。由小的物体不好检测,结合大一点特征图的特征信息能够弥补一定的相关特征信息,增加了 1% 的性能。
  • 由于模型只包含卷积层和 pooling 层,可以改变图片的输入尺寸。在实验中,每经过 10 次训练,就会随机选择新的图片尺寸进行训练,可以对抗过拟合和适应不同的图片。
2.1.1 网络结构

设计 Darknet-19 共19层作为基础网络。网络结构里使用较多的 \(3\times 3\)的卷积核。在每一次池化操作后把通道数翻倍。使用类似 ResNet 的结构用 \(1\times 1\)进行降维压缩特征节省计算,同样用 \(1\times 1\)进行升维。使用 Batch Normalization 稳定模型训练。

Type Filters Size/Stride ~ Output ~
Convolutional 32 \(3 \times 3\) \(224 \times 224\)
Maxpool \(2 \times 2 / 2\) \(112 \times 112\)
Convolutional 64 \(3 \times 3\) \(112 \times 112\)
Maxpool \(2 \times 2 / 2\) \(56 \times 56\)
Convolutional 128 \(3 \times 3\) \(56 \times 56\)
Convolutional 64 \(1 \times 1\) \(56 \times 56\)
Convolutional 128 \(3 \times 3\) \(56 \times 56\)
Maxpool \(2 \times 2 / 2\) \(28 \times 28\)
Convolutional 256 \(3 \times 3\) \(28 \times 28\)
Convolutional 128 \(1 \times 1\) \(28 \times 28\)
Convolutional 256 \(3 \times 3\) \(28 \times 28\)
Maxpool \(2 \times 2 / 2\) \(14 \times 14\)
Convolutional 512 \(3 \times 3\) \(14 \times 14\)
Convolutional 256 \(1 \times 1\) \(14 \times 14\)
Convolutional 512 \(3 \times 3\) \(14 \times 14\)
Convolutional 256 \(1 \times 1\) \(14 \times 14\)
Convolutional 512 \(3 \times 3\) \(14 \times 14\)
Maxpool \(2 \times 2 / 2\) \(7 \times 7\)
Convolutional 1024 \(3 \times 3\) \(7 \times 7\)
Convolutional 512 \(1 \times 1\) \(7 \times 7\)
Convolutional 1024 \(3 \times 3\) \(7 \times 7\)
Convolutional 512 \(1 \times 1\) \(7 \times 7\)
Convolutional 1024 \(3 \times 3\) \(7 \times 7\)
- - - -
Convolutional 1000 \(1 \times 1\) \(7 \times 7\)
Avgpool Global \(1000\)
Softmax

2.2 YOLO 9000

ImageNet 的数据标签来源于WordNet,具有一定的层次结构。作者根据 WordNet 综合 ImageNet 数据集 和 COCO 数据集 建立 WordTree,包含 9000 个分类。
image

3. YOLO v3

论文 https://arxiv.org/abs/1804.02767
使用 DarkNet-53 的 53 层的基础网络(使用前52层,不使用全连接层),这个网络由残差单元叠加而成。
相较于 YOLO v2:

  • 由于 Softmax 只能给出最大的, 所以使用 Logistic loss
  • YOLO v2 使用 5 个 anchor boxes,YOLO v3 使用 3 个 考虑不同尺度的类似金字塔结构的 anchor boxes,相当于 \(3\times 3\) 个 anchor boxes,映射到三个尺度的特征图上,每个特征图使用的是 3 个 anchor boxes,提高了 IoU
  • YOLO v2 只有一个 Detection,YOLO v3 有 3 个 Detection
  • 基础骨干网络使用 DarkNet-53,增加卷积层有利于提取更多深层次的信息,含有残差单元体现了一些 ResNet 的特性

3.1 网络结构

使用逻辑回归预测每个边界框的分类。为了实现多标签分类,不再使用 softmax 函数作为最终的分类器,而是使用 binary cross-enropy 作为损失函数。
image

3.2 多尺度预测

  • 在 DarkNet-53的特征图(第52层卷积层的输出)上,经过 7 Convs 卷积层得到第一个特征图 feature map,在这个特征图上做第一次预测,得到 Scale 1 尺度的预测,预测大尺度的物体。
  • 在上一步的 7 Convs 卷积层 向前倒数第 3 个卷积层的输出进行一次 \(\times 2\) 上采样,将上采样后的特征与DarkNet-53 的第 43 个卷积层的特征连接,经过 7 Convs 卷积层得到特征图,在这个特征图上做第二次预测,得到 Scale 2 尺度的预测,预测中尺度的物体。
  • 在上一步的 7 Convs 卷积层向前倒数第 3 个卷积层的输出,进行一次卷积一次 \(\times2\)上采样,得到的特征图与DarkNet-53 的第 26 个卷积特征图连接,再经过7 Convs 卷积层得到特征图,在这个特征图上做第三次预测,得到 Scale 3 尺度的预测,预测小尺度的物体。

优点
对于密集的人站在一起效果好

[1] https://programmersought.com/article/50663470669/
[2] YOLOv1论文理解 csdn
[3] 【YOLOv1】的那点事儿 csdn
[4] 一文看懂YOLO v3 csdn

posted @ 2021-11-12 14:01  NickD  阅读(112)  评论(0编辑  收藏  举报