目标检测SSD: Single Shot MultiBox Detector原理详解

一、前言

1.1 什么是目标检测

目标检测问题可以分为以下两个问题:

  • 分类:所有类别的概率
  • 定位: 4个值(中心位置x,y,宽w,高h)
    在这里插入图片描述
    目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型(参考RefineDet):(1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。不同算法的性能如下图所示,可以看到两类方法在准确度和速度上的差异。
    在这里插入图片描述

1.2 Single-shot V.S. R-CNN家族

● R-CNN家族基于候选区域做预测.预测分为两步:

  1. 使用Selective Search或者Region-Proposal-Network
    选出候选区域.候选区域的数量不大,减少了后续的
    计算量。
  2. 使用分类器和回归器在候选区域上面做分类和边
    界预测

● Single-shot家族不做候选区域选择,直接对所有可能的区域预测类别和边界.
在这里插入图片描述

1.3 SDD的优点

  1. 比Faster R-CNN更快,比YOLO更准确。
  2. 根据预定义的anchor,使用卷积层的输出,预测anchor对应区域包含的物体类别,边界位置和大小。
  3. 使用不同的卷积层的输出预测不同尺寸的物体,为不同的长宽比的物体单独做预测
  4. 端到端的训练,训练方便

二、SSD的设计理念

SSD和Yolo一样都是采用CNN网络来进行检测,但是却采用了多尺度的特征图,其基本架构如下图所示:
在这里插入图片描述

2.1 采用多尺度特征图用于检测

所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正如下图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标
在这里插入图片描述

2.2 采用卷积进行检测

与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为 m×n×p的特征图,只需要采用 3×3×p这样比较小的卷积核做卷积,可以预测每一个位置对于的4个位置信息中的一个,或者所有类别概率中的一个值以conv102为例:
在这里插入图片描述为每一个anchor,需要使用(4 +类别总数)个卷积核做卷积
在这里插入图片描述

2.3 设置先验框(anchor)

SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如下图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练。
在这里插入图片描述
在这里插入图片描述

三、SSD的定位原理

SSD的检测值也与Yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当做了一个特殊的类别,如果检测目标共有 c 个类别,SSD其实需要预测 c+1 个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值 l = ( c x , c y , w , h ) l=(c x, c y, w, h) l=(cx,cy,w,h) ,分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值(paper里面说是offset,但是觉得transformation更合适,参见R-CNN)。先验框位置用 d = ( d c x , d c y , d w , d h ) d=\left(d^{c x}, d^{c y}, d^{w}, d^{h}\right) d=(dcx,dcy,dw,dh) 表示,其对应真实边界框用 b = ( b c x , b c y , b w , b h ) b=\left(b^{c x}, b^{c y}, b^{w}, b^{h}\right) b=(bcx,bcy,bw,bh)表示,那么边界框的预测值 l l l 其实是 b b b 相对于 d d d 的转换值:

l c x = ( b c x − d c x ) / d w , l c y = ( b c y − d c y ) / d h l^{c x}=\left(b^{c x}-d^{c x}\right) / d^{w}, l^{c y}=\left(b^{c y}-d^{c y}\right) / d^{h} lcx=(bcxdcx)/dw,lcy=(bcydcy)/dh
l w = log ⁡ ( b w / d w ) , l h = log ⁡ ( b h / d h ) l^{w}=\log \left(b^{w} / d^{w}\right), l^{h}=\log \left(b^{h} / d^{h}\right) lw=log(bw/dw),lh=log(bh/dh)

习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值 l l l 中得到边界框的真实位置 b b b

b c x = d w l c x + d c x , b c y = d y l c y + d c y b^{c x}=d^{w} l^{c x}+d^{c x}, b^{c y}=d^{y} l^{c y}+d^{c y} bcx=dwlcx+dcx,bcy=dylcy+dcy
b w = d w exp ⁡ ( l w ) , b h = d h exp ⁡ ( l h ) b^{w}=d^{w} \exp \left(l^{w}\right), b^{h}=d^{h} \exp \left(l^{h}\right) bw=dwexp(lw),bh=dhexp(lh)

然而,在SSD的Caffe源码实现中还有trick,那就是设置variance超参数来调整检测值,通过bool参数variance_encoded_in_target来控制两种模式,当其为True时,表示variance被包含在预测值中,就是上面那种情况。但是如果是False(大部分采用这种方式,训练更容易?),就需要手动设置超参数variance,用来对 l l l 的4个值进行放缩,此时边界框需要这样解码:

b c x = d w (  variance  [ 0 ] ∗ l c x ) + d c x , b c y = d y (  variance  [ 1 ] ∗ l c y ) + d c y b^{c x}=d^{w}\left(\text { variance }[0] * l^{c x}\right)+d^{c x}, b^{c y}=d^{y}\left(\text { variance }[1] * l^{c y}\right)+d^{c y} bcx=dw( variance [0]lcx)+dcx,bcy=dy( variance [1]lcy)+dcy
b w = d w exp ⁡ ( variance [ 2 ] ∗ l w ) , b h = d h exp ⁡ ( variance [ 3 ] ∗ l h ) b^{w}=d^{w} \exp \left(\text {variance}[2] * l^{w}\right), b^{h}=d^{h} \exp \left(\text {variance}[3] * l^{h}\right) bw=dwexp(variance[2]lw),bh=dhexp(variance[3]lh)

综上所述, 对于一个大小 m × n m \times n m×n 的特征图, 共有 m × n m\times n m×n 个单元, 每个单元设置的先验框数目记为 k k k ,那么每个单元共需要 ( c + 4 ) k (c+4) k (c+4)k 个预测值, 所有的单元共需要 ( c + 4 ) k m n (c+4) k m n (c+4)kmn 个预测值, 由于SSD采用卷积做检测, 所以就需要 ( c + 4 ) k (c+4) k (c+4)k 个卷积核完成这个特征图的检测过程。

四、SSD的网络结构

SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如下图所示。可以明显看到SSD利用了多尺度的特征图做检测。模型的输入图片大小是 300 × 300 (还可以是 512 × 512 ,其与前者网络结构没有差别,只是最后新增一个卷积层。)
在这里插入图片描述
采用VGG16做基础模型,首先VGG16是在ILSVRC CLS-LOC数据集预训练。然后借鉴了DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成 3 × 3 卷积层 conv6和 1 × 1卷积层conv7,同时将池化层pool5由原来的stride=2的2 × 2变成stride=1的 3 × 3(猜想是不想reduce特征图大小),为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展卷积或带孔卷积(Dilation Conv),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小,如下图所示,(a)是普通的 3 × 3 卷积,其视野就是 3 × 3 ,(b)是扩张率为2,此时视野变成 7 × 7,©扩张率为4时,视野扩大为 15 × 15 ,但是视野的特征更稀疏了。Conv6采用 3 × 3 大小但dilation rate=6的扩展卷积。
在这里插入图片描述然后移除dropout层和fc8层,并新增一系列卷积层,在检测数据集上做finetuing。
在这里插入图片描述

其中VGG16中的Conv4_3层将作为用于检测的第一个特征图。conv4_3层特征图大小是 38 × 38,但是该层比较靠前,其norm较大,所以在其后面增加了一个L2 Normalization层(参见ParseNet),以保证和后面的检测层差异不是很大,这个和Batch Normalization层不太一样,其仅仅是对每个像素点在channle维度做归一化,而Batch Normalization层是在[batch_size, width, height]三个维度上做归一化。

从后面新增的卷积提取Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2作为检测所用的特征图,加上Conv4_3层,共提取了6个特征图,其大小分别是(38,38),(19,19),(10,10),(5,5),(3,3),(1,1),
得到了特征图之后,需要对特征图进行卷积得到检测结果,下图给出了一个 5 × 5 大小的特征图 的检测过程。其中Priorbox是得到先验框。检测值包含两个部分:类别置信度和边界框位置,各采用一次 3 × 3 卷积来进行完成。令 n k n_{k} nk 为该特征图所采用的先验框数
目,那么类别置信度需要的卷积核数量为 n k × c , n_{k} \times c, nk×c, 而边界框位置需要的卷积核数量为 n k × 4 n_{k} \times 4 nk×4 由于每个先验框都会预测一个边界框,所以SSD300一共可以预测 38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4 = 8732 38 \times 38 \times 4+19 \times 19 \times 6+10 \times 10 \times 6+5 \times 5 \times 6+3 \times 3 \times 4+1 \times 1 \times 4=8732 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732
个边界框, 这是一个相当庞大的数字,所以说SSD本质上是密集采样。
在这里插入图片描述

五、先验框的选择原则

但是不同特征图设置的先验框数目不同(同一个特征图上每个单元设置的先验框是相同的,这里的数目指的是一个单元的先验框数目)。先验框的设置,包括尺度(或者说大小)和长宽比两个方面。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加

5.1 确定先验框的尺寸

在这里插入图片描述其中 m m m 指的特征图个数,但却是 5,因为第一层 (Conv4_3层) 是单独设置的, s k s_{k} sk 表示先验框大小相对于图片的比例,而 s m i n s_{m i n} smin s m a x s_{m a x} smax 表示比例的最小值与最大值, paper里面取0.2和 0.9。对于第一个特征图,其先验框的尺度比例一般设置为 s m i n / 2 = 0.1 , s_{m i n} / 2=0.1, smin/2=0.1, 那么尺度为 300 × 0.1 = 30 300 \times 0.1=30 300×0.1=30 。对于后面的特征图, 先验框尺度按照上面公式线性增加,但是先将尺度比例先 扩大100倍, 此时增长步长为 ⌊ ⌊ s max ⁡ × 100 ⌋ − ⌊ s min ⁡ × 100 ⌋ m − 1 ⌋ = 17 , \left\lfloor\frac{\left\lfloor s_{\max } \times 100\right\rfloor-\left\lfloor s_{\min } \times 100\right\rfloor}{m-1}\right\rfloor=17, m1smax×100smin×100=17, 这样各个特征图的 s k s_{k} sk 20 , 37 , 54 , 71 , 88 , 20,37,54,71,88, 20,37,54,71,88, 将这些比例除以100,然后再乘以图片大小,可以得到各个特征图的 尺度为 60,111,162,213,264,这种计算方式是参考SSD的Caffe源码。综上,可以得到各个特 征图的先验框尺度 30,60,111,162,213,264 。

5.2 确定先验框的长宽比

一般选取 a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a_{r} \in\left\{1,2,3, \frac{1}{2}, \frac{1}{3}\right\} ar{1,2,3,21,31},对于特定的长宽比, 按如下公式计算先验框的宽度与高度 (后面的 s k s_{k} sk 均指的是先验框实际尺 度, 而不是尺度比例):

w k a = s k a r , h k a = s k / a r w_{k}^{a}=s_{k} \sqrt{a_{r}}, h_{k}^{a}=s_{k} / \sqrt{a_{r}} wka=skar ,hka=sk/ar

默认情况下,每个特征图会有一个 a r = 1 a_{r}=1 ar=1 具尺度为 s k s_{k} sk 的先验框, 除此之外, 还会设置一个尺 度为 s k ′ = s k s k + 1 s_{k}^{\prime}=\sqrt{s_{k} s_{k+1}} sk=sksk+1 a r = 1 a_{r}=1 ar=1 的先验框, 这样每个特征图都设置了两个长宽比为1但大小不同 的正方形先验框。注意最后一个特征图需要参考一个虚拟 s m + 1 = 300 × 105 / 100 = 315 s_{m+1}=300 \times 105 / 100=315 sm+1=300×105/100=315 来计 算 s m ′ 。 s_{m}^{\prime} 。 sm 因此, 每个特征图一共有 6 个先验框 { 1 , 2 , 3 , 1 2 , 1 3 , 1 ′ } , \left\{1,2,3, \frac{1}{2}, \frac{1}{3}, 1^{\prime}\right\}, {1,2,3,21,31,1}, 但是在实现时,Conv4_3, Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为 3, 1 3 \frac{1}{3} 31 的先验框。每个单元的先验框的中心点分布在各个单元的中心, 即 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) , i , j ∈ [ 0 , ∣ f k ∣ ) \left(\frac{i+0.5}{\left|f_{k}\right|}, \frac{j+0.5}{\left|f_{k}\right|}\right), i, j \in\left[0,\left|f_{k}\right|\right) (fki+0.5,fkj+0.5),i,j[0,fk)其中 ∣ f k ∣ \left|f_{k}\right| fk 为特征图的大小。

