YOLO 来源于Facebook,整个训练和检测过程都是end-to-end的,能够达到实时的目标检测,YOLO v1能够达到每秒45帧的速度,Fast YOLO能够达到每秒155帧的速度,但是YOLO v1存在目标定位不准的问题。
整个检测过程共分为三个步骤进行:首先,将图像缩放至448×448;然后,通过单个卷积神经网络直接从图像中进行目标检测(bounding box)和分类(classification);最后,通过NMS抑制输出最终结果。
具体的实现步骤:首先将Image划分为S×S(S = 7)的格子(grid cell),如果某个目标的中心落入某个格子中,则该格子就负责检测该目标(如下图)。每个grid cell预测B个bounding boxes和C个分类,最终的输出为S×S×( B×5 + C )。每个bounding box是个5维的数据,分别是(x,y,w,h,confidence),其中x表示bounding box的中心横坐标,y表示bounding box的中心纵坐标,w表示bounding box的宽度,h表示bounding box的长度,confidence表示目标的置信值。置信值 = 该格子包含目标的类别概率P × IOU(bounding box的置信度 = truth / pred)。每个格子预测包含某一类目标的概率值,此时类别数C = 20,那么每个格子都要对20个类别的概率进行预测。置信值衡量了某类别i出现在某box中的概率,以及该box与目标i的吻合程度。
在VOC上的训练中,YOLO V1包含24个卷积层,2个全连接层,其中S = 7,B = 2,C = 20,最终的输出为 7*7*( 2*5 + 20 )维的信息(类别概率和矩形框坐标,归一化到0-1)。
相较于YOLO V1,Fast YOLO只包含9个卷积层,因此更快,但是精度有所损失。
YOLO的损失函数,权衡了边界框的损失和类别判断的损失,使得边界框的损失是类别判断损失的10倍,同时兼顾了大的边界框和小的边界框的IOU偏差,使得同样的损失在大框中表现出很小的影响,小框中则变现出很大的影响。
YOLO V1的前20层是卷积层,得到7*7*1024的feature map,然后接3*3的mean pooling,得到7*7*1024的pooling feature map,再接两个全连接层,得到7*7*30的输出。
最后一层给出类别概率和矩形框坐标的预测,将坐标归一化到0-1之间。使用线性激活函数,leaky rectified线性激活函数:
模型误差函数使用 sum-squared error。使用它主要是其优化简单,但是和我们的目标函数不是很匹配。为此我们加入了两个权值参数改善这个情况。
其实回归的输入并不是这些预测的坐标数字,而是预测的坐标对应的feature map中的内容,这个内容与相对于ground truth进行对比,计算,是回归的根本依据。通过不断的训练,得到了回归的参数,在预测时,网络产生了图像的feature map,对于任意一个预测框,背后对应了一个feature 区域,将学习到的参数与此feature区域进行运算,就会得到调整预测框的参数了。因为同类物体的特征应当相似。
基本的逻辑就是对坐标+iou误差、分类误差进行修正。 在训练的时候,每个样本的ground truth的box是知道的,对应于图片的feature map,也能找到在feature map中对应的box位置(box由多个grid cell组合而成)。如果一个grid cell是该物体的中心位置,则这个grid cell负责预测这个物体;每个grid cell都预测了若干个bounding box(假设S = 7,B = 2,则bounding box的数目 = 7×7×2 = 98个),其中会有一个bounding box具有与ground truth的某个box有最大的IOU,则由这个bounding box负责调整box的位置(另外的97个bounding box就忽略了)。
可以想象,一开始的时候,权重是随机的,面对抽象出来的图像的feature map,其预测的bounding box、confidence、物体类别的条件概率都是随机的,经过了loss函数进行惩罚与优化,使得预测行为越来越好。取极端情况为例子加深理解:总是用同一张图片做训练,每次得到的图像的feature map都是一样的。一开始的时候,权重随机,权重与某个grid cell的运算的结果是随机,即每个grid cell对应的5*b+C的数据是随机的。网络对此情况进行优化,指导权重向某个方向优化。第二次看到还是一样的feature map,新的权重与某个grid cell对应的数据进行计算,就会得到更好的box位置和confidence,物体类别的信息。如此反复进行,直到权重参数调整到这样的情况,面对同样的grid cell,其计算出来的box的信息完全与ground box的位置符合,confidence=1,正确类别的条件概率为1。
可以看到修正box的时候,是针对训练的时候,权重与训练图片中的feature map的相应部分进行运算来进行调整的,即:如果在实际应用中,有一个物体,其与训练的图片中的物体很像,那么可以进行好的预测,如果是以一个没有见过的角度去看,那么由于训练时没有对这个角度的feature进行计算与优化,就不会预测好,这与20类物体之外的第21类物体的预测一样。所以,增加训练的样本的多角度很有必要。
同时一个grid cell虽然预测若干个bounding box(实际预测2个bounding box),但只会由那个与ground truth的某物体的box有最大交集的bounding box来负责预测这个grid cell的情况,那么对于比较密集挨在一起物体的情况就会不能预测的现象出现:两只鸟靠的很近,它们的两个ground truth的box,都与某个grid cell有最大的IOU,与其他的grid cell都没有相交,但因为这里有两只鸟,所以,这个grid cell预测的若干个bounding box中,总会与两只鸟分别对应的两个ground truth的box的其中一个有更大的IOU值,就会选到这个较大值IOU的bounding box,负责预测其中的一只鸟,对于另一只鸟,就会忽略。而由于鸟比较小,与其他的grid cell也没有相交,所以这另外的鸟就给忽略掉了,检测就会检测不出来。
将检测变成一个回归问题,不需要复杂的流程。在测试阶段,只需要对测试图像跑一遍神经网络,就可以得到预测结果。该基准网络可以在 Titan X GPU 不经过批处理下得到每秒45帧的处理速度。Fast YOLO可以得到每秒 150 帧。在实时检测系统中,YOLO的效果是最好的。
YOLO 在做出预测时是推理整个图像的。与滑动窗口和候选区域算法不同, YOLO 在训练和测试时,从整个图像综合考虑,不仅分析物体的 appearance 还分析contextual 信息。Fast R-CNN 比较容易将背景误检测为物体,因为它不考虑 contextual 信息。YOLO 把背景误检测为物体的概率不到 Fast R-CNN 的一半.
YOLO 对物体的泛化能力比较好。当在自然图像上训练,在艺术图像上检测时,YOLO的效果要比 DPM 和 R-CNN 好很多。
YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其对于小体积物体的处理上,有待加强。