摘要:我们又提出了一种目标检测的新方法啦,叫做yolo。之前呢,我们主要是利用分类器来做目标检测这个工作。然而,本文将目标检测作为对空间上分立的bboxes和联合的类别概率的回归问题。单个神经网络在一次评估中直接从全图预测bboxes和类概率。由于整个检测流水线是一个单一的网络,所以它可以根据检测性能直接进行端到端优化。 我们的统一架构非常快速。我们的base模型以每秒45帧的速度实时处理图像。一个较小的网络版本,fast yolo,每秒处理令人震惊的155帧,同时仍然达到其他实时检测系统的两倍。与先进的检测系统相比,yolo发生更多的定位错误,但误检背景为目标的可能性更小。最后,yolo的泛化性能很好,当从自然图像推广到其他领域时,比如艺术品,它的表现优于其他检测方法,包括dpm和r-cnn。
1 introduction
我们将对象检测重构为一个单一的回归问题,直接从图像像素到边界框坐标和类概率。使用我们的系统,您只需要看一次(Yolo)图像来预测存在哪些对象以及它们在哪里。
1、我们的基本网络以每秒45帧的速度运行,在泰坦x GPU上没有批处理,快速版本运行在150英尺以上,也比别的实时检测系统要准确一0倍。
2、不像faster这些基于rpn的方法,yolo在训练和测试期间看到整个图像,所以它其实隐式编码了类别及其外观的上下文信息。表现在yolo产生的背景错误要少于faster的一半。
3、泛化性能很好。
YOLO仍然落后于最先进的检测系统的准确性。虽然它能快速识别图像中的物体,但它难以精确地定位某些物体,尤其是小物体,需要权衡精度和速度。
2 原理
1、网络架构:
网络架构来源于GoogleNet,但inception模块使用1*1降维层和3*3卷积层简单地代替。网络最初的24个卷积层用于提取图像的特征,而最后的两个全连接层(第一个全连接层使预测使用了来自全图的特征)用于预测输出的概率和坐标。
我们使用leaky Relu作为激活函数,防止梯度爆炸;
运用起来算一算不同cnn架构的输出形状,参数个数,内存占用量,感受野。
448*448 为什么分成7*7?????算一算上面这些量。最后一层卷积层感受野781;全连接图达到全图感受野1165(很大一部分是padding的感受野);
感受野计算:RF (l+1)= RF(l) + (kernel_size(l+1) - 1)*feature_stride(l) *(dilation(l+1) - 1)
特别注意:strides是之前所有层stride的乘积。 即strides(i) = stride(1) * stride(2) * ...* stride(i-1)
2、检测流程细节:
系统将输入图像分割为7*7的网格,如果目标的中心落入某个grid cell,则它就负责检测这个目标,也就是这个grid cell的两个bbox的P(object)=1。 每个grid cell可以预测两个bbox(数据集voc时,这个很可能是一个实验值,通过效果决定的),每个bbox的预测包括:box中心x,y(对grid cell中心的offset,也相对grid cell尺寸进行了归一化),和box宽高相对整图宽高的归一化值(Wbox/Wimage),以及box包含目标且预测准确的置信度(P(object)*IOU truth,gt)。每个grid cell还会预测P(Class i |object),作为它预测的两个bbox的类别概率值。置信度与类别概率相乘作为最终的每个bbox的特定类别置信度。 在test时就能够通过过滤低分和NMS操作得到最终的预测框信息。
检测训练过程中真值的计算:网络直接从全局上对图像和图中所有对象进行推理,使yolo能够进行端到端的训练和实时的检测。其中卷积层用于提取图像的特征,最后一层负责预测类别置信概率和边框坐标。类别置信概率来自 bbox的置信度*bbox所属grid预测C类概率,而bbox的置信度(Ci)又来自 bbox包含目标与否(取决于物体中心是否落在bbox对应的grid cell中)*bbox和gt的iou(测试时置信度直接作为一个预测值,训练时需要根据真实框和预测框进行计算)。在每一次迭代中,(初始化或迭代后的)网络会预测出7*7*2个bbox的位置和置信度以及7*7个grid cell的20个(不包含背景的分类)类别概率(bbox的类别概率就以bbox中心对应的grid cell的类别概率作为近似),而训练数据的每个grid cell类别概率已知,目标真实的位置(x,y,w,h)已知,置信度真值为根据目标中心落在bbox对应的grid cell与否得到P(object)*预测框位置和真实目标位置的iou(需要在网络的每一步迭代计算),从而计算出每次迭代后的网络的loss(注意loss中坐标回归中,只有与truth的iou最大的那个bbox负责,作者提到,这将导致b个预测器之间的专业化。每个预测器在预测特定大小、纵横比或对象类别方面都会变得更好,从而提高总体回忆能力。),进而反向传播进行参数优化。
3、loss函数理解
如图yolo的训练loss所示,使用误差平方和作为优化目标,但这对于我们想要最大化平均准确率的目标存在几个问题:1、坐标误差和置信度,类别误差权重相同。2、置信度损失中的正负样本不平衡,负样本占大多数。因此,增加了包围盒坐标预测的损失,并减少了对于不包含对象的框的置信度预测的损失权重。
还有一个问题,就是对不同尺度的检测框坐标误差给以了相同的权重,这对于小的检测框是不公平的,因为相同的误差对小尺度检测框有更大的影响。论文选择回归宽高的平方根以部分解决这个问题。
特别注意:损失函数只惩罚存在一个对象的网格单元中分类错误(前面讨论过的条件类概率)。它也只对在该网格单元中所有预测器中有最高的IOU的“负责”预测器的边框坐标错误进行惩罚。
4 训练方法:
前20层卷积层+1*average pooling +1*全连接层 预训练: ImageNet的1000类分类数据
根据detection networks on convolutional feature maps文章,在与训练模型上加上卷积和连接层能够提升性能,因此作者加上了随机初始化的4层卷积层和两个全连接网络(原来用于分类的全连接层当然就不再需要了)。 输入图像大小448*448
具体训练过程: