将整张图像作为网络输入,直接在输出层回归bounding box的位置和所属的类别。
YOLO借鉴了GoogleNet,整个网络包括24个卷积层和2个全连接层,其中卷积层用于提取图像特征,全连接层用来预测图像位置和类别。
1. 将全部输入图像resize到指定大小(448x448)。
2. 将resize后的图像划分成s * s的网格。
3. 预测Bounding box和类别信息得到最终的specificconfidence。
4.设置阈值,滤掉低分的bbox。
5. 使用NMS去除多余框得到预测结果。
由于两个全连接层的存在,因而输入图像尺寸须固定,论文中作者设计的输入尺寸是448x448。
①.若一个物体的中心落在某个单元格上,这该单元格负责检测该物体。(每个单元格分开干活)
②.每个单元格要预测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值以及置信度。
图片分成S × S(7 × 7)个单元格。整张图片的长宽为 h i h_i hi , w i w_i wi。
每个单元格需要预测B个(x,y,w,h,confidence)以及属于C个种类概率值
(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,计算公式如下:
使用上图的前20个卷积层+平均池化+FC层在ImageNet上跑了一圈。(在ImageNet上跑是用的224×224的输入)。
预训练完事后,得到了想要的前20个卷积层权重,在此基础上添加4个卷积层和2个FC层,得到最终模型(也就是上图)。同时将网络的输入尺寸从224×224改成了448×448。
损失函数分为3个部分,每个部分都使用均方误差:
由于每个单元格中不一定都包含物体,当没有物体时,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预测有点偏差就比较受影响了,如下图:
对于这种情况,宽高使用先平方根再求均方误差,尽可能的缩小在小偏差下的影响。
激活函数
最后一层使用的是标准的线性激活函数,其他的层都使用 Leaky ReLU:
学习率
前75个epoch设置为10−2
再30个epoch设置为10−3
最后30个epoch设置为10−4
其他的训练细节:
batch=64
动量0.9,衰减为0.0005
使用dropout,设置为0.5,接在第一个FC层后
对样本做了数据增强
优点:
①. 速度快,YOLO将物体检测作为回归问题进行求解,利用单个网络完成整个检测过程。
②. 召回率低,表现为背景误检率低。YOLO可以get到图像的整体信息,相比于region proposal等方法,有着更广阔的“视野”。
③.泛化能力强。对其他类的东西,训练后效果也是挺好的。
缺点:
①. 由于每个网格只预测一类物体,对于相互靠近的小群体,检测效果不好。
②. 物体的定位精度不高。
目前大部分检测模型都会在ImageNet分类数据集上进行预训练,但是ImageNet的分类模型采用大小为224 * 224的图片作为输入,分辨率相对较低,YOLO V2将分辨率提高到了448 * 448,在ImageNet数据集上训练10轮(10 epochs),使得训练后的网络能够适应高分辨率的输入。然后对检测部分网络进行微调。 这个高分辨率的分类网络增加了将近4%的mAP。
在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都单独预测一套分类概率值。
在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLO V2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
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层以加快收敛速度,降低模型过拟合。
用 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,那么预测的结果见下图右面的公式: