你想要的一文读懂YOLO系列

1. 目标检测之YOLO V1[2015, Joseph]

1.1. YOLO V1: you only look once!

网络结构

你想要的一文读懂YOLO系列_第1张图片

1.2. 步骤

1.2.1 将图片网格化,变成S x S个cell [448 x 448 -> 7 x 7]

One cell will be responsible for predicting an object as long as an object’s center
locating in that cell.

你想要的一文读懂YOLO系列_第2张图片

  • 只要一个物体的中心在一个cell上,那么这个cell负责预测这个物体;一个cell只负责一个物体
  • 如上图蓝色cell负责预测狗,黄色cell负责预测自行车,红色cell预测汽车
  • 如果两个物体的中心都落在一个cell上,yolo只会选择一个物体来预测,只会预测先来得那个物体,但是这种情况非常少见

1.2.2 每个cell预测出B个bounding box,附带confidence值

  • 其中B为2,即cell预测出2个Bbox,如下第一张图
  • 2个bounding box的位置:x,y,w,h(center)
  • 2个bounding box的置信度confidence : Pr(object) * IoU(truth, pred)
    • 这里的置信度评分(Pr(Object)*IOU(predtruth))综合反映基于当前模型bounding box内存在目标的可能性Pr(Object)和bounding box预测目标位置的准确性IOU(predtruth)。
    • 如果bouding box内不存在物体,则Pr(Object)=0。
    • 如果存在物体,则根据预测的bounding box和真实的bounding box计算IOU,同时会预测存在物体的情况下该物体属于某一类的后验概率Pr(Class_iObject)。。
  • 预测和输出tensor向量: S * S * (5 * B + C)
    • 假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率Pr(Class_iObject), i=1,2,…,C;每一个网格预测B个bounding box的位置。即这B个bounding box共享一套条件类概率Pr(Class_iObject),i=1,2,…,C。
    • 基于计算得到的Pr(Class_iObject),在测试时可以计算某个bounding box类相关置信度:Pr(Class_iObject)*Pr(Object)*IOU(predtruth)=Pr(Class_i)*IOU(predtruth)。
    • 输出向量维度 [7 x 7 x (5 * 2 + 20) ] -> v1
    • 输出的30维包括的信息如下第二张图

输入和输出的映射

你想要的一文读懂YOLO系列_第3张图片

30维向量信息

你想要的一文读懂YOLO系列_第4张图片

1.3. 损失函数

样本标签翻译成人话就是:4行3列网格位置有一辆自行车,它的中心点在这个网格内,它的位置边框是bounding box1所填写的自行车实际边框。

你想要的一文读懂YOLO系列_第5张图片

YOLO损失函数如下

你想要的一文读懂YOLO系列_第6张图片

公式中的符号涵义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AgOgYjE-1589854464706)(https://math.jianshu.com/math?formula=1_i%5E%7Bobj%7D)]意思是网格i中存在对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3zKvcGB-1589854464708)(https://math.jianshu.com/math?formula=1_%7Bij%7D%5E%7Bobj%7D)]意思是网格i的第j个bounding box中存在对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcovZYcF-1589854464709)(https://math.jianshu.com/math?formula=1_%7Bij%7D%5E%7Bnoobj%7D)]意思是网格i的第j个bounding box中不存在对象

总的来说,就是用网络输出与样本标签的各项内容的误差平方和作为一个样本的整体误差
损失函数中的几个项是与输出的30维向量中的内容相对应的。

① 对象分类的误差

公式2.3,注意[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRwhUFQY-1589854464710)(https://math.jianshu.com/math?formula=1_i%5E%7Bobj%7D)]意味着存在对象的网格才计入误差。

② bounding box的位置误差

公式2.1

a)都带有[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7eu2oPoN-1589854464711)(https://math.jianshu.com/math?formula=1_%7Bij%7D%5E%7Bobj%7D)]意味着只有"负责"(IOU比较大)预测的那个bounding box的数据才会计入误差。

b)公式2.1第2行宽度和高度先取了平方根,因为如果直接取差值的话,大的对象对差值的敏感度较低,小的对象对差值的敏感度较高,所以取平方根可以降低这种敏感度的差异,使得较大的对象和较小的对象在尺寸误差上有相似的权重。

c)乘以[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkkQyCCn-1589854464712)(https://math.jianshu.com/math?formula=%5Clambda_%7Bcoord%7D)] 调节bounding box位置误差的权重(相对分类误差和置信度误差)。YOLO设置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sc0OsOua-1589854464712)(https://math.jianshu.com/math?formula=%5Clambda_%7Bcoord%7D%20%3D%205)] ,即调高位置误差的权重。

③ bounding box的置信度误差

公式2.2

a)第3行是存在对象的bounding box的置信度误差。带有[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKNPMsBC-1589854464713)(https://math.jianshu.com/math?formula=1_%7Bij%7D%5E%7Bobj%7D)]意味着只有"负责"(IOU比较大)预测的那个bounding box的置信度才会计入误差。

b)第4行是不存在对象的bounding box的置信度误差。因为不存在对象的bounding box应该老老实实的说"我这里没有对象",也就是输出尽量低的置信度。如果它不恰当的输出较高的置信度,会与真正"负责"该对象预测的那个bounding box产生混淆。其实就像对象分类一样,正确的对象概率最好是1,所有其它对象的概率最好是0。

