美文网首页
yolov1网络理解

yolov1网络理解

作者: miahuang | 来源:发表于2019-10-04 20:17 被阅读0次

    yolo的全称是you only look once, 意思是一次性把候选框和目标识别搞定,因此,与RCNN这类用Region Proposals方法提出候选框的算法相比,要快很多。我在看v1的文章的时候,我觉得最让我懵逼是v1的bbox是怎么计算的,loss怎么设计的.因此,本文章只对这两个点详细描述.

    yolov1如何产生和确定bbox

    与selective search的方法不同,yolov1的候选框选择要粗暴很多.为了更好的解释,我借用知乎文章上面的yolov1网络输入输出映射图.

    输入-输出.png

    在v1的版本中,图像输入分辨率固定成448*448,并且被均匀分成7*7个的格子,每个格子长的就是左边左上角的那个正方体了.每个正方体进过神经网络训练后,在最后一层输出一个30维的向量,候选框的信息就包含在30维的向量中.由于有49个格子,那么网络的输出就是7*7*30的张量.

    30维向量输出.png

    再具体分析一下每个30维向量都包含什么信息,实际上包括2个bounding box的位置(一个bounding box用 center_x, center_y, w,h,4个数值表示,两个bounding box占了个位置),个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 的分类损失是每个分类的条件概率平方误差和.
    Loss =\sum_{i=0}^{S^2}\sum_{j=0}^ BI_{ij}^{obj}\sum{c \in classes}(p_{i}(c)- \hat{p}(c))^2

    如果 cell i 检测到物体,那么I_{ij}^{obj}=1 ,否则I_{ij}^{obj}=0, \hat p_{i}(c)cell i 分类为c的条件概率.

    每个grid cell为会所有的分类都有一个概率,此处20个分类,会有20个概率。这个值也就是上文提到30维向量中的20.虽然每个cell 都是预测两个bbox ,不过它们是共享20个类别概率.

    回归损失

    回归损失计算的是预测的bbox位置与实际尺寸的误差。

    \lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^ BI_{ij}^{obj}((x_i- \hat {x_i})^2+(y_i- \hat {y_i)}^2)+ \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^ BI_{ij}^{obj}[(\sqrt w_i - \sqrt{ \hat {w_i}})^2+(\sqrt {h_i}- \sqrt {\hat h_i})^2])
    如果cell i 包含预测对象,那么I_{ij} ^{obj}=1,否则为0。注意,其中的\hat {x},\hat {y}是相对于当前cell的偏移量。v1不是直接预测bbox的高宽,而是宽的二次方根和高的二次方根。这样做的目的是减少大的bbox和小的bbox带来的不公平。举个例子来说,对于一个100*10010*10的目标都预测大了10个像素,如果不用根号,那么大的目标和小的目标的损失都为200.显然,我们能接受大的目标大于10个像素,不能接受小的目标预测大了一倍。加了根号之后,小的目标损失是(\sqrt 20 - \sqrt 10)^2=3.43,大的目标损失为(\sqrt (110) -\sqrt(100))^2= 0.48.这个是我们期望的。

    置信损失

    \sum_{i=0}^{S^2}\sum_{j=0}^BI_{ij}^{obj}(C_{i}- \hat{C_{i}})^2 + \lambda _{noobj} \sum_{i=0}^{S^2}\sum_{j=0}^BI_{ij}^{noobj}(C_{i}- \hat{C_{i}})^2

    公式中的C为confidence,​是上文提到30维向量中的2维. 表示目标的中心是否出现在网格单元​中,​表示网格单元​中的第​i个边界框预测器“负责”该预测,第i个边框的confidence 计算公式P(obj)*IOU_{pred}^{truth}
    如果某个物体在box中被检测到,其置信度损失(衡量的是box中的物体)\sum_{i=0}^{S^2}\sum_{j=0}^BI_{ij}^{obj}(C_{i}- \hat{C_{i}})^2\hat C_i是预测与groundtruth 的IOU.
    如果某个物体不在box中,其置信度损失为\lambda _{noobj} \sum_{i=0}^{S^2}\sum_{j=0}^BI_{ij}^{noobj}(C_{i}- \hat{C_{i}})^2,\hat C_{i}=0.同样的,I_{ij}^{noobj} 是对I_{ij}^{obj}的一种补充。\lambda _{noobj}降低背景检测损失的权重(noobj即背景) 。因为大部分cell不包含任何物体,这会导致分类(正负样本)的不均衡。(Retinanet网络提出解决正负样本不均衡问题)因此,我们降低了背景检测损失的权重,即\lambda _{noobj}默认值为0.5。

    图片参考:https://zhuanlan.zhihu.com/p/46691043

    相关文章

      网友评论

          本文标题:yolov1网络理解

          本文链接:https://www.haomeiwen.com/subject/ehbzyctx.html