欢迎来到学术参考网
当前位置:发表论文>论文发表

ssd检测论文

发布时间:2023-02-23 22:47

ssd检测论文

论文链接:
tensorflow源码链接:

SSD是YOLO之后又一个引人注目的目标检测结构,它沿用了YOLO中直接回归 bbox和分类概率的方法,同时又参考了Faster R-CNN,大量使用anchor来提升识别准确度。通过把这两种结构相结合,SSD保持了很高的识别速度,还能把mAP提升到较高的水平。

原作者给了两种SSD结构,SSD 300和SSD 512,用于不同输入尺寸的图像识别。本文中以SSD 300为例,图1上半部分就是SSD 300,下半部分是YOLO,可以对比来看。SSD 300中输入图像的大小是300x300,特征提取部分使用了VGG16的卷积层,并将VGG16的两个全连接层转换成了普通的卷积层(图中conv6和conv7),之后又接了多个卷积(conv8_1,conv8_2,conv9_1,conv9_2,conv10_1,conv10_2),最后用一个Global Average Pool来变成1x1的输出(conv11_2)。

a、重新启用了Faster R-CNN中anchor的结构
在SSD中如果有多个ground truth,每个anchor(原文中称作default box,取名不同而已)会选择对应到IOU最大的那个ground truth。一个anchor只会对应一个ground truth,但一个ground truth都可以对应到大量anchor,这样无论两个ground truth靠的有多近,都不会出现YOLO中bbox冲突的情况。

b、同时使用多个层级上的anchor来进行回归
作者认为仅仅靠同一层上的多个anchor来回归,还远远不够。因为有很大可能这层上所有anchor的IOU都比较小,就是说所有anchor离ground truth都比较远,用这种anchor来训练误差会很大。例如图2中,左边较低的层级因为feature map尺寸比较大,anchor覆盖的范围就比较小,远小于ground truth的尺寸,所以这层上所有anchor对应的IOU都比较小;右边较高的层级因为feature map尺寸比较小,anchor覆盖的范围就比较大,远超过ground truth的尺寸,所以IOU也同样比较小;只有图2中间的anchor才有较大的IOU。通过同时对多个层级上的anchor计算IOU,就能找到与ground truth的尺寸、位置最接近(即IOU最大)的一批anchor,在训练时也就能达到最好的准确度。

SSD的优点在前面章节已经说了:通过在不同层级选用不同尺寸、不同比例的anchor,能够找到与ground truth匹配最好的anchor来进行训练,从而使整个结构的精确度更高。
SSD的缺点是对小尺寸的目标识别仍比较差,还达不到Faster R-CNN的水准。这主要是因为小尺寸的目标多用较低层级的anchor来训练(因为小尺寸目标在较低层级IOU较大),较低层级的特征非线性程度不够,无法训练到足够的精确度。
下图是各种目标识别结构在mAP和训练速度上的比较,可以看到SSD在其中的位置:

目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。  目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。

2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图

算法步骤如下:

R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个

针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。

R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。

faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图

主要分为四个步骤:

使用VGG-16卷积模型的网络结构:

卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。

MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。

faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。

卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。

对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。

对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。

另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。

假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:

我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。

得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下:

1,得到前景anchors和他们的[x y w h]坐标。

2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个

3,剔除非常小的anchors。

4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。

5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。

经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。

和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。

ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。

ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。

这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到83.8%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图:

主要分为三个部分:卷积层,目标检测层,NMS筛选层。

采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图

其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。

分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表:

| Name | # Images (trainval) | # Classes | Last updated |

| --------------- | ------------------- | --------- | ------------ |

| ImageNet | 450k | 200 | 2015 |

| COCO | 120K | 90 | 2014 |

| Pascal VOC | 12k | 20 | 2012 |

| Oxford-IIIT Pet | 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下:

误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。

Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。

SSD网络结构如下图:

和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层

SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。

每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示:

另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率

另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。

和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。

针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下

网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下

yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。

YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。

YOLOv3的改动主要有如下几点:

不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。

当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。

one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。

目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下:

一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2

从YOLOv1到v3的进化之路

SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试 

YOLO    darknet/yolo/      pjreddie/darknet   

C#项目参考:

项目实践贴个图。

目标检测SSD相对于YOLO与faster-RCNN做了哪些改进?效果如何

Faster RCNN用了整合了之前的RCNN啊,SPP-net啊,Fast RCNN啊这些网络的region proposal方式,提出了RPN,所谓RPN就是根据图像自身的色彩以及边缘信息等等来生成region proposal的一个网络,因此实现了end-to-end,但还是慢
YOLO就是把原图划成7x7的小格子,在每个格子里对目标进行预测,相当于固定了region proposal的位置和大小,所以没有了RPN,加快了速度,但是准确率下去了
SSD用了YOLO的思想,但是选了6个比例来对原图进行划分,这样就保证了大物体有大格子学,小物体有小格子学,不像YOLO只有一种大小的格子,准确率也提高了(相对于YOLO),速度也上去了(相对于Faster,SSD也没有RPN步骤)

