真锋
永远保持一颗学习和专注的心
嵌入式视觉

yolov1 模型理解

本文为作者对 yolov1 算法学习的理解笔记,部分图片和文字来源于网络。

yolov1 单阶段目标检测网络

设计理念

yolov1 直接采用 regression(回归)的方法进行坐标框的检测以及分类,使用一个end-to-end的简单网络,直接实现坐标回归与分类。Yolo的CNN网络将输入的\(448*448\)图片分割成 S∗S 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图下图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 B 个边界框(bounding box)以及边界框的置信度(confidence score)。 

yolov1 网络详细设计

Yolov1 采用卷积网络来提取特征,然后使用全连接层来得到预测值,检测网络由24个convolutional layers和之后的两个connected layers组成。于convolutional layers,主要使用 1×1 卷积来做channle reduction,然后紧跟3×3卷积。对于卷积层和全连接层,采用 Leaky ReLU 激活函数:\(max(x,0.1x)\) 。但是最后一层却采用线性激活函数。

输出 tensors 为7*7*(2*5+20)解释

这里注意 yolov1 论文中,输入为448*448大小,输出tensors为7*7*(2*5+20),骨干网络为GoogLeNet。输出维度:7*7*(2*5+20):

1. 如果一个object的中心落在某个单元格上,那么这个单元格负责预测这个物体。

2. 每个单元格需要预测B个bbox值(bbox值包括坐标xy和宽高wh,原文中B=2),同时为每个bbox值预测一个置信度(confidence scores)。也就是每个单元格需要预测B×(4+1)个值。

3. 每个单元格需要预测C(物体种类个数,原文C=20,这个与使用的数据库有关)个条件概率值. 所以,最后网络的输出维度为S×S×(B×5+C)

详细解释如下图: 

将图片分为S×S个单元格(原文中S=7),之后的输出是以单元格为单位进行的:对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的 (x, y, w, h) 。这里。对于边界框为什么把置信度 c 和 (x, y, w, h) 都分开排列,而不是按照 (x, y, w, h, c) 这样排列,其实纯粹是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可以任意的。但是分离排布,程序上可以方便地提取每一个部分。这里来解释一下,首先网络的预测值是一个二维张量 P ,其shape为 [batch,7*7*30] 。采用切片,那么 \( P_{[:,0:7*7*20]} \) 就是类别概率部分,而 \( P_{[:,7*7*20:7*7*(20+2)]} \) 是置信度部分,最后剩余部分\( P_{[:,7*7*(20+2):]}\)是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。

输出维度各个参数计算方式

1. 知道了输出维度的解释,我们还需要知道每个单元格预测的B个(x,y,w,h,confidence)的向量和C个条件概率中,每个参数的含义和计算方式(假设图片宽为\(w_{i}\)和高为\(h_{i}\),将图片分为S*S网格):

2. (x, y):中心坐标的预测值 (x,y) 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。对于下图中蓝色框的那个单元格(坐标为(xcol=1,yrow=4)),假设它预测的输出是红色框的bbox, 设bbox的中心坐标为(\( x_{c},y_{c} \)), 那么最终预测出来的(x,y)是经过归一化处理的,表示的是中心相对于单元格的offset,计算公式如下: $$\frac{x_{c}}{w_{i}}*S-x_{col},\frac{y_{c}}{h_{i}}*S-y_{col}$$

3. (w, h):边界框的 w 和 h 预测值是相对于整个图片的宽与高的比例,理论上(x,y,w,h)4个元素的大小应该在 0−1 范围。

4. confidence:置信度是由两部分组成,一是格子内是否有目标,二是bbox的准确度。定义置信度为Pr(Object)∗IOUtruthpred,如果格子内有物体,则Pr(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0,此时置信度等于0。

5. C类条件概率:条件概率定义为Pr(Classi|Object),表示该单元格存在物体且属于第i类的概率。在测试的时候每个单元格预测最终输出的概率定义为,Pr(Classi|Object)∗Pr(Object)∗IOUtruthpred=Pr(Classi)∗IOUtruthpred

详细解释参考下图(来源于网络):

损失函数理解

loss计算公式如下图(来源于网络):

yolo损失函数

损失函数分析:

1. Yolov1 算法将目标检测看成回归问题,所以公式中采用的是均方差损失函数。包含三类损失:bbox损失、confidence损失和categories损失,但是对不同的损失部分采用了不同的权重值。首先区分定位误差和分类误差。

2. 对于定位误差,即边界框坐标预测误差,采用较大的权重 \( \lambda_{coord} \) 。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 \( \lambda_{noobj} \) ,其它权重值均设为1,然后采用均方误差。

3. 为了平衡短边和长边对损失函数的影响,YOLO使用了边长的平方根来减小长边的影响。即预测值变为\( (x,y,\sqrt{w},\sqrt{h}) \)

yolov1 缺陷

  • 两个bounding box功能的重复降低了模型的精度;
  • 全连接层的使用不仅使特征向量失去了位置信息,还产生了大量的参数,影响了算法的速度;
  • 只使用顶层的特征向量使算法对于小尺寸物体的检测效果很差。

参考资料

赞赏
更多干货文章,欢迎关注我的微信公众号-嵌入式视觉。

发表回复

textsms
account_circle
email

嵌入式视觉

yolov1 模型理解
本文为作者对 yolov1 算法学习的理解笔记,部分图片和文字来源于网络。 yolov1 单阶段目标检测网络 设计理念 yolov1 直接采用 regression(回归)的方法进行坐标框的检测以及分…
扫描二维码继续阅读
2019-08-06