目标检测 YOLO - You only look once
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层。
1.1 网络结构
YOLO网络结构由24个卷积层与2个全连接层构成,在Pascal VOC数据上网络入口\(448\times448\),输出为最后一个全连接层reshape后的 \(7\times 7\times 30\)的张量数据块。
栅格 Grid Cell
将图像分成 \(S\times S\)个网格,比如 \(7\times 7\)。下图中物体的中心点在第5行、第2列的格子内,这个格子负责预测图像中的该物体。
预测 Bounding box 和 物体
具体地每个格子预测 \(B=2\)个 Bounding box,一个竖向矩形,一个横向矩形。
预测的准确度综合考虑这个格子存在物体的概率以及 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)\)
目标函数
由坐标\(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 的偏移更不能容忍。
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 个分类。
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 作为损失函数。
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