5.3 确定先验框的位置

( x ℓ i , y ℓ j ) = ( i + 0.5 m W , j + 0.5 n H ) \left(x_{\ell}^{i}, y_{\ell}^{j}\right)=\left(\frac{i+0.5}{m} W, \frac{j+0.5}{n} H\right) (xi,yj)=(mi+0.5W,nj+0.5H)
i = 0 , 1 , … , m − 1 i=0,1, \ldots, m-1 i=0,1,,m1
j = 0 , 1 , … , n − 1 j=0,1, \ldots, n-1 j=0,1,,n1
W:输入图像的宽度 H: 输入图像的高度

六、先验框匹配

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点:

  • 首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本(其实应该是先验框对应的预测box,不过由于是一一对应的就这样称呼了),反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。
  • 第二个原则是:对于剩余的未匹配先验框,若某个ground truth的 IOU 大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框 IOU大于阈值,那么先验框只与IOU最大的那个ground truth进行匹配。

第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU 小于阈值,并且所匹配的先验框却与另外一个ground truth的 IOU 大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。但是,这种情况我觉得基本上是不存在的。由于先验框很多,某个ground truth的最大 IOU 肯定大于阈值,所以可能只实施第二个原则就可以了。下图为一个匹配示意图,其中绿色的GT是ground truth,红色为先验框,FP表示负样本,TP表示正样本。
在这里插入图片描述
尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。

							IOU定义如下:

在这里插入图片描述

七、损失函数

损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x, c, l, g)=\frac{1}{N}\left(L_{c o n f}(x, c)+\alpha L_{l o c}(x, l, g)\right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))

  • N:与真实边界框配对的anchor的数量,即为选定的正样本和负样本的数量之和。
  • α \alpha α 用于平衡分类损失和定位损失, 可以和通过交叉验证cross validation选定.
  • x: 这里 x i j p ∈ { 1 , 0 } x_{i j}^{p} \in\{1,0\} xijp{1,0} 为一个指示参数, 当 x i j p = 1 x_{i j}^{p}=1 xijp=1 时表示第 i i i 个先验框与第 j 个ground truth匹配,并且ground truth的类别为 p p p
  • c: 真实物体的预测值
  • I: 预测的边界框中心位置和长, 宽
  • g: 真实的边界框中心位置和长, 宽

对于位置误差,其采用Smooth L1 loss,定义如下:

L l o c ( x , l , g ) = ∑ i ∈ P o s N ∑ m ∈ { c x , c y , w , h } x i j k smooth ⁡ L 1 ( l i m − g ^ j m ) L_{l o c}(x, l, g)=\sum_{i \in P o s}^{N} \sum_{m \in\{c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{\mathrm{L} 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right) Lloc(x,l,g)=iPosNm{cx,cy,w,h}xijksmoothL1(limg^jm)

g ^ j c x = ( g j c x − d i c x ) / d i w g ^ j c y = ( g j c y − d i c y ) / d i h \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \quad \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} g^jcx=(gjcxdicx)/diwg^jcy=(gjcydicy)/dih

g ^ j w = log ⁡ ( g j w d i w ) g ^ j h = log ⁡ ( g j h d i h ) \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \quad \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right) g^jw=log(diwgjw)g^jh=log(dihgjh)

smooth ⁡ L 1 ( x ) = { 0.5 x 2  if  ∣ x ∣ < 1 ∣ x ∣ − 0.5  otherwise  \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{array}\right. smoothL1(x)={0.5x2x0.5 if x<1 otherwise 
在这里插入图片描述
由于 x i j p x_{i j}^{p} xijp 的存在, 所以位置误差仅针对正样本进行计算。值得注意的是, 要先对ground truth的 g g g 进行编码得到 g ^ , \hat{g}, g^, 因为预测值 l l l 也是编码值, 若设置variance_encoded_in_target=True, 编码时要加上variance:

g ^ j c x = ( g j c x − d i c x ) / d i w / variance ⁡ [ 0 ] \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} /\operatorname{variance}[0] g^jcx=(gjcxdicx)/diw/variance[0]

g ^ j c y = ( g j c y − d i c y ) / d i h / variance ⁡ [ 1 ] \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} /\operatorname{variance}[1] g^jcy=(gjcydicy)/dih/variance[1]

g ^ j w = log ⁡ ( g j w / d i w ) / variance ⁡ [ 2 ] \hat{g}_{j}^{w}=\log \left(g_{j}^{w} / d_{i}^{w}\right) / \operatorname{variance}[2] g^jw=log(gjw/diw)/variance[2]

g ^ j h = log ⁡ ( g j h / d i h ) / variance ⁡ [ 3 ] \hat{g}_{j}^{h}=\log \left(g_{j}^{h} / d_{i}^{h}\right) / \operatorname{variance}[3] g^jh=log(gjh/dih)/variance[3]

对于置信度误差, 其采用softmax loss:

L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p log ⁡ ( c ^ i p ) − ∑ i ∈ N e g log ⁡ ( c ^ i 0 ) L_{c o n f}(x, c)=-\sum_{i \in P o s}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad Lconf(x,c)=iPosNxijplog(c^ip)iNeglog(c^i0)

where c ^ i p = exp ⁡ ( c i p ) ∑ p exp ⁡ ( c i p ) \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)} c^ip=pexp(cip)exp(cip)

权重系数 α \alpha α 通过交叉验证设置为1。

八、数据增强

采用数据扩增(Data Augmentation)可以提升SSD的性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本)。
在这里插入图片描述

九、非极大值抑制(Non-max suppression)

我们可能会以不同的大小和长宽比检测到同一目标, 为了避免对同一目标的多次检测而使用Non-max suppression.

  1. 按照检测到目标的输出概率排序
  2. 丢弃概率太低的预测位置
  3. 重复:
  • 选中概率最大的预测位置, 如果和另外一个预测位置有重叠(例如, 重叠率 IOU大于0.5), 保留概率最大的预测位置, 丢弃另外一个.

在这里插入图片描述

十、预测过程

预测过程比较简单,对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。

参考资料

参考链接:

https://legacy.gitbook.com/@leonardoaraujosantos
https://zhuanlan.zhihu.com/p/33544892

参考文献:

论文: https://arxiv.org/abs/1512.02325
代码: https://github.com/weiliu89/caffe/tree/ssd

多种框架实现

SSD Caffe:https://github.com/weiliu89/caffe/tree/ssd
SSD TensorFlow:https://github.com/balancap/SSD-Tensorflow
SSD Pytorch:https://github.com/amdegroot/ssd.pytorch

打赏

如果对您有帮助,就打赏一下吧O(∩_∩)O

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值