SSD与yolov1的对比

yolo系列和ssd发表的时间顺序是yolov1,ssd,yolov2,yolov3,当然现在yolov4也出现了。这个是我之前在看完yolov1之后阅读ssd论文的时候记录的笔记,因此会涉及到很多和yolov1实现的对比。

fast rcnn系列的模型的套路: 1.使用事先设定的bounding boxes,

和fasterRCNN区别是没有使用RPN和Pooling操作

论文的贡献: 1. 引入了一种单阶段的检测器,比以前的算法YOLOv1更准更快,并没有使用RPN和Pooling操作; 2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类别的BB偏差; 3. 可以在更小的输入图片中得到更好的检测效果(相比Faster-rcnn); 4. 在多个数据集(PASCAL、VOC、COCO、ILSVRC)上面的测试结果表明,它可以获得更高的mAp值;

整个是一个基于前向反馈的卷积网络,SSD模型最终提供一个固定大小的bounding boxes集合以及这些bounding boxes是否存在分类物品的得分的集合,通常在模型之后,添加了一个非极大抑制步骤来提供最终的检测结果。

主干网络backbone network 主干网络是基于VGG的, 是一个高质量的分类网络,把这个基础模型作为ssd的前面层,用于给后面的层提供高质量的图片分类,我们称这个层为基础网络,注意这个基础模型在使用的时候,需要截去最后面的分类层。在这里使用的VGG16网络。然后添加辅助的结构来 提供最终的检测功能。

主干网对VGG16的修改: 1. 将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7; 2. 去掉所有的Dropout层和FC8层; 3. 添加了Atrous算法(hole算法),参考该链接; 4. 将Pool5从2x2-S2变换到3x3-S1;

最终的检测功能的实现依赖于下面提到的关键技术:

在基础网络之后,添加了很多个卷积层,卷积层不断的减小特征图的宽高尺寸,比如从8 8经过一层卷积之后就变成4 4了。然后在这些特征图上都应用目标检测算法。正如上面那张图所示,对于前面一层来说,相当于是在一个比较小的8 8的尺度上,对每个位置检测4个固定横纵比的bounding box,而对于后面一层来说,就是在一个相对较大的4 4尺寸上对每个位置检测4个固定横纵比的bounding box。这样就实现了在多尺度特征图上检测的目的。

图中的所有信道的对应位置的像素点集合被认为是一个anchor,那么对于每个anchor就会有N个比率的bounding box,需要注意的是,每一层的bounding box数量不一定是一样的。

我们从feature layer或者说feature map上抽取特征。feature layer可能是基础网络上面的某一层,也可以是在基础网络后面添加的卷积层。对于一个 m x nxc的feature layer,使用一个3x3xp的核过滤器(small kernel),那么对于每一个输出的pixel,都可以得到一个channel数为p大小的检测结果,一般p=4 (|Classes|+4)大小,最终可以得到m n p大小的检测结果。这个检测结果中包含了每个位置的分类物品出现的置信度以及四个表示位置和偏移的(cx,cy,w,h)。因为设置了bounding box的数量为4,所以结果是4 (|Classes|+4). 需要注意到这里使用的卷积预测器而不是全连接层(yolov1使用的是全连接层)。

