yolo的全称是you only look once, 意思是一次性把候选框和目标识别搞定,因此,与RCNN这类用Region Proposals方法提出候选框的算法相比,要快很多。我在看v1的文章的时候,我觉得最让我懵逼是v1的bbox是怎么计算的,loss怎么设计的.因此,本文章只对这两个点详细描述.
yolov1如何产生和确定bbox
与selective search的方法不同,yolov1的候选框选择要粗暴很多.为了更好的解释,我借用知乎文章上面的yolov1网络输入输出映射图.
在v1的版本中,图像输入分辨率固定成,并且被均匀分成个的格子,每个格子长的就是左边左上角的那个正方体了.每个正方体进过神经网络训练后,在最后一层输出一个30维的向量,候选框的信息就包含在30维的向量中.由于有49个格子,那么网络的输出就是的张量.
再具体分析一下每个30维向量都包含什么信息,实际上包括2个bounding box的位置(一个bounding box用 center_x, center_y, w,h,4个数值表示,两个bounding box占了8个位置),2个bbox 置信度(稍后解释),预测20个类别的概率(V0C 20类数据).8+2+20刚好就是30.
一开始神经网络训练的时候,没有预先设定bbox的大小和形状,神经网络的工作仅仅对每个格子预测出2个bbox(见上图右下角正方体的两个虚线框),也就是上面提到的30维向量里面的8个,然后选择预测得相对比较准(分别计算前向计算2个bbox 与boxground truth的 IOU,取IOU较大的那个bbox)的那个。
所以一开始,神经网络输出的bbox是乱七八糟,只是在训练的过程中,通过计算IOU,loss值,慢慢让这个杂乱的候选框慢慢变得靠谱起来,每个bbox逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等).
yolov1 loss的设计
解释清楚了loss的计算过程,那么就已经了解v1的贡献了.v1的loss大体来说包括回归损失, 分类损失, 置信度损失三个部分.为了下面解释公式方便,以下公式中,同一个字母代表同个意思.
v1把输入图像切成7*7个cell,S= 7,v1使用voc数据集,预测20个类别,c表示类别,取值(0,20).
分类损失
如果检测到物体,那么每个cell 的分类损失是每个分类的条件概率平方误差和.
如果 检测到物体,那么 ,否则, 是 分类为的条件概率.
每个grid cell为会所有的分类都有一个概率,此处20个分类,会有20个概率。这个值也就是上文提到30维向量中的20.虽然每个cell 都是预测两个bbox ,不过它们是共享20个类别概率.
回归损失
回归损失计算的是预测的bbox位置与实际尺寸的误差。
如果 包含预测对象,那么,否则为0。注意,其中的,是相对于当前cell的偏移量。v1不是直接预测bbox的高宽,而是宽的二次方根和高的二次方根。这样做的目的是减少大的bbox和小的bbox带来的不公平。举个例子来说,对于一个和的目标都预测大了10个像素,如果不用根号,那么大的目标和小的目标的损失都为200.显然,我们能接受大的目标大于10个像素,不能接受小的目标预测大了一倍。加了根号之后,小的目标损失是,大的目标损失为.这个是我们期望的。
置信损失
公式中的C为confidence,是上文提到30维向量中的2维. 表示目标的中心是否出现在网格单元中,表示网格单元中的第i个边界框预测器“负责”该预测,第i个边框的confidence 计算公式。
如果某个物体在box中被检测到,其置信度损失(衡量的是box中的物体),是预测与groundtruth 的IOU.
如果某个物体不在box中,其置信度损失为,.同样的,的一种补充。降低背景检测损失的权重(noobj即背景) 。因为大部分cell不包含任何物体,这会导致分类(正负样本)的不均衡。(Retinanet网络提出解决正负样本不均衡问题)因此,我们降低了背景检测损失的权重,即默认值为0.5。
图片参考:https://zhuanlan.zhihu.com/p/46691043