Bootstrap

目标检测——SSD

我们知道Yolo的核心思想是将物体检测问题转化了单一的回归问题(之前的是分类和回归问题),而SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。在正式介绍SSD之前,我们先来看一下论文,了解了这篇论文之后,SSD的思路就会清晰很多。

Paper:Scalable Object Detection using Deep Neural Networks
论文:基于深度网络的可扩目标检测

【01. 解决的主要问题】
检测一张图片中同一类别的多个物体。之前的方法一般都是将训练好的某一类检测器在图片的每个位置进行移动、缩放来检测物体(穷举法),当类别增多的时候计算上就很费力。
【02. 主要贡献】
(1)将物体检测定义为多个边界框坐标的回归问题。对于每个预测框,网络输出一个置信度得分,显示该框包含对象的可能性。(传统方法在预先定义的框中对特性进行评分),效率高。
(2)将边界框预测器作为网络的一部分进行训练,根据预测框和ground truth来调整并通过反向传播算法更新框的位置、置信度和特征。
(3)在训练边界预测器时不考虑物体的类别。
【03. 创新点】
本文主打的就是scalable,可扩展性,具体是指物体类别增多的情况下,bounding box的数目不会成线性增加。这样就很容易扩展到其他更大的数据集上。
【04. 主要方法】
用一个Deep Neural Network(DNN)产生固定数量的边界框,每一个边界框都有其包含某个物体的置信度(此时并不知道每个框中具体是什么,置信度只代表了其包含物体的可能性大小)。【延伸:Faster RCNN的思想也是如此,其RPN就是做region proposal ,然后利用Fast RCNN进行分类。】
【05. 模型】
采用Alexnet作为基础网络,但是将Alexnet最后一层的输出改为回归,输出边界框的坐标(左上和右下)以及其置信度(介于0~1之间)。这些坐标都是用图像尺度进行了归一化的,目的是为了让网络适用于各种尺度的图像。
【06. 训练过程】
训练DNN来预测边界框和他们的置信度(分数),使最高分的边界框和ground truth最匹配。假设有一个训练样本,有M个物体被打了标签(根据M个ground truth打标签,K远大于M)(K是预测框,M是ground truth框)。然后只优化最匹配ground truth 的边界框,修改它的坐标来提升匹配度,最大化置信度,并减小其余的预测器的置信度(本来就定位不是很好的预测框)。
论文构造了一个分配的问题,如果第i个预测框被分配给第j个目标,则x_ij=1,否则为0,分配的目标函数为:
F m a t c h ( x , l ) = 1 2 ∑ i , j ∣ ∣ l i − g i ∣ ∣ 2 2 F_{match}(x,l) = \frac{1}{2} \sum_{i,j} || l_i - g_i ||_2^2 Fmatch(x,l)=21i,jligi22其中, l i l_i li是预测框的坐标向量, g j g_j gj是真实框的坐标向量(左上和右下),用L2距离来度量。
然后要最优化置信度,减少loss:
F c o n f ( x , c ) = − ∑ i , j x i j l o g ( c i ) − ∑ i ( 1 − ∑ j x i j ) l o g ( 1 − c i ) F_{conf}(x,c) = -\sum_{i,j} x_{ij}log(c_i)-\sum_{i}(1-\sum_{j}x_{ij})log(1-c_i) Fconf(x,c)=i,jxijlog(ci)i(1jxij)log(1ci)最终的损失函数为:
F ( s , l , c ) = α F m a t c h ( x , l ) + F c o n f ( x , c ) F(s,l,c) = \alpha F_{match}(x,l) + F_{conf}(x,c) F(s,l,c)=αFmatch(x,l)+Fconf(x,c)【07. 训练细节】
对ground truth的location进行聚类得到K个典型的聚类中心作为priors,得到物体的几个典型位置,利用他们来进行辅助匹配。这样学习算法就可以只要学习每个prior box的和Ground Truth的残差,而不用学习所有预测框和Ground Truth的残差。
【08. 优化过程】
利用反向传播算法最小化loss(x是分配方法)
【09. 网络结构】
Adagrad来控制学习率的衰减,mini-batch为128,并行计算加快收敛,聚类时使用k-means,α为0.3来平衡定位和置信度的损失。定位超出图片的进行映射或者裁剪,利用非极大值抑制,阈值0.5。
【10. 样本】
正样本:10million 个裁剪后的图片,与Groundtruth的 Jaccard重叠相似度阈值大于0.5;
负样本:20million个裁剪后的图片,与Groundtruth Jaccard重叠相似度阈值小于0.2(背景类);
【11. 评估方法】
先计算每张图像的中心点,然后以它为中心从图像上裁剪出来一个最大的正方形,为了满足AlexNet的网络结构,每张图像还要resize到220x220大小,再进行定位。
阈值0.5的非极大值抑制后,保留打分最高的10个区域,然后将这些区域送到分类CNN里面进行分类,输出每个区域的概率值,得到10*(N+1)的概率矩阵(N为目标的个数)每个区域的置信度分数乘上概率值作为它最终的分数,这些分数用于估计和计算P-R曲线。


