论文笔记:YOLOv1

针对当前目标检测速度慢而无法做到实时检测的问题,作者提出了YOLO。YOLO直接将目标检测转化到回归问题上,直接用一张图片得到bounding box和类别。

作者提出YOLO的优点:

1、YOLO检测物体非常快。
因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。

2、YOLO可以很好的避免背景错误,产生false positives。
不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。

3、YOLO可以学到物体的泛化特征。
当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。

算法如下:

对于一张图片,分为S*S个grid cell,如果物体的中心落入一个cell,则该cell负责检测物体。每一个cell预测B个bounding box和这些box的confidence score。定义confidence score为Pr(Object)∗IOU_{pred}^{truth}。如果该单元格中不存在目标,则confidence score应为零。否则,我们希望confidence score等于预测框与ground truth之间的IOU。每个bounding box输出(x,y,w,h,confidence)。x,y为box中心在对应cell的位置。C代表着每个cell预测的类别数量,每个cell会对C个类别分别于测可能性。最后总预测为S*S*(B*5+C)的张量。

网络架构受GoogLeNet启发但没有使用inception module,共24层,前22层用来提取特征,后2层全连接层用来预测。

在ImageNet分类任务上以一半的分辨率(224×224)预训练卷积层,然后将分辨率加倍来进行检测。(不太懂为什么要分辨率减半来训练。。。)

训练时采用平方和误差,因为容易优化。考虑到大多数单元格不包含对象而confidence为0,会对梯度造成影响而使模型不稳定,因此做了一些修改。增加边界框坐标预测损失,并减少了不包含目标边界框的置信度预测损失。我们使用两个参数\lambda _{coord}\lambda _{noobj}来完成这个工作。我们设置\lambda _{coord}=5\lambda _{noobj}=0.5。平方和误差也可以在大盒子和小盒子中同样加权误差。我们的错误指标应该反映出,大盒子小偏差的重要性不如小盒子小偏差的重要性。为了部分解决这个问题,我们直接预测边界框宽度和高度的平方根,而不是宽度和高度。

YOLO每个网格单元预测多个边界框。在训练时,每个目标只需要一个边界框预测器来负责。选择与ground truth之间具有当前最高的IOU的bounding box来预测目标。这导致边界框预测器之间的专业化。每个预测器可以更好地预测特定大小,方向角,或目标的类别,从而改善整体召回率。

损失函数:

如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误。如果预测器“负责”实际边界框(即该网格单元中具有最高IOU的预测器),则它也仅惩罚边界框坐标错误。

对于一些大目标或者中心靠近多个网格边界线的目标会被几个网格定位,这里用非极大值抑制方法修正多重检测。

由于一个cell只预测两个bounding box,一个物体,而高层的感受野很大,所以在小目标聚集的时候难以得到正确的bounding box。小目标在卷积和池化过程中损失了一部分信息,因而YOLO在检测小目标时表现不太好。

因为这一部分内容之前在吴恩达的deeplearning课程中有过学习有些内容没有详述,学习笔记https://blog.csdn.net/stezio/article/details/81152416

看到一篇写的很好的https://blog.csdn.net/hrsstudy/article/details/70305791

猜你喜欢

转载自blog.csdn.net/stezio/article/details/81707274