❝上期一起学了
SSD
算法的框架流程,如下: 目标检测算法SSD结构详解❞
今天我们一起学下成功训练SSD
算法的一些注意点:
SSD
算法的目标函数分两部分:计算相应的预选框与目标类别的confidence loss
以及相应的位置回归。如下公式:
其中N
是match
到Ground Truth
的预选框数量(具体的match
策略下面讲),
参数用于调整confidence loss
和location loss
之间的比例,默认
. 其中confidence loss
具体如下:
其中i
表示第i
个预选框,j
表示第j
个真实框,p
表示第p
个类别。其中
表示第i
个预选框是否匹配到了第j
个类别为p
的真实框,匹配到就为1
,否则为0
。
而我们在最小化上面代价函数
的时候,就是将
逼近于1
的过程。而对于location loss
,如下:
其实,位置回归的loss
是跟前面学的Faster RCNN
中位置回归损失是一样,不在赘述,如下:
目标检测算法Faster RCNN的损失函数以及如何训练?
其中,
g:ground truth box
l:predicted box
d:prior box
w:width
h:heigth
在训练时,ground truth boxes
与prior boxes
按照如下方式进行配对:首先,寻找与每一个ground truth box
有最大交并比(IoU
)的prior box
,这样就能保证每一个真实标注框与至少会有一个预选框与之对应,之后又将剩余还没有配对到的预选框与任意一个真实标注框尝试配对,只要两者之间的IoU
大于阈值,则认为match
上了。显然在训练的时候,配对到真实标注框的预选框就是正样本,而没有配对上的则为负样本。如下图:
在进行match
的时候,首先计算每个预选框和真实框的IoU
,将IoU
最大的预选框和大于阈值的预选框作为正样本,其余的作为负样本进行分类器训练。其中公式中的x
表示预选框信息,c
为置信度,l
为预测框,g
为真实标注。
值得注意的是,一般情况下负样本预选框的数量是远远大于正样本预选框的数量,如果直接进行训练的话,会导致网络过于重视负样本,从而导致loss
不稳定。所以SSD
在抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差较大的top-k
作为训练的负样本,控制正负样本比例为1:3
,这样可以导致模型更快的优化和更稳定的训练。
另外为了使模型对于各种输入对象大小和形状更加鲁棒,每个训练图像通过以下选项之一进行随机采样:
0.1
,0.3
,0.5
,0.7
或0.9
.每个采样区域的大小为原始图像大小的[0.1,1]
,长宽比在1/2
和2
之间。如果真实标签框中心在采样区域内,则保留两者重叠部分作为新图片的真实标注。在上述采样步骤之后,将每个采样区域大小调整为固定大小,并以0.5
的概率水平翻转。如下图:
上图左图为输入图片及真实标注,右侧的a
,b
,c
,d
为随机采样得到的4
张图片及标注。
SSD
算法和我们前面学的Faster RCNN
以及后面要学的YOLO
的性能对比如下表:
从上表中可以看到SSD
算法相比Faster RCNN
和YOLO
都有较高的mAP
,FPS
也比Faster RCNN
高。而由于SSD512
输入图片比300
大,所以SSD512
相对于SSD300
有更好的mAP
。
min-size
,max_size
和aspect_ratio
值。网络中预选框的基础大小和形状需要手工设置。而网络中每一层feature
使用的预选框大小和形状不一样,导致调试过程非常依赖经验。SSD
使用了VGG16
中的conv4_3
低级feature
去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。至此结果上期,我们基本上了解了SSD算法的大致原理,下期,我们一起看下另一个牛哄哄的检测算法YOLO,一起加油!