c)第4行会乘以[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoLOyvXA-1589854464714)(https://math.jianshu.com/math?formula=%5Clambda_%7Bnoobj%7D)]调节不存在对象的bounding box的置信度的权重(相对其它误差)。YOLO设置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5brBoBA-1589854464715)(https://math.jianshu.com/math?formula=%5Clambda_%7Bnoobj%7D%20%3D%200.5)] ,即调低不存在对象的bounding box的置信度误差的权重。

YOLO算法的缺点:

优点:

  • 单阶段,检测速度快

缺点:

  • 对比比较密集的物体检测性能不好,一个cell只预测一个物体(49个cell)
  • 位置回归精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
    • cell为7 * 7大小,比较小和少
    • √w 和 √h
  • YOLO虽然可以降低将背景检测为物体的概率(误检),但同时导致召回率较低。
  • 没有使用BN

2. 目标检测之YOLO 2[2016, Joseph]

2.1 创新点

2.1.1 New Network:Darknet-19

你想要的一文读懂YOLO系列_第7张图片

2.1.2 增加了Batch Normalization

你想要的一文读懂YOLO系列_第8张图片
  • YOLOv2 中在每个卷积层后加 Batch Normalization (BN) 层,去掉 dropout. BN 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。
  • YOLOv2 通过使用 BN 层使得 mAP 提高了 2%。

2.1.3 High Resolution Classifier (高分辨率)

  • Train on ImageNet(224 * 224)
  • Finetune(微调) on ImageNet(448 * 448) with 10 epoch,低分辨率会影响模型检测能力
  • 再在任务的数据集上Finetune(微调)
  • 由7 * 7最后变成了13 * 13的feature maps
  • 通过使用高分辨率的输入,YOLOv2 的 mAP 提升了约 4%。

2.1.4 Fine-Grained Features (细粒度特征融合)

backbone提取语义信息,提取特征图(主动,高级信息),损失了像素信息(被动,低级信息),使用Fine-Grained Features.

  • pass through 层将高分辨率的特征图与低分辨率的特征图concatenate(连接)在一起,从而实现多尺度检测。
  • 上一层26x26x64 有低层次信息的特征图经过pass through 层的reorg处理变成 13x13x256 的特征图(抽取原特征图每个 2x2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13x13x1024 大小有高层次信息的特征图连接,变成 13x13x1280 的特征图
  • reorg变化如图一,passthrough层如图二:
    你想要的一文读懂YOLO系列_第9张图片你想要的一文读懂YOLO系列_第10张图片
  • 使用 Fine-Grained Features,YOLOv2 的性能提升了 1%

2.1.5 Multi-Scale Training

  • 去除了全连接层,使用的 Darknet-19 网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制
  • Darknet-19 下采样总步长为 32,输入图片的尺寸一般选择 32 的倍数 {320,352,…,608}
  • 当采用低分辨率的图片输入时,mAP 值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高 mAP 值,但速度有所下降
  • 从而可以在速度和精度上进行自由权衡

2.1.6 Anchor in Yolo V2

YOLOv2 使用了K-means聚类方法类训练得到5个bounding boxes,结合Direct location prediction(直接位置预测), 通过对边界框的位置预测进行约束,定位预测值被归一化,使模型更容易稳定训练,这种方式使得模型的 mAP 值提升了约 5%。

1. Anchor size and number
  • Faster RCNN: 9 by hands
  • Yolo2: 5 by K-means [dist: 1 - iou(bbox, cluster)];YOLOv2 采用 k-means 聚类算法对训练集中的边界框做了聚类分析,选用 boxes 之间的 IOU 值作为聚类指标。综合考虑模型复杂度和召回率,最终选择 5 个聚类中心,得到 5 个先验框。
    你想要的一文读懂YOLO系列_第11张图片
  • 共生成13 * 13 * 5 = 845个anchor
  • 发现:用聚类分析得到的先验框比手动选择的先验框有更高的平均 IOU 值,这使得模型更容易训练学习
2. Anchors,True BBoxes & Predicted BBoxes
  • Anchors: anchors[0] = 0.57273, 0.677385, …, 9.77052, 9.16828 [10 numbers]


你想要的一文读懂YOLO系列_第12张图片

  • True BBoxes & Predicted BBoxes:
    • 神经网络在特征图(13 *13 )的每个cell上预测5个bounding boxes(聚类得出的值)
      同时每一个bounding box预测5个值
    • 5个值分别为 tx,ty,tw,th,to,其中前四个是坐标,to是置信度
    • tx,ty 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛
    • (cx,cy)为这个cell距离图像左上角的边距
    • (pw,ph)分别为该cell对应box(bounding box prior)的长和宽
    • 预测值bx,by,bw,bh可以表示为下图:
你想要的一文读懂YOLO系列_第13张图片
3. output of Yolo V2: feature[0:25]
  • 0,1: x,y
  • 2,3: w,h
  • 4: Confidence [IoU]
  • 5~ := Pr(class/Obj)

code:

box_xy = K.sigmoid(feats[...,2])
box_wh = K.exp(feats[..., 2:4])
box_confidence = K.sigmoid(feats[..., 4:5])
box_class_probs = K.softmax(feats[..., 5:])

# Adjust preditions to each spatial grid point and anchor size.
# Note: YOLO iterates over height index before width index.
box_xy = (box_xy + conv_index) / conv_dims
box_wh = box_wh * anchors_tensor / conv_dims

2.2 总结

  • 添加了BN层
  • 加了由聚类算法K-means生成的5中固定anchor,之前是模型输出的anchor,并且在anchor基础上的偏移回归是0~1的数,如上图的σ(tx)、σ(ty)
  • Fine-Grained Features (细粒度特征融合)
  • High Resolution Classifier (高分辨率)
  • Multi-Scale Training (多尺度训练)

Better for small & croded objects

你想要的一文读懂YOLO系列_第14张图片

3. 目标检测之YOLO 3[2018, Joseph]

3.1 改进的地方

3.1.1 New structure,参考了ResNet

你想要的一文读懂YOLO系列_第15张图片

3.1.2 多尺度的网络结构,参考了FPN

  • 每个网格3种大小尺寸的anchor
  • /32,small scale(13 * 13)——>large anchor
  • /16,mid scale(26 * 26)——>medium anchor
  • /8,large scale(52 * 52)——>small anchor
    你想要的一文读懂YOLO系列_第16张图片

3.1.3 改变分类网络

80类,将softmax变为logistic(多标签)

3.1.4 输出维度

  • 每张图有三个输出,故13 * 13 * 3
    你想要的一文读懂YOLO系列_第17张图片

3.1.5 FPN Net[2017, Lin]

你想要的一文读懂YOLO系列_第18张图片

a. 图像本身进行高斯模糊和resize变化,得到图形金字塔,然后对金子塔的每个图进行卷积,蓝色表示卷积后的结果,也可以得到不同尺寸的预测结果(卷积计算太多,已淘汰)
b. 一般卷积工作的情况,随着卷积的深入,特征图尺寸在变小,维度却在加厚,得到更多的高级语义特征,但丢失了像素级别的特征
c. 金字塔级别的特征分层,每一层卷积都拿出来预测,即可参考高级的语义特征,也可参考低级像素特征
d. Feature Pyramid Network(特征金字塔网络)

  • 再增加一层,提高模型的拟合能力
  • 多个不同的值,代表不同尺度的特征。最高层的predict看到的是图像的高级特征;中层的predict既可以看到图像的中级特征,也可以感受到图像的高级特征;而底层得predict图像的全局、中级和底层信息都可以感受到
  • Bottom up, Top down(自低而上,自上而下);和U-Net类似

优势

  • 低层的网络有更多的位置(像素)信息
  • 高层的网络有更多的语义信息
  • FPN将他们融合在一起,和U-Net类似
  • 能够输出多个不同尺度的feature map

你想要的一文读懂YOLO系列_第19张图片

网络细节

  • 3 * 3卷积的目的是为了特征合并的时候减少伪影
  • 乘以2,转置卷积实现后,中间区域产生了一些似棋盘格,明暗相间的图案
  • 特征维度输出为256
  • P2-P6,每个scale(尺寸)每个点的anchor 32^2, ~ , 512^2, 共5种,每种比例为{1:2, 1:1, 2:1},每种尺寸每个点共对应15个anchor

附:
Yolo V1-3代码实现

Yolo V3网络结构图

你想要的一文读懂YOLO系列_第20张图片

你可能感兴趣的:(目标检测,深度学习)