SSD网络
概述Permalink
目标检测目前主要有种方法:
two-stage
:R-CNN
和Faster R-CNN
系列为代表,先生成region proposal
(预选框),再经过CNN网络进行分类one-stage
:ssd
和yolo
为代表,边提取特征边分类
论文地址[2016]:SSD: Single Shot MultiBox Detector
模型结构Permalink
ssd与yolo v1对比图,ssd主要特点:
- 使用vgg16做backbone,实际应用中也可以用其他如resnet做backbone
- 通过不同的卷积,得到不同大小的feature maps
- 使用priorbox层得到预选框
PriorBoxPermalink
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最大边长:√min_size×max_size -
长方形预选框,每个aspect_ratio会生成1个长方形框;如果flip为true,则再生成一个转置的长方形框:
[√aspect_ratio×min_size,1√aspect_ratio×min_size][1√aspect_ratio×min_size,√aspect_ratio×min_size],ifflip=ture -
根据上面的计算,预选框数量为:
num_priors=num(min_size)∗num(aspect_ratio)∗(1+flip)+num(max_size)+num(min_size) -
根据预选框从每个像素点记录框的坐标
-
min_size
和max_size
由公式确定:Sk=Smin+Smax−Sminm−1×(k−1),k∈[1,m] SSD网络中m为6
DetectionOutputPermalink
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
}
}
输入Permalink
- mbox_priorbox,是各个priorbox层输出的预选框,进行concat生成
- mbox_loc,预选框的偏移量
- mbox_conf_flatten,各个框在类别上的得分。
输出Permalink
shape为[N, 1, x, 7],x是保留框的个数,7对应[id, label, core, xmin, ymin, xmax, ymax]
非极大值抑制(NMS)Permalink
NMS: Non-maximum suppression
交并比Permalink
J(A,B)=|A∩B||A∪B|交集面积比并集面积,如果大于阈值(如0.5),则认为重叠
过程Permalink
-
待处理候选框集合H,初始为全部预选框;最有框集合M,初始为空
- H中选出score最高的框m,从H移进M
- H中所有框与m进行交并比,如果大于某阈值,则认为重叠,移除
- 重复上两步,直到H为空