SSD网络
概述
目标检测目前主要有种方法:
two-stage
:R-CNN
和Faster R-CNN
系列为代表,先生成region proposal
(预选框),再经过CNN网络进行分类one-stage
:ssd
和yolo
为代表,边提取特征边分类
论文地址[2016]:SSD: Single Shot MultiBox Detector
模型结构
ssd与yolo v1对比图,ssd主要特点:
- 使用vgg16做backbone,实际应用中也可以用其他如resnet做backbone
- 通过不同的卷积,得到不同大小的feature maps
- 使用priorbox层得到预选框
PriorBox
SSD中定义PriorBox,预选框。
layer {
name: "conv13_mbox_priorbox"
type: "PriorBox"
bottom: "conv13"
bottom: "data"
top: "conv13_mbox_priorbox"
prior_box_param {
min_size: 105.0
max_size: 150.0
aspect_ratio: 2.0
aspect_ratio: 3.0
flip: true
clip: false
variance: 0.1
variance: 0.1
variance: 0.2
variance: 0.2
offset: 0.5
}
-
默认正方形预选框:
\[最小边长:min\_size \\ 最大边长:\sqrt{min\_size \times max\_size}\] -
长方形预选框,每个aspect_ratio会生成1个长方形框;如果flip为true,则再生成一个转置的长方形框:
\[\begin{bmatrix} \sqrt{aspect\_ratio} \times min\_size,\frac{1}{\sqrt{aspect\_ratio}}\times min\_size \end{bmatrix} \\ \begin{bmatrix} \frac{1}{\sqrt{aspect\_ratio}}\times min\_size,\sqrt{aspect\_ratio} \times min\_size \end{bmatrix}, if \quad flip = ture\] -
根据上面的计算,预选框数量为:
\[num\_priors = num(min\_size) * num(aspect\_ratio) * (1 + flip) + num(max\_size) + num(min\_size)\] -
根据预选框从每个像素点记录框的坐标
-
min_size
和max_size
由公式确定:$ S_k= S_{min}+ \frac{S_{max} - S_{min}}{m - 1} \times (k - 1), \quad k \in [1,m] $ SSD网络中m为6
DetectionOutput
SSD网络最后一层,定义如下:
layer {
name: "detection_out"
type: "DetectionOutput"
bottom: "mbox_loc"
bottom: "mbox_conf_flatten"
bottom: "mbox_priorbox"
top: "detection_out"
include {
phase: TEST
}
detection_output_param {
num_classes: 21
share_location: true
background_label_id: 0
nms_param {
nms_threshold: 0.45
top_k: 100
}
code_type: CENTER_SIZE
keep_top_k: 100
confidence_threshold: 0.25
}
}
输入
- mbox_priorbox,是各个priorbox层输出的预选框,进行concat生成
- mbox_loc,预选框的偏移量
- mbox_conf_flatten,各个框在类别上的得分。
输出
shape为[N, 1, x, 7],x是保留框的个数,7对应[id, label, core, xmin, ymin, xmax, ymax]
非极大值抑制(NMS)
NMS: Non-maximum suppression
交并比
\[J(A,B) = \frac{|A \cap B|}{|A\cup B|}\]交集面积比并集面积,如果大于阈值(如0.5),则认为重叠
过程
-
待处理候选框集合H,初始为全部预选框;最有框集合M,初始为空
- H中选出score最高的框m,从H移进M
- H中所有框与m进行交并比,如果大于某阈值,则认为重叠,移除
- 重复上两步,直到H为空