yolo原理

网络结构:

YOLO检测网络包括24个卷积层和2个全连接层,其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。
继承googlenet
yolo原理_第1张图片
end-to-end网络
区别于
yolo原理_第2张图片
通过region proposal产生大量的可能包含待检测物体的 potential bounding box,再用分类器去判断每个 bounding box里是否包含有物体,以及物体所属类别的 probability或者 confidence,如R-CNN,Fast-R-CNN,Faster-R-CNN等。
它将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box 的坐标、box中包含物体的置信度和物体的probabilities。因为YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。

输出

经过神经网络前向传播,输出S*S(5*B+C)维度的张量
SxS个格子每个格子输出:
C个物体conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。
以及B个bounding box(包含物体的矩形区域)信息(x,y,w,h,和confidence)。

这里写图片描述
(全连接层输出特征向量)

confidence = P(object)* IOU

P(object)=1或0(物体的中心坐标落入到格子内)
IOU(intersection over union):box与物体真实区域的交叠率(以像素为单位)。
x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。
w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内

注:

由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
虽然每个格子可以预测B个bounding box,但是最终只选择IOU最高的bounding box作为物体检测输出,
即每个格子最多只预测出一个物体。
当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
这是YOLO方法的一个缺陷。

检测

过程:
1、将图像resize到448 * 448作为神经网络的输入
2、运行神经网络,输出得到一些bounding box坐标、box中包含物体的置信度和class probabilities
3、进行非极大值抑制,筛选Boxes
yolo原理_第3张图片
4.根据类别概率,选择每个栅格的类别,得到类分布图
yolo原理_第4张图片
5、在挑选的bbox中,类分布图中类最多的,为bbox中的类别
yolo原理_第5张图片

Loss函数定义

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的S*S*(B*5 + C)维向量与真实图像的对应S*S*(B*5 + C)维向量的均方和误差(sum-squared error)。如下式所示。其中,coordError、iouError和classError分别代表预测数据与标定数据之间的坐标误差、IOU误差和分类误差
这里写图片描述
YOLO对上式loss的计算进行了如下修正。
[1] 位置相关误差(坐标、IOU)与分类误差对网络loss的贡献值是不同的(8维的localization error和20维的classification error同等重要显然是不合理的),因此YOLO在计算loss时,使用lambda_coord =5修正coordError。
[2] 在计算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值是不同的。
若采用相同的权值,那么不包含物体的格子的confidence真实值为0,此时我们希望预测含有物体的置信度Ci越小越好。
然而,大部分边界框都没有物体,积少成多,造成loss的第3部分与第4部分的不平衡,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。因此,才在loss的三部分增加权重lambda_noobj =0.5修正iouError。
[3]对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。
例如,一个同样将一个100x100的目标与一个10x10的目标都预测大了10个像素,预测框为110 x 110与20 x 20。显然第一种情况我们还可以失道接受,但第二种情况相当于把边界框预测大了一倍,但如果不使用根号函数,那么损失相同,都为200。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。(注:这个方法并不能完全解决这个问题)。

综上,YOLO在训练过程中Loss计算如下式所示:
yolo原理_第6张图片

这里写图片描述
注:

  • YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。

  • YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。

  • YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

训练

首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20 个卷积层,加上一个 average-pooling layer,最后加一个全连接层,作为 Pretrain 的网络。训练大约一周的时间,使得在ImageNet 2012的验证数据集Top-5的精度达到 88%,这个结果跟 GoogleNet 的效果相当。

将Pretrain的结果的前20层卷积层应用到Detection中,并加入剩下的4个卷积层及2个全连接。
同时为了获取更精细化的结果,将输入图像的分辨率由 224* 224 提升到 448* 448。
将所有的预测结果都归一化到 0~1, 使用 Leaky RELU 作为激活函数。
为了防止过拟合,在第一个全连接层后面接了一个 ratio=0.5 的 Dropout 层。
为了提高精度,对原始图像做数据提升。

效果

YOLO具有如下优点:

  • 快。YOLO将物体检测作为回归问题进行求解,整个检测网络pipeline简单。在titan x GPU上,在保证检测准确率的前提下(63.4% mAP,VOC 2007 test set),可以达到45fps的检测速度。
    背景误检率低。YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region proposal的物体检测方法(如rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO对于背景图像的误检率低于fast rcnn误检率的一半。

  • 通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

但相比RCNN系列物体检测方法,YOLO具有以下缺点:

  • 识别物体位置精准性差。
  • 召回率低。
    reference
    很好https://blog.csdn.net/hrsstudy/article/details/70305791
    https://blog.csdn.net/hhhh222222/article/details/77715358
    https://www.cnblogs.com/makefile/p/YOLOv3.html

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