Contents
- 1 yolov1 单阶段目标检测网络
- 1.1 设计理念
- 1.2 yolov1 网络详细设计
- 1.3 输出 tensors 为7*7*(2*5 20)解释
- 1.4 输出维度各个参数计算方式
- 1.5 损失函数理解
- 1.6 yolov1 缺陷
- 2 参考资料
本文为作者对 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,计算公式如下:
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功能的重复降低了模型的精度;
- 全连接层的使用不仅使特征向量失去了位置信息,还产生了大量的参数,影响了算法的速度;
- 只使用顶层的特征向量使算法对于小尺寸物体的检测效果很差。
参考资料
- 目标检测|YOLO原理与实现
- yolo详解
- 物体检测之SSD