YOLO 是什么?
YOLO (You Only Look Once),是一个用于目标检测的网络。目标检测任务包括确定图像中存在某些对象的位置,以及对这些对象进行分类。以前的方法,比如 R -CNN 和它的变种,使用一个管道在多个步骤中执行这个任务。这可能运行缓慢,也很难优化,因为每个单独的组件都必须单独训练。YOLO,只用一个神经网络就能搞定。原文中提到:
We reframe the object detection as a single regression problem, straight from image pixels to bounding box coordinates and class probabilities.
简单地说,拿一个图像作为输入,通过一个看起来像普通 CNN 的神经网络,你就会得到一个在输出中包含边界框和类别预测的向量。
那么,这些预测是什么样的呢?
预测向量
理解 YOLO 的第一步是如何编码输出。输入图像被分割成一个 S x S 网格单元格。对于图像中出现的每个对象,一个网格单元负责预测它。这就是物体中心所在的单元格。
每个网格单元预测 B 个边界框以及 C 个类别的概率。边界框的预测有 5 个组成部分:(x, y, w, h, confidence)。(x, y)坐标表示框的中心,相对于网格单元格位置 (记住,如果框的中心不落在网格单元格内,则此单元格不负责)。这些坐标被归一化在 0 到 1 之间。(w, h) 框的尺寸也被归一化到[0, 1],相对于图像的大小。让我们来看一个例子:
在边界框预测中还有一个部分,即置信度:
Formally we define confidence as Pr(Object) * IOU(pred, truth) . If no object exists in that cell, the confidence score should be zero. Otherwise we want the confidence score to equal the intersection over union (IOU) between the predicted box and the ground truth.
注意,置信度反映了任何类对象的存在或不存在。
现在我们已经了解了边界框预测的 5 个组成部分,记住每个网格单元做了 B 次这样的预测,所以总共有 S x S x B x 5 个与边界框预测相关的输出。
还需要预测类别的概率 Pr(class (i) |Object)。这个概率取决于包含一个对象的网格单元。在实践中,这意味着如果网格单元中没有对象,损失函数将不会因为错误的类别预测而进行惩罚,我们将在后面看到这一点。一个网络只预测每个单元格的一组类别概率,而与边界框的数量无关。这里会得到总共 S x S x C 个类别概率。
将类别预测加到输出向量中,我们得到一个 S x S x (B x 5 +C)的张量作为输出。
网络
一旦你理解了预测是如何编码的,剩下的就很简单了。网络结构看起来像一个普通的 CNN,有卷积层和最大池化层,最后是两个全连接层:
关于框架:
-
注意,该体系结构是为 Pascal VOC 数据集而设计的,其中作者使用了 S =7、B= 2 和 C =20。这解释了为什么最终的 feature map 是 7 ×7,也解释了输出的大小(7x7x(2*5+20))。使用具有不同网格大小或不同数量的类别的网络可能需要调整维度。
-
作者提到有一个快速版本的 YOLO,有更少的卷积层。不过上面的表格展示的是完整的版本。
-
1×1 简化层和 3 ×3 卷积层的部分主要是根据 GoogLeNet (Inception)模型得到的启发
-
最后一层使用线性 ** 函数。而所有其他层使用 leaky RELU(如果 x > 0,Φ(x)= x,否则为 0.1x)
需要学习更多内容的小伙伴,可以到视频中跟着老师学习哦~
原文链接:https://www.bilibili.com/read/cv12184990