单阶段目标检测:SSD与Yolo
SSD与Yolo结构对比图
yolo单阶段目标检测网络
设计理念
yolo直接采用regression(回归)的方法进行坐标框的检测以及分类,使用一个end-to-end的简单网络,直接实现坐标回归与分类。Yolo的CNN网络将输入的图片分割成 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图下图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。**每个单元格会预测
个边界框(bounding box)以及边界框的置信度(confidence score)**。
yolo网络详细设计
Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值,检测网络由24个convolutional layers
和之后的两个connected layers
组成。于convolutional layers
,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: 。但是最后一层却采用线性激活函数。
输出tensors为7*7*(2*5+20)
解释
这里注意yolo论文中,输入为448448大小,输出tensors为7*7(25+20),骨干网络为GoogLeNet。输出维度:`7*7(2*5+20)`:
- 如果一个object的中心落在某个单元格上,那么这个单元格负责预测这个物体。
- 每个单元格需要预测B个bbox值(bbox值包括
坐标xy和宽高wh
,原文中B=2),同时为每个bbox值预测一个置信度(confidence scores)
。也就是每个单元格需要预测B×(4+1)
个值。 - 每个单元格需要预测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]
。采用切片,那么 就是类别概率部分,而
是置信度部分,最后剩余部分
是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。
输出维度各个参数计算方式
知道了输出维度的解释,我们还需要知道每个单元格预测的B个(x,y,w,h,confidence
)的向量和C个条件概率
中,每个参数的含义和计算方式(假设图片宽和高为
,将图片分为S*S网格):
(x, y)
:中心坐标的预测值是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。对于下图中蓝色框的那个单元格(坐标为(xcol=1,yrow=4)),假设它预测的输出是红色框的bbox, 设bbox的中心坐标为(
), 那么最终预测出来的(x,y)是经过归一化处理的,表示的是中心相对于单元格的offset,计算公式如下:$
$
(w, h)
:边界框的和
预测值是相对于整个图片的宽与高的比例,理论上
(x,y,w,h)
4个元素的大小应该在范围。
confidence
:置信度是由两部分组成,一是格子内是否有目标,二是bbox的准确度。定义置信度为Pr(Object)∗IOUtruthpred,如果格子内有物体,则Pr(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0,此时置信度等于0。C类条件概率
:条件概率定义为Pr(Classi|Object),表示该单元格存在物体且属于第i类的概率。在测试的时候每个单元格预测最终输出的概率定义为,Pr(Classi|Object)∗Pr(Object)∗IOUtruthpred=Pr(Classi)∗IOUtruthpred
详细解释参考下图(来源于网络):
损失函数理解
loss计算公式如下图(来源于网络):
损失函数分析:
- Yolo算法将目标检测看成回归问题,所以公式中采用的是
均方差损失函数
。包含三类损失:bbox损失、confidence损失和categories损失,但是对不同的损失部分采用了不同的权重值。首先区分定位误差和分类误差。 - 对于定位误差,即边界框坐标预测误差,采用较大的权重
。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值
,其它权重值均设为1,然后采用均方误差。
为了平衡短边和长边对损失函数的影响
,YOLO使用了边长的平方根
来减小长边的影响。即预测值变为。
##参考资料
目标检测|YOLO原理与实现
yolo详解