目标检测(二)------ one stage(YOLO)

1. YOLO V1

1.1 YOLO V1的核心思想

将整张图像作为网络输入,直接在输出层回归bounding box的位置和所属的类别。

1.2 YOLO V1的网络结构

YOLO借鉴了GoogleNet,整个网络包括24个卷积层和2个全连接层,其中卷积层用于提取图像特征,全连接层用来预测图像位置和类别。
目标检测(二)------ one stage(YOLO)_第1张图片

1.3 YOLO V1 的处理过程

目标检测(二)------ one stage(YOLO)_第2张图片
1. 将全部输入图像resize到指定大小(448x448)。
2. 将resize后的图像划分成s * s的网格。
3. 预测Bounding box和类别信息得到最终的specificconfidence。
4.设置阈值,滤掉低分的bbox。
5. 使用NMS去除多余框得到预测结果。

1.3.1 YOLO V1的输入

由于两个全连接层的存在,因而输入图像尺寸须固定,论文中作者设计的输入尺寸是448x448。

1.3.2 单元格的划分

将图像划分为s × s个单元格(论文中s = 7)。
目标检测(二)------ one stage(YOLO)_第3张图片

1.3.3 每个单元格的作用

①.若一个物体的中心落在某个单元格上,这该单元格负责检测该物体。(每个单元格分开干活)
②.每个单元格要预测B个Bounding box(论文中b = 2),(每个Bounding box值包括坐标、宽、高),同时为每个Bounding box预测一个置信度。即每个Bounding box要预测(x, y, w, h)、置信度这5个值。
③.每个单元格要预测C(物体种类个数)个类别,因而总的输出out = s * s * (5 * B + C)
论文中,s = 7, B = 2, C = 20 ==> out = 7 * 7 * 30
由上可知:
1. 每个单元格只能预测一种物体,并给出属于该类别的概率。
2. 每个单元格可以预测多个Bounding box值以及置信度。

1.3.4 单元格预测的数据解析

图片分成S × S(7 × 7)个单元格。整张图片的长宽为 h i h_i hi , w i w_i wi
每个单元格需要预测B个(x,y,w,h,confidence)以及属于C个种类概率值
目标检测(二)------ one stage(YOLO)_第4张图片(x, y)含义
对于蓝色的单元格,其坐标为( x c o l x_{col} xcol = 1 , y r o w y_{row} yrow = 4)。假设它预测的是红色的Bounding box(假设中心坐标为( x c , y c x_c, y_c xc,yc)),那么最终预测出来的(x,y)是经过归一化处理的,表示的是中心相对于单元格的offset,计算公式如下:

x = x c w i S − x c o l   ,   y = y c h i S − y r o w x = \frac{x_c}{w_i}S-x_{col} \ , \ y = \frac{y_c}{h_i}S-y_{row} x=wixcSxcol , y=hiycSyrow

(w, h)的含义
预测的Bounding box宽高为 w b , h b w_b, h_b wb,hb,(w, h)表示的是Bounding box的宽高相对于整张图像的占比,计算公式如下:
w = w b w i   ,   h = h b h i w=\frac{w_b}{w_i} \ , \ h=\frac{h_b}{h_i} w=wiwb , h=hihb

Confidence
置信度有两个含义:
1.单元格内是否有物体。
2.Bounding box的准确度。

定义置信度为 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU_{pred}^{truth} Pr(Object)IOUpredtruth
若单元格内有物体,则 P r ( O b j e c t ) = 1 Pr(Object)=1 Pr(Object)=1, 此时置信度为预测的bounding box 和实际的 groundtruth 之间的 IoU 值。
若单元格内没有物体,则 P r ( O b j e c t ) = 0 Pr(Object)=0 Pr(Object)=0,此时置信度为0。
C个种类的概率值
每个单元格给出Bounding box值和置信度时,还需给出每个网格存在物体的类型。(每个单元格只能预测一种物体类别)
P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject)

在检测目标时,我们把confidence做处理:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U p r e d t r u t h = P r ( C l a s s i ) ∗ I o U p r e d t r u t h Pr(Class_i|Object) * Pr(Object)*IoU_{pred}^{truth}=Pr(Class_i)*IoU_{pred}^{truth} Pr(ClassiObject)Pr(Object)IoUpredtruth=Pr(Classi)IoUpredtruth

这就是每个单元格的class-specific confidence scores,这即包含了预测的类别信息,也包含了对bbox值的准确度。 我们可以设置一个阈值,把低分的class-specific confidence scores滤掉,剩下的塞给非极大值抑制,得到最终的标定框。

1.4 预训练

目标检测(二)------ one stage(YOLO)_第5张图片使用上图的前20个卷积层+平均池化+FC层在ImageNet上跑了一圈。(在ImageNet上跑是用的224×224的输入)。
预训练完事后,得到了想要的前20个卷积层权重,在此基础上添加4个卷积层和2个FC层,得到最终模型(也就是上图)。同时将网络的输入尺寸从224×224改成了448×448。

1.5 YOLO V1的训练

1.5.1 损失函数

损失函数分为3个部分,每个部分都使用均方误差:
目标检测(二)------ one stage(YOLO)_第6张图片由于每个单元格中不一定都包含物体,当没有物体时,confidence就会变成0,这样在优化模型时可能会让梯度跨越太大,模型不稳定跑飞了。为了平衡这一点,在损失函数中,设置两个参数 λ c o r r d λ_corrd λcorrd λ n o o b j λ_noobj λnoobj,其中 λ c o r r d λ_corrd λcorrd控制bbox预测位置的损失, λ n o o b j λ_noobj λnoobj控制单个格内没有目标的损失。

bbox
对于预测的bbox框,大的bbox预测有点偏差可以接受,而小的bbox预测有点偏差就比较受影响了,如下图:
目标检测(二)------ one stage(YOLO)_第7张图片
对于这种情况,宽高使用先平方根再求均方误差,尽可能的缩小在小偏差下的影响。

中心点损失: λ c o r r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] \lambda_{corrd}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{I}_{ij}^{obj}\left [(x_i-\hat{x_i})^2+(y_i-\hat{y_i})^2 \right ] λcorrdi=0S2j=0BIijobj[(xixi^)2+(yiyi^)2]

I i j o b j \mathbb{I}_{ij}^{obj} Iijobj表示第i个单元格预测的第j个Bounding box是否负责该object,bbox与ground truth的IoU值最大的负责object。
confidence
根据单元格中是否含有物体将置信度分为两部分进行计算,对于不包含object的单元格,利用 λ n o o b j λ_noobj λnoobj调整比例,防止过大的梯度跨越。
∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{I}_{ij}^{obj}(C_i-\hat{C_i})^2+\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{I}_{ij}^{obj}(C_i-\hat{C_i})^2 i=0S2j=0BIijobj(CiCi^)2+λnoobji=0S2j=0BIijobj(CiCi^)2

categories
由于每个单元格只负责一个object的预测,故不需要考虑B个bbox,其损失函数为:
∑ i = 0 S 2 I i o b j ( p i ( c ) − p i ^ ( c ) ) 2 \sum_{i=0}^{S^2}\mathbb{I}_{i}^{obj}(p_i(c)-\hat{p_i}(c))^2 i=0S2Iiobj(pi(c)pi^(c))2

1.5.2 训练细节

激活函数
最后一层使用的是标准的线性激活函数,其他的层都使用 Leaky ReLU:

ϕ ( x ) = {   x ,       i f   x > 0 0.1 x   ,     o t h e r e l s e \phi(x)= \begin{cases}  x ,    if   x>0\\ 0.1x   ,   otherelse \end{cases} ϕ(x)={ x,   if x>00.1x ,  otherelse

学习率
前75个epoch设置为10−2
再30个epoch设置为10−3
最后30个epoch设置为10−4

其他的训练细节:
batch=64
动量0.9,衰减为0.0005
使用dropout,设置为0.5,接在第一个FC层后
对样本做了数据增强

1.6 YOLO V1的优缺点

优点:
①. 速度快,YOLO将物体检测作为回归问题进行求解,利用单个网络完成整个检测过程。
②. 召回率低,表现为背景误检率低。YOLO可以get到图像的整体信息,相比于region proposal等方法,有着更广阔的“视野”。
③.泛化能力强。对其他类的东西,训练后效果也是挺好的。
缺点:
①. 由于每个网格只预测一类物体,对于相互靠近的小群体,检测效果不好。
②. 物体的定位精度不高。

2. YOLO V2

2.1 YOLO V2的改进策略

2.1.1 Batch Normalization(BN层)
2.1.2 High Resolution Classifier(高分辨率分类器)

目前大部分检测模型都会在ImageNet分类数据集上进行预训练,但是ImageNet的分类模型采用大小为224 * 224的图片作为输入,分辨率相对较低,YOLO V2将分辨率提高到了448 * 448,在ImageNet数据集上训练10轮(10 epochs),使得训练后的网络能够适应高分辨率的输入。然后对检测部分网络进行微调。 这个高分辨率的分类网络增加了将近4%的mAP。

2.1.3 Convolutionlal With Anchor Boxes

在YOLO V1中,输入图片被分为7 * 7单元格,每个单元格预测2个边界框。YOLO v1最后采用的是全链接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比的物体,YOLO V1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLO v1在精确定位方面表现较差。
YOLO V1 与YOLO V2的区别
YOLO V2借鉴了Faster R-CNN中RPN网络的anchor boxes策略。移除了YOLO V1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,去掉了其中一个pool层。
在检测模型中,YOLOv2不是采481418图片作为输入,而是采用416416大小。因为YOLOv2模型下采样的总步长为32,对于416416大小的图片,最终得到的特征图大小为1313,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以在YOLOv2设计中要保证最终的特征图有奇数个位置。
对于YOLO V1每个单元格预测2个bounding-box,每个box包含(x, y, w, h)以及置信度这5个值,但是每个单元格只预测了一套分类概率值供2个box共享。而YOLO V2的每个anchor box都单独预测一套分类概率值。

2.1.4 Dimension Clusters(尺寸聚类)

在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLO V2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
在这里插入图片描述

2.1.5 New Network:Darknet-19

YOLO V2采用了一个新的基础模型,称为Darknet-19,包括19个卷积层和5个maxpooling层。Darknet-19与VGG16模型设计原则是一致的,主要采用3 * 3卷积,采用2 * 2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。
Darknet-19采用了全局平均池化做预测,并且在3 * 3卷积之后使用了1 * 1卷积来降维,减少计算量。
Darknet-19每个卷积层之后使用了BN层以加快收敛速度,降低模型过拟合。
目标检测(二)------ one stage(YOLO)_第8张图片

2.1.6 Direct location prediction(直接位置预测)

用 Anchor Box 的方法,会让 model 变得不稳定,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测 Box 的(x,y)位置的时候。按照之前 YOLO的方法,网络不会预测偏移量,而是根据 YOLO 中的网格单元的位置来预测坐标,这就让 Ground Truth 的值介于 0 到 1 之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation 来对于网络预测结果进行限制,让结果介于 0 到 1 之间。 网络在每一个网格单元中预测出 5 个 Bounding Boxes,每个 Bounding Boxes 有五个坐标值 tx,ty,tw,th,t0,他们的关系见下图(Figure3)。假设一个网格单元对于图片左上角的偏移量是 cx、cy,Bounding Boxes Prior 的宽度和高度是 pw、ph,那么预测的结果见下图右面的公式:
目标检测(二)------ one stage(YOLO)_第9张图片

2.1.7 Fine-Grained Features (细粒度特征)

你可能感兴趣的:(深度学习)