YOLOv1为one stage的开山之作,速度快,但精度不高,特别是对比同年发表的SSD来说。
网络结构简单,输入图像后经过一系列的卷积层得到7x7x1024的张量,再经过flatten拉直,通过第一个全连接网络输出4096维向量,再通过一个全连接输出1470维向量,reshape为7x7x30的张量
7x7代表将图片分为49个格,30=(5x2+20),5分别4个预测的bounding box坐标,1为置信度,置信度就为预测框和GT box的IOU大小。一个网格得到两个预测框,一个网格预测20个类别。
下图为计算某对象i属于类别 同时在第j个边界框中的得分
下图为损失函数,其中预测的宽和高都带了根号,是因为如果是同样大小的偏差,对于宽和高小的box来说IOU更低,所以损失函数中强调了对于小box的损失,更关注小物体的偏差。
定位误差比分类误差更大,所以增加对定位误差的惩罚,使λcoord=5。
在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使λnoobj=0.5
预测
YOLO最后采用非极大值抑制(NMS)算法从输出结果中提取最有可能的对象和其对应的边界框。
输入一张图片到YOLO网络将输出一个7730的张量表示图片中每个网格对应的可能的两个边界框以及每个边界框的置信度和包含的对象属于各个类别的概率。由此可以计算某对象i属于类别 同时在第j个边界框中的得分:
每个网格有20个类条件概率,2个边界框置信度,相当于每个网格有40个得分,7x7个网格有1960个得分,每类对象有1960/20=98个得分,即98个候选框。
NMS步骤如下:
1.设置一个Score的阈值,一个IOU的阈值;
2.对于每类对象,遍历属于该类的所有候选框,
①过滤掉Score低于Score阈值的候选框;
②找到剩下的候选框中最大Score对应的候选框,添加到输出列表;
③进一步计算剩下的候选框与②中输出列表中每个候选框的IOU,若该IOU大于设置的IOU阈值,将该候选框过滤掉,否则加入输出列表中;
④最后输出列表中的候选框即为图片中该类对象预测的所有边界框
3.返回步骤2继续处理下一类对象。