物体检测算法,按算法结构,能够分为one-stage和two-stage两类。算法
two-stage经典算法主要是R-CNN族,以准确度见长,速度稍慢,通常不如one-stage。ide
one-stage算法主要包括YOLO、SSD、CornerNet等,以速度快见长,准确度通常不如two-stage。本文分享的SSD就是经典的one-stage算法。学习
上图是物体检测算法整个演化坐标轴,能够看出SSD的发布,是在Faster R-CNN和YOLO v1以后。YOLO v1是one-stage检测算法的开山之做,速度碾压Faster R-CNN,但准确性远不如Faster R-CNN。SSD沿用了YOLO v1的基本思路,糅合了Faster R-CNN的anchor-box,又开创性的提出了多分辨率预测,最终达到了极快又准,以下表。cdn
这里先直接给出具体的模型计算方法,后面再解释原理,不然原理解释起来很是晦涩难懂。blog
a) 输入图片通过特征提取器(SSD采用VGG16作特征提取器),获得H x W x Channel的Extracted Feature Map。图片
b) 将上述Extracted Feature Map,通过3 x 3 x (25 x num_default_box)的卷积核,卷积成H x W x (25 x num_default_box)的feature map做为物体检测的predict。以下图(图中num_default_box=4):ci
上述两步,就已经完成了物体检测的predict。足够简单it
由卷积的特性可知,从输入图片到HxW分辨率的预测,至关于将原分辨率的输入图片进行HxW等分,以下图(这里h=2,w=2):io
为了更准确的预测物体bounding box,SSD借鉴了faster rcnn中的default box思想。ast
先假设,每个cell中已经存在多个default box,default box的长宽固定,位于每个cell正中。
如下图为例,每个cell中有四个固定大小的default box。
P_i(i=background, c1, …, c20),表明的是这个default box的物体类别。P_background表明是背景的几率,P_ci表明是类别ci的几率(这里采用的VOC数据集,共有20个物体类别),全部几率值之和为1,取几率值最大的类做为default box的类别预测值。
Δcx, Δcy, Δw, Δh表明default box内的物体目标框与default box的位置之间的误差。Δcx, Δcy表明中心点的误差,Δw, Δh表明宽高的误差。具体的含义能够参考Loss计算章节。
因此一个default box会有25个预测结果,4个default box就有100个。这就是上文模型部分predict中的100的意义。
根据上述分析可知,每一个cell都有4个default box,HxW的分辨率,则会有4HW个预测结果。对于监督学习,须要知道每一个default box对应的标签Ground Truth。SSD对于真实GT物体框的分配策略是,首先将GT分配给IoU最大的default box,而后将GT分配给IoU大于0.5的default box,也即同一个GT会分配给不一样的default box,不一样的default box对应的GT多是同一个。
如上图,红色框是dog的真实位置,那么绿色箭指向的两个default box的GT都是红色框,其余两个default box的GT是背景即没有物体。
对于正例,即default box有GT框的,loss分为类别损失和位置损失。
对于反例,即default box没有GT框的,loss只有类别损失(类别是背景)。
Loss是confidence loss和location loss加权之和。
location loss计算以下:
其中,y是预测值,y^hat是预测值的label。对于cx,cy,w,h的y^hat采用下式计算:
g是ground truth值,d是default box的先验值。能够看出,中心点坐标就是ground truth值与default box先验值得相对差,w和h是ground truth值与default box先验值比值的对数。
其实这样处理都是尽可能减少y^hat值变化幅度,减小学习难度。
confidence loss计算以下:
都是cross entropy loss。
以上就是单一scale的SSD原理。
SSD的主要贡献有两点
1)引入了上文所述的default box
2)多scale预测
上文的单scale预测,是取整个特征提过程的某一个feature map作预测。多scale预测,就是取整个特征提取过程当中的不一样分辨率的feature map均作预测。
由上图能够看出,SSD作了6个scale的预测。
Loss也是每一个scale的Loss之和。
数据加强是模型训练很是重要的一环,毕竟数据获取太难了。
SSD每一张训练图片由以下方法随机产生:
原图片
截取一部分图片,保证截取框与物体框的最小IoU是0.1,03,0.5,0.7,或者0.9
随机截取一部分图片
随机截取图片的大小是[0.1,1]原图片大小,aspect ratio是0.5~2。
default box由scale和aspect ratio控制。
scale最小为0.2,最大0.9。假如总共选取了m个scale,则各个scale的scale值按下式计算:
aspect ratio选取为:
aspect ratio为1时,再增长一个scale,取值为:
由于绝大部分default box都是负样本,致使正负样本严重失衡,若是计入全部负样本的损失,训练很是不稳定,收敛性很是慢,因此负样本只计入损失最大的几个负样本,而且要保持正负样本比例为1:3。
能够看出多scale能够显著提升准确性