YOLO把目标检测问题简化成了一个回归问题,直接从图像像素出发,去得到框和分类概率。YOLO结构非常简单,如下图所示。
一、算法流程
YOLO用整个图片的特征去预测每一个边界框。它还同时预测一个图像在所有类中的所有边界框。YOLO先把整个图片划分成S*S个方格,如果一个物体的中心正好落在一个方格中,那么这个方格就负责来预测物体。每一个方格预测出B个边界框和这些框的置信分数。这些表示方格包含物体的准确度和产生的框精确的程度。输出就是S x S x (5*B+C)的一个tensor。
分数计算公式如下图所示。其中如果有object落在一个方格里,第一项取1,否则取0。每一个边界框有5个参数需要预测,x,y,h,w,confidence。(x,y)表示的是框的中心点坐标,和方格的边界有关。(h,w)表示的是框的宽度的高度,和整个图片有关。Confidence就代表预测框和标签框的IOU。
每一个方格预测C个条件类别概率。只预测每一个方格上一系列的分类概率,不管B个边界框是怎么样的。在测试时,将条件类概率和单个框的置信度预测相乘,如下面公式所示。这个公式给出了每一个框的特定类别的置信度分数。这些分数反映了一个类别出现在一个框的可能性和预测框和物体的匹配程度。
二、网络结构
网络结构如下图所示。文章用了GoogLeNet 作为神经网络主干,24层卷积层加上两层全连接层,最后得到7*7*30的tensor。在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。
在这个网络结构中,有7*7个方格,每个方格有30维度的向量,8维是回归box的坐标,2维是box的confidence,还有20维是类别。 其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。
三、损失函数
损失函数如下图所示。
这个损失函数中:
(1)只有当某个网格中有object的时候才对classification error进行惩罚。只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error。
(2)进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。
四、实验结果
五、总结
YOLO对整张图片进行训练,检测速度非常快。精度也比较高,但是它也存来一些问题。YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。