了解了上一篇的论文以后,我们现在来正式的介绍SSD:

SSD: Single Shot MultiBox Detector

来源:CSDN
原文:https://blog.csdn.net/neu_chenguangq/article/details/79057655
基于”Proposal + Classification”的Object
Detection的方法,RCNN系列(R-CNN、SPPnet、Fast R-CNN以及Faster
R-CNN)取得了非常好的效果,因为这一类方法先预先回归一次边框,然后再进行骨干网络训练,所以精度要高,这类方法被称为two
stage的方法。但也正是由于此,这类方法在速度方面还有待改进。由此,YOLO[8]应运而生,YOLO系列只做了一次边框回归和打分,所以相比于RCNN系列被称为one;
stage的方法,这类方法的最大特点就是速度快。但是YOLO虽然能达到实时的效果,但是由于只做了一次边框回归并打分,这类方法导致了小目标训练非常不充分,对于小目标的检测效果非常的差。简而言之,YOLO系列对于目标的尺度比较敏感,而且对于尺度变化较大的物体泛化能力比较差;
针对YOLO和Faster R-CNN的各自不足与优势,WeiLiu等人提出了Single Shot MultiBox;
Detector,简称为SSD。SSD整个网络采取了one stage的思想,以此提高检测速度。并且网络中融入了Faster;
R-CNN中的anchors思想,并且做了特征分层提取并依次计算边框回归和分类操作,由此可以适应多种尺度目标的训练和检测任务。SSD的出现使得大家看到了实时高精度目标检测的可行性。

摘要:

SSD 输出一系列离散化的 bounding boxes,这些 bounding boxes 是在不同层次(layers)上的 feature maps 上生成的,并且有着不同的纵横比(aspect ratio)。
在预测时,网络对default box中每一个目标的分类进行打分(它属于所有类的可能性,若有10类,就会得到10个分数),然后调整边界框来更好的匹配目标的形状。同时,SSD结合了不同分辨率的特征图来处理物体不同尺寸的问题。相对于需要object proposals的方法,SSD完全消除了object proposals和随后的像素和特征重采样阶段,并将所有计算封装在一个网络中。这样使得 SSD 更容易去优化训练,也更容易地将检测模型融合进系统之中。在 PASCAL VOC、MS COCO、ILSVRC 数据集上,SSD 在保证精度的同时,其速度要比用 region proposals 的方法要快很多。SSD 相比较于其他单结构模型(YOLO),即是是在输入图像较小的情况下也能有更好的精度。

Introduction

目前的物体检测都是先假设出一堆边界框,然后对像素或特征重采样,再用分类器进行分类,虽然这类方法能够在PASCAL VOC, COCO, ILSVRC数据集上表现不错,但是太费计算资源,在嵌入式系统上很慢,很难做到实时检测。目前为止,都是牺牲检测精度来换取时间。
这篇文章就第一个提出了在保证精度的情况下,不需要像素或特征重采样的基于目标检测的深度网络,速度的提升来自于消除region proposals和随后的像素或特征重新取样阶段(虽然并不是第一个这样做的–YOLO)。SSD实现了一系列的改进,提升了准确率。改进包括使用一个小卷积滤波器来预测物体边界框位置中的类别和偏移,为了在多个尺度上进行检测,使用不同的纵横比检测,并在网络的后期将这些过滤器应用于多个特征图。本文的贡献如下:

  1. SSD比YOLO快,准确。能够和Faster R-CNN之类需要region proposals和池化的方法一样准确。
  2. SSD的核心是预测分类的得分和在 feature map 上使用小的卷积核来预测边界框偏移量。
  3. 在不同尺度的feature map上进行预测来提高准确性,并根据纵横比来分类。
  4. 即使低分辨率图片,也能达到高精度。端到端的设计更加简单。在检测速度和检测精度之间取得较好的 trade-off。
  5. 在PASCAL VOC, COCO, ILSVRC数据集上与目前的方法进行了速度和准确性的比较。