这里的bounding box的概念类似于Faster R-CNN中的anchor boxes.但是这里不同的feature map层可以安排不同形状和数量的bounding box。,这样可以有效的离散化可能的输出box的空间(想象一下,如果每个feature map的bounding box长的差不多,那么得到的可能差异只在大小上,我们需要的是不同大小和形状的box来拟合真实的物品的坐标,因此box越多样越好。

The key difference between training SSD and training a typical detector that uses region proposals, is that ground truth information needs to be assigned to specific outputs in the fixed set of detector outputs.

把真实的物品坐标框称为ground truth,对于一张图片,在经过SSD模型的各层检测,会有8732个prior box(也就是检测结果),需要标记这些检测结果中,哪些是正样本,那些是负样本。 这些标记过程都是在训练之前做好的;不同层的default box的数量和大小也是在训练钱都确定好的;还需要准备好难负例挖掘的策略。

对于打标的真实框GT,需要选择哪个预测框是与真实框对应的。这里选择是jaccard overlap>0.5的所有默认框。这样正负样本就不会很悬殊。Multibox论文中则只会选择jaccard overlap最高的一个框框。

个人理解中,这里的预测框是指没有偏移变化的预测框prior box,也叫先验框(prior box)。在GT确定、输入图像尺寸固定、prior box确定之后,就可以得到jaccard overlap>0.5的所有先验框。然后学习的时候,这些正例需要根据ground truth进行偏移和长宽比缩放的学习。而其他负例则不需要学习位置参数。

为图像的面积的交并比.

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

在Yolov1中,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所对应最大IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。

损失函数是回归损失和置信度损失的加权平均

下面是位置回归损失函数的介绍,看着就很晕。

N表示匹配的框,应该可以理解为正样本框。首先g表示是ground truth box的各个指标,d是先验框的各个指标,l是预测结果的各个指标。g^ 这个是根据g和d得到的可以和预测结果匹配计算损失函数的指标。比如g^cx 这个指标,是归一化的横坐标偏移指标,因为先验框的中心不会完全和ground truth的中心重合,因此计算实际的偏移量。这个值就是我们希望模型学习到的值。同理,先验框的宽度也不会完全重合ground truth的宽度,我们用log函数来计算g^w,这也意味着我们希望学习到的宽度也是这种变换的。

smoothL1损失函数长这样:

分类的置信度损失函数如下,正样本的softmax loss函数以及负样本的背景置信度损失.

在某些论文的方法中,为了获得不同缩放的图片的结果,通过现将图片缩放在不同的尺度然后在最后将每个缩放尺度的结果组合起来。而在这篇论文中使用的方式是使用同一个网络中的不同层上抽取的feature map来获得和上面的缩放效果一样的结果。

我觉得这个idea真的很赞,超级赞。这样不仅仅可以利用参数共享,而且很方便。已经有研究表明使用前面层的feature map可以优化语义分段质量semantic segmentation quality,因为前面的层可以获得更多的细节的优质的关于输入的信息。

这张图上有两个feature map。我们知道网络的不同层有不同的感受野。在SSD中,bounding box的大小不需要匹配对应层的感受野。我们设计了bounding box的尺寸规则,这样每个feature map就可以自己计算。 如果我们使用m个feature map,其中1表示较低层,m表示叫高层。bounding box的默认尺度按照如下的计算公式计算

bounding box的横纵比尺度为

什么是hard negative mining: 【1】对于目标检测中我们会事先标记处ground truth,然后再算法中会生成一系列proposal,这些proposal有跟标记的ground truth重合的也有没重合的,那么重合度(IOU)超过一定阈值(通常0.5)的则认定为是正样本,以下的则是负样本。 【2】然后扔进网络中训练。However,这也许会出现一个问题那就是正样本的数量远远小于负样本,这样训练出来的分类器的效果总是有限的,会出现许多false positive,把其中得分较高的这些false positive当做所谓的Hard negative,既然mining出了这些Hard negative,就把这些扔进网络得到类别的损失函数,将这些难负样本的损失函数作为背景损失函数,从而加强分类器判别假阳性的能力。

绝大部分的bounding box最后匹配出来是没有物品的,这样会导致负样本和正样本严重失衡。SSD这里没有使用全部的负样本,而是对每个负样本的bounding box根据其confidence loss排序,然后选择最大的一批作为负样本,这样是的负样本和正样本的比率稳定在3:1。实践证明,这样的方式是的优化的碎度更快,训练也更加稳定。

数据的扩充策略中数据来自于以下三种之一

base netowrk是VGG16。SSD300的模型就是上面那张结构图所示。新的层的初始化使用xavier方式( , )。实验认为和RCNN相比,SSD在定位localization上更加优秀,因为在神经网络模型中直接学习回归了物品的形状。但是SSD很容易有分类错误问题,尤其是类似的类别(比如动物)。SSD对bounding box的大小很敏感,也就是说,小物体的表现不如大物体。结合模型来看,因为小物体的预测使用的是网络的前面的层,而前面的层并没有很多的信息。虽然存在上面的问题,但是SSD在大物体上的表现很好,二千对于不同横纵比的物体的性能鲁棒。

下面这张图展示了ssd中的哪些技术使得性能得到了提升。

性能提升的贡献:

SSD是如何提升小物体的检测准确率的:通过数据扩充

SSD用的是VGG16(但去掉了fc层加速)而YOLO普通版有24个卷积层。 SSD的输入尺寸较小(300 300),而YOLO是448 448,即使网络结构类似计算量差距还是挺明显的,速度快一点正常。 ssd全靠卷积完成,而yolo里还有全连接,用上gpu的话肯定是ssd快

在ssd中,首先每个真实物品都先选择一个负责它的bounding box,在没有训练指之前,因为prior bounding box的位置都是确定的,所以选择IOU最大的为正样本。为平衡正负样本的比率,将IOU大于0.5的prior bounding box都设置为正样本。这样模型就更加稳定了。

SSD算法思想和结构详解 :

SSD详解

上一篇:学位论文李霞

下一篇:博士论文格式例文