这两天把SSD论文读了一下,SSD也是一个端到端的目标检测模型,SSD在检测的准确率和速度上相对于YOLO有了很大的提高,并且在检测小目标上也有不俗的效果。
特点
1. 使用多尺度特征图进行预测
大多数目标检测算法都是使用最后一层特征图进行目标位置和类别的确定,但是这样有个缺点就是高层次的特征图对小物体的特征信息丢失严重,导致对小目标检测效果不好,这也时YOLO对小目标检测不好的原因之一。所以,SSD不仅使用高层的特征图进行预测,还是用了低层的特征图进行预测。高层的特征图主要负责大目标,底层的特征图负责小目标。
SSD网络结构如图1所示:可以看到新增加的特征图大小逐渐减小,而且每个特征图的每个卷积核是相互独立的。
2. 使用卷积进行预测;
SSD直接在特征图上使用卷积进行目标位置和类别的预测。对于一个形状为 ( m × n × p ) (m\times n \times p) (m×n×p)的特征图来说,只需要 ( 3 × 3 × p ) (3 \times 3 \times p) (3×3×p)的小卷积核进行分类和位置的计算。
卷积核在特征图 ( m × n ) (m\times n) (m×n)的每一个位置上都会产生 ( c + 1 + 4 ) (c+1+4) (c+1+4)个输出值,其中c是类别的个数,加1是因为背景算一个类别,4是位置信息;位置信息包含 ( c x , c y , d w , d h ) (cx,cy,dw,dh) (cx,cy,dw,dh),前两个表示框的中心点坐标,后两个表示框的长和宽,但是这里的预测值是相对于先验框的转换值。
假设先验框的位置用 d = ( d x , d y , d w , d h ) d=(d^{x},d^{y},d^{w},d^{h}) d=(dx,dy,dw,dh)表示,边界框的位置用 b = ( b x , b y , b w , b h ) b=(b^{x},b^{y},b^{w},b^{h}) b=(bx,by,bw,bh)表示,则该边界框的预测值用 l = ( l x , l y , l w , l h ) l=(l^{x},l^{y},l^{w},l^{h}) l=(lx,ly,lw,lh)表示。转换关系为:
l x = ( b x − d x ) ÷ d w l^{x}=(b^{x}-d^{x})\div d^{w} lx=(bx−dx)÷dw l y = ( b y − d y ) ÷ d h l^{y}=(b^{y}-d^{y})\div d^{h} ly=(by−dy)÷dh l w = log ( b w / d w ) l^{w}=\log(b^{w}/d^{w})