SSD框架

先弄清楚下文所说的 default box 以及 feature map cell 是什么。看下图:
• feature map cell 就是将 feature map 切分成的一个个格子;
• 而 default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes。

  1. SSD只需要输入一个带有GT框的图片,然后在不同尺度的特征图上(如88和44)的每个位置以卷积的方式,评估一系列不同纵横比小集合(如4个)default boxes。每一个box都是预测出器偏移量和里面物体的类别置信度。
  2. 训练时,首先用default boxes和GT box比较,SSD模型的损失就是坐标的损失和置信度的损失之和。

SSD网络中分为了6个stage,每个stage能学习到一个特征图,然后进行边框回归和分类。SSD网络以VGG16的前5层卷积网络作为第1个stage,然后将VGG16中的fc6和fc7两个全连接层转化为两个卷积层Conv6和Conv7作为网络的第2、第3个stage。接着在此基础上,SSD网络继续增加了Conv8、Conv9、Conv10和Conv11四层网络,用来提取更高层次的语义信息。在每个stage操作中,网络包含了多个卷积层操作,每个卷积层操作基本上都是小卷积。

模型

SSD是基于前馈卷积网络的,能够产生固定尺寸的边界框集合和其中的目标类别分数,然后用非极大值抑制来进行最后的检测。
SSD 模型的最开始部分,本文称作 base network,是用于图像分类的标准架构。在 base network 之后,本文添加了辅助的网络结构:

  1. 多尺度特征图
    在基础网络最后添加了卷积层,这些卷积层的大小是逐层递减的,可以在多尺度下进行预测。(Yolo是在单一尺度的特征图上进行操作)
  2. 卷积预测器
    每一个添加的特征层(或者基础网络中的特征层)都可以使用一系列卷积,去产生一系列固定大小的预测。这些预测要么是类别的得分,要么就是box的偏置。(Yolo就用了一个中间层的全连接层来替代卷积)
  3. default boxes和纵横比
    对每一个feature map cell来说,都对应一组default boxes,default boxes用卷积的方式来覆盖特征图,所以每一个box就固定对应一个feature map cell。在每一个feature map cell上,预测它对应的default boxes的偏置和类别置信度。

举个栗子:
一个nm的特征图,每一个cell上有k个default boxes,共有c个类,每个default box需要预测4个坐标相关的值和c+1个类别概率,所以需要每个位置要k(c+4)个过滤器,一个就会有kmn*(c+4)个输出(实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积,比如卷积核数量为(c+1)k对应confidence输出,表示每个default box的confidence,就是类别;卷积核数量为4k对应localization输出,表示每个default box的坐标)。作者的实验也表明default box的shape数量越多,效果越好。
所以这里用到的default box和Faster RCNN中的anchor很像,在Faster RCNN中anchor只用在最后一个卷积层,但是在本文中,default box是应用在多个不同层的feature map上。

训练

在训练时,SSD 的训练方法与之前那些使用 region proposal + pooling 方法的区别是,SSD 训练图像中的 ground-truth 需要赋予到那些固定输出的 boxes 上。在上文中也已经提到,SSD 输出的是实现定义好的,一系列固定大小的 bounding boxes。事实上,这种方法在 YOLO, Faster R-CNN 中的 RPN 阶段以及 MultiBox 中都有使用。只要将训练图像中的 ground truth 与固定输出的 boxes 对应之后,就可以进行端到端的损失函数计算以及反向传播的计算更新了。
来源:CSDN 原文:https://blog.csdn.net/qq_34784753/article/details/78889206

在训练过程中同样会引入一些其他的问题。大致如下所示:
Matching stategy -> 也就是如何选择一系列的 default boxes
Training objective -> 目标损失函数的选择
Choosing scales and aspect ratios for default boxes -> 选择 default boxes 的尺度问题
hard negative mining -> 负样本问题
Data augmentation -> 数据增强问题

匹配策略:

在训练过程中,首先需要确定的一个问题是:如何将 ground truth boxes 与 default 进行匹配,以此组成 label ?
对于每个 ground truth box,我们都从默认的框中进行选择,这些框根据位置,长宽比和比例而变化。在开始的时候,使用 MultiBox 中的 best jaccard overlap(也就是 IoU)来匹配每一个 ground truth box 与 default box,这样就能保证每一个 ground truth box 与唯一一个 default box 对应起来。但是又不同于 MultiBox,SSD将 default box 与任意的 ground truth box 进行匹配,只要两者之间的 jaccard overlap 大于一个阈值即可,本文中的阈值取的是 0.5。(某个ground truth可能与多个先验框匹配,但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配)
这简化了学习问题,使得网络可以对多覆盖(multiple overlapping)默认框预测得到高分,而不是选出最大覆盖的那个覆盖。

训练目标

SSD 的训练时的目标函数源自于 MultiBox 的目标函数,但是 SSD 的目标函数又将其进行拓展,使其能够处理多个目标类别。这里使用 x i j p = ( 1 , 0 ) x_{ij}^p=({1,0}) xijp=(1,0)表示第i个 default box与类别p的第j个ground truth box相匹配,否则如果不匹配的话,则有 x i p j = 0 x^p_ij=0 xipj=0
根据上面这种匹配策略,我们会得到 ∑ i x i p j ≥ 1 ∑_i x^p_ij ≥1 ixipj1。最后总的目标函数是由 localization 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}(L_{conf}(x,c) + \alpha L_{loc}(x,l,g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))

其中N是匹配的default boxes,如果N=0,则把loss也设为0;localization loss是平滑的L1 损失,l代表预测框参数,g代表GT box参数;和Faster R-CNN类似,用回归偏置来得到默认边界框(d)的中心坐标(cx,cy)和宽度(w)、高度(h)。

选择默认框的尺度和纵横比

为了处理对不同尺度的物体,之前的一些方法(Overfeat,SPP-Net 等)将图像处理成不同的大小,然后再用于计算。
但是,通过使用一个网络结构中的不同层次的特征(feature map)我们同样可以得到相同的效果,同时在所有物体尺度中共享参数。
之前的论文(FCN 等)就是使用了 CNN 前面的层,以此来提高图像的分割的效果,因为越是底层的 layers越能保留目标的细节信息。
受到上面方法的启示,在 SSD 中同时利用底层特征和高层特征进行目标检测。
不同层次的特征图有不同大小的感受野,但是SSD并不需要将default boxes 与每一层实际的感受野相匹配。SSD设计了一种default boxes的堆叠方式,使得特定的特征图就能够负责特定的尺度。假设我们用m个特征图进行预测,每一个default boxes的尺度就是:
s k = s m i n + s m a x − s m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_{min} + \frac{s_{max}-s_{min}}{m-1}(k-1),k \in[1,m] sk=smin+m1smaxsmin(k1),k[1,m]

s m i n = 0.2 s_{min}=0.2 smin=0.2 s m a x = 0.9 s_{max}=0.9 smax=0.9,意味着最底层的尺度为0.2,最高层的尺度为0.9,其他层也按规律设计。我们对默认盒子加上不同的纵横比,即 a r ∈ ( 1 , 2 , 3 , 1 / 2 , 1 / 3 ) a_r∈({1,2,3,1/2,1/3}) ar(1,2,3,1/2,1/3).我们可以计算每个default box宽( w k a = s k a r w_k^a=s_k \sqrt{a_r} wka=skar )和高( h k a = s k / a r h_k^a= {s_k}/{\sqrt{a_r}} hka=sk/ar ),纵横比为1时,添加一个尺度为 s k ′ = s k s k + 1 s'_k=\sqrt{{s_k}{s_{k+1}}} sk=sksk+1 的default box,这就在每个位置都有6个default box了,把它们的中心设为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|}) (fki+0.5,fkj+0.5),其中 ∣ f k ∣ |f_k| fk是第 k 个 feature map 的大小,且 i , j ∈ [ 0 , ∣ f k ∣ ) i,j∈[0,|f_k|) i,j[0,fk),可以设计不同的 default boxes 的尺度的分布以此来适应各种不同的数据集。

负样本解决办法

大多数的default box都是负样本,导致了正负样本的不平衡,所以我们要想办法减少负样本的数量,而不是全用,所以在训练过程中采用了Hard Negative Mining的策略,根据Confidence Loss对所有的box进行排序,再挑选前面最高的 default boxes,使得负样本与正样本之间的比例大致为 3:1。使用这种方法可以加快优化速度以及使训练过程更加稳定。

数据增强

图像增强的方法(每一张随机选下面的一项)
(1)使用整张原始输入图像
(2)使用IOU和目标物体为0.1、0.3、0.5、0.7和0.9的patch
(3)随机采取一个patch
这些patch在原图的大小的[0.1, 1]之间,相应的宽高比在[1/2, 2]之间。如果ground truth的中心在样本块里,我们保留那个重叠部分的ground truth box,在完成前面的采样之后,我们把样本块重新调整成固定大小,并且以 0.5 的概率进行随机 水平翻转。再用到了另一篇论文中提及一些光学变化方法。

传统的数据增强方法就是:
(1)从256256中随机裁剪出224224,获得一些平移不变性
(2)水平翻转,获得翻转不变性
(3)随即增加光照,获得对光线变化的不变性和次要颜色变化的不变性

这篇文章扩展了一些翻转不变性和颜色不变性
1. 将图像裁剪扩展到额外像素
一般地,将图片调整到256256的尺度再随机裁剪成224224会丢失很多信息(约30%),虽然裁剪后的像素很可能比中间像素的信息量少,但利用这些额外的像素能够改进模型。
想要利用全部的图片,就把图片尺度变为256N或N256(最小的边变为256),然后随机选取224*224进行裁剪作为训练图片。就能够产生更多的样本图片,引入了更多的平移不变性。

2. 额外的颜色操作
处理随机增加光噪声,还用python图像库(PIL)随机操作对比度、亮度和颜色。使得覆盖更大范围的图片变化。
随机选择一个处理这三项的顺序,然后选择一个0.5到1.5之间的数值来做图片增强(1就没有改变),最后再随机添加光噪声。

3. 测试时的其他数据增强方法
不仅用传统的10个图像,还在三个不同尺度上的预测改进了联合预测。还对数据的三个不同视图进行了预测,这些视图捕获了先前裁剪掉的像素。利用了5个变化,2个翻转,3个尺度和3个视图,产生了90个预测,将预测速度降低了几乎一个数量级,为了加快速度,还使用了一个简单的贪婪算法。
3.1. 多尺度预测
用256和228和284三个尺度。当把图片尺度扩大时,一个好的插值方法就很重要,如双三次插值算法。还要注意不能使用为缩小图像而设计的抗混叠过滤器。
3.2. 从多个视角进行预测
为了利用全部的像素,如对256N或N256的图片用三个不同的正方形图片视角(左/上,中间,右/下)256*256,然后在这三个视角上分别用裁剪、翻转和尺度缩放。

实验结果

基础网络全部是基于VGG16的,预先在ILSVRC CLS-LOC数据集上训练过的。具体数据自行参考论文第七页。
【模型分析】 用控制变量法来评估每个部分的功能。输入图片300*300。

【数据增强很关键】 使用数据增强方法以后mAP提升了8.8%,但是这种方法可能在Fast/Faster R-CNN上增益不大,因为他们在分类时使用了特征池化操作,对目标变化相对鲁棒。
【Default box越多效果越好】 使用多种默认框形状能够使网络更容易去预测。
【多分辨率上的多层输出更好】 如下图:


今天无意中翻到之前有一篇博客没有及时更新完,所以今天把他更新了,希望小伙伴们多多包容(比心)!前两天在单向历上看到一句话觉得特别适合我们,也拿出来分享给大家。这句活是这么说的:熬夜不是出于苦工,而是为了自由的滋味——梁文道《我执》。啊哈哈哈哈哈,内心有些小崩溃,宜夜猫子~我们下篇文章见啦!

;