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详解
目标检测的发展大致经历了两个历史时期,如下图所示:
从图中可以看出,Joseph Redmon于2015年提出YOLO算法是的单阶段目标检测算法的开山鼻祖,跟R.Girshick于2014年提出的RCNN系列两阶段目标算法一起引领基于深度学习的目标检测算法的发展。YOLO系列算法是一种能满足实时检测要求(FPS > 30)的高精度算法,如下图所示,所以受到广大工程应用人员的青睐, 在实际项目中有非常广泛的应用 ,值得初学者投入时间精力去学习、研究和应用。
YOLOv2有一些待改进点:
YOLOv3是在YOLOv2的待改进点上做了进一步的优化,包括:
从此其它人开始接手YOLO系列算法的改进工作,比较出名的有:
YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对于小物体的检测能力。YOLOv3算法使用一个单独神经网络作用在图像上,将图像划分多个区域并且预测边界框和每个区域的概率。 YOLOv3仅使用卷积层,使其成为一个全卷积网络(FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着batch normalization层和leaky ReLU层。没有池化层,使用步幅为2的卷积层替代池化层进行特征图的降采样过程,这样可以有效阻止由于池化层导致的低层级特征的损失。Darknet-53网络如下图左边所示。 输入是 。输出是带有识别类的边界框列表,每个边界框由 六个参数表示。如果 表示80个类别,那么每个边界框由85个数字表示。 在YOLO中,预测过程使用一个 卷积,所以输入是一个特征图。由于使用 卷积,因此预测图正好是特征图大小( 卷积只是用于改变通道数)。在YOLOv3中,此预测图是每个cell预测固定数量的边界框。 如上图所示,预测图的深度为75,假设预测图深度为 , 表示每个cell可以预测的边界框数量。这些 个边界框可以指定检测到一个物体。每个边界框有 个特征,分别描述中心点坐标和宽高(四个)和物体分数(一个)以及 个类置信度(上图中 )。YOLOv3每个cell预测三个边界框。 如果对象的中心(GT框中心)落在该cell感受野范围内,我们希望预测图的每个单元格都能通过其中一个边界框预测对象。其中只有一个边界框负责检测物体,首先我们需要确定此边界框属于哪个cell。 为了实现上面的想法,我们将原始图像分割为最后预测图维度大小的网格。如下图所示,输入图像维度为 ,步幅为32(最后的预测图降采样32倍),最后预测图维度为 ,所以我们将原始图像划分为 的网格。 直接预测框的宽高会导致训练时不稳定的梯度问题,因此,现在的很多目标检测方法使用log空间转换或者简单的偏移(offset)到称为锚框的预定义默认边界框。然后将这些变换应用到锚框以获得预测,YOLOv3具有三个锚框,可以预测每个单元格三个边界框。 锚框是边界框的先验,是使用k均值聚类在COCO数据集上计算的。我们将预测框的宽度和高度,以表示距聚类质心的偏移量。 以下公式描述了如何转换网络输出以获得边界框预测:这里 分别是我们预测的中心坐标、宽度和高度。 是网络的输出。 是网格从顶左部的坐标。 是锚框的维度(见下图)。 通过sigmoid函数进行中心坐标预测,强制将值限制在0和1之间。YOLO不是预测边界框中心的绝对坐标,它预测的是偏移量:相对于预测对象的网格单元的左上角;通过特征图cell归一化维度。 例如,考虑上面狗的图像。如果预测中心坐标是 ,意味着中心在 (因为红色框左上角坐标是 )。但是如果预测的坐标大于1,例如 ,意味着中心在 ,现在中心在红色框右边,但是我们只能使用红色框对对象预测负责,所以我们添加一个sidmoid函数强制限制在0和1之间。 通过对输出应用对数空间转换,然后与锚框相乘,可以预测边界框的尺寸(如上面的计算公式)。 物体分数表示一个边界框包含一个物体的概率,对于红色框和其周围的框几乎都为1,但边角的框可能几乎都为0。物体分数也通过一个sigmoid函数,表示概率值。 类置信度表示检测到的物体属于一个具体类的概率值,以前的YOLO版本使用softmax将类分数转化为类概率。在YOLOv3中作者决定使用sigmoid函数取代,原因是softmax假设类之间都是互斥的,例如属于“Person”就不能表示属于“Woman”,然而很多情况是这个物体既是“Person”也是“Woman”。 为了识别更多的物体,尤其小物体,YOLOv3使用三个不同尺度进行预测(不仅仅只使用 )。三个不同尺度步幅分别是32、16和8。这意味着,输入 图像,检测尺度分别为 、 和 (如下图或者更详细如图2所示)。 YOLOv3为每种下采样尺度设定3个先验框,总共聚类9个不同尺寸先验框。在COCO数据集上9个先验框分别是: 。下表是9个先验框分配情况: 我们的网络生成10647个锚框,而图像中只有一个狗,怎么将10647个框减少为1个呢?首先,我们通过物体分数过滤一些锚框,例如低于阈值(假设0.5)的锚框直接舍去;然后,使用NMS(非极大值抑制)解决多个锚框检测一个物体的问题(例如红色框的3个锚框检测一个框或者连续的cell检测相同的物体,产生冗余),NMS用于去除多个检测框。 具体使用以下步骤:抛弃分数低的框(意味着框对于检测一个类信心不大);当多个框重合度高且都检测同一个物体时只选择一个框(NMS)。 为了更方便理解,我们选用上面的汽车图像。首先,我们使用阈值进行过滤一部分锚框。模型有 个数,每个盒子由85个数字描述。将 分割为下面的形状:box_confidence: 表示 个cell,每个cell5个框,每个框有物体的置信度概率;boxes: 表示每个cell5个框,每个框的表示;box_class_probs: 表示每个cell5个框,每个框80个类检测概率。 即使通过类分数阈值过滤一部分锚框,还剩下很多重合的框。第二个过程叫NMS,里面有个IoU,如下图所示。 下图给出更加详细的输入输出情况: 文章原文: 论文原文: YOLOv3深入理解: keras实现YOLOv3博客: What new in YOLOv3?:
YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对于小物体的检测能力。YOLOv3算法使用一个单独神经网络作用在图像上,将图像划分多个区域并且预测边界框和每个区域的概率。 YOLOv3仅使用卷积层,使其成为一个全卷积网络(FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着batch normalization层和leaky ReLU层。没有池化层,使用步幅为2的卷积层替代池化层进行特征图的降采样过程,这样可以有效阻止由于池化层导致的低层级特征的损失。Darknet-53网络如下图左边所示。 输入是 。输出是带有识别类的边界框列表,每个边界框由 六个参数表示。如果 表示80个类别,那么每个边界框由85个数字表示。 在YOLO中,预测过程使用一个 卷积,所以输入是一个特征图。由于使用 卷积,因此预测图正好是特征图大小( 卷积只是用于改变通道数)。在YOLOv3中,此预测图是每个cell预测固定数量的边界框。 如上图所示,预测图的深度为75,假设预测图深度为 , 表示每个cell可以预测的边界框数量。这些 个边界框可以指定检测到一个物体。每个边界框有 个特征,分别描述中心点坐标和宽高(四个)和物体分数(一个)以及 个类置信度(上图中 )。YOLOv3每个cell预测三个边界框。 如果对象的中心(GT框中心)落在该cell感受野范围内,我们希望预测图的每个单元格都能通过其中一个边界框预测对象。其中只有一个边界框负责检测物体,首先我们需要确定此边界框属于哪个cell。 为了实现上面的想法,我们将原始图像分割为最后预测图维度大小的网格。如下图所示,输入图像维度为 ,步幅为32(最后的预测图降采样32倍),最后预测图维度为 ,所以我们将原始图像划分为 的网格。 直接预测框的宽高会导致训练时不稳定的梯度问题,因此,现在的很多目标检测方法使用log空间转换或者简单的偏移(offset)到称为锚框的预定义默认边界框。然后将这些变换应用到锚框以获得预测,YOLOv3具有三个锚框,可以预测每个单元格三个边界框。 锚框是边界框的先验,是使用k均值聚类在COCO数据集上计算的。我们将预测框的宽度和高度,以表示距聚类质心的偏移量。 以下公式描述了如何转换网络输出以获得边界框预测:这里 分别是我们预测的中心坐标、宽度和高度。 是网络的输出。 是网格从顶左部的坐标。 是锚框的维度(见下图)。 通过sigmoid函数进行中心坐标预测,强制将值限制在0和1之间。YOLO不是预测边界框中心的绝对坐标,它预测的是偏移量:相对于预测对象的网格单元的左上角;通过特征图cell归一化维度。 例如,考虑上面狗的图像。如果预测中心坐标是 ,意味着中心在 (因为红色框左上角坐标是 )。但是如果预测的坐标大于1,例如 ,意味着中心在 ,现在中心在红色框右边,但是我们只能使用红色框对对象预测负责,所以我们添加一个sidmoid函数强制限制在0和1之间。 通过对输出应用对数空间转换,然后与锚框相乘,可以预测边界框的尺寸(如上面的计算公式)。 物体分数表示一个边界框包含一个物体的概率,对于红色框和其周围的框几乎都为1,但边角的框可能几乎都为0。物体分数也通过一个sigmoid函数,表示概率值。 类置信度表示检测到的物体属于一个具体类的概率值,以前的YOLO版本使用softmax将类分数转化为类概率。在YOLOv3中作者决定使用sigmoid函数取代,原因是softmax假设类之间都是互斥的,例如属于“Person”就不能表示属于“Woman”,然而很多情况是这个物体既是“Person”也是“Woman”。 为了识别更多的物体,尤其小物体,YOLOv3使用三个不同尺度进行预测(不仅仅只使用 )。三个不同尺度步幅分别是32、16和8。这意味着,输入 图像,检测尺度分别为 、 和 (如下图或者更详细如图2所示)。 YOLOv3为每种下采样尺度设定3个先验框,总共聚类9个不同尺寸先验框。在COCO数据集上9个先验框分别是: 。下表是9个先验框分配情况: 我们的网络生成10647个锚框,而图像中只有一个狗,怎么将10647个框减少为1个呢?首先,我们通过物体分数过滤一些锚框,例如低于阈值(假设0.5)的锚框直接舍去;然后,使用NMS(非极大值抑制)解决多个锚框检测一个物体的问题(例如红色框的3个锚框检测一个框或者连续的cell检测相同的物体,产生冗余),NMS用于去除多个检测框。 具体使用以下步骤:抛弃分数低的框(意味着框对于检测一个类信心不大);当多个框重合度高且都检测同一个物体时只选择一个框(NMS)。 为了更方便理解,我们选用上面的汽车图像。首先,我们使用阈值进行过滤一部分锚框。模型有 个数,每个盒子由85个数字描述。将 分割为下面的形状:box_confidence: 表示 个cell,每个cell5个框,每个框有物体的置信度概率;boxes: 表示每个cell5个框,每个框的表示;box_class_probs: 表示每个cell5个框,每个框80个类检测概率。 即使通过类分数阈值过滤一部分锚框,还剩下很多重合的框。第二个过程叫NMS,里面有个IoU,如下图所示。 下图给出更加详细的输入输出情况: 文章原文: 论文原文: YOLOv3深入理解: keras实现YOLOv3博客: What new in YOLOv3?:
yolo v3是2018年出来的,比SSD和retinanet都要晚,在map0.5这个指标上速度比SSD和retinanet快很多。在工业应用上面map0.5已经满足使用,并且yolo v3简介,文档丰富,还有tiny版本等一些列变种。最重要的是速度非常快,比SSD和retinanet都要快。
YOLOv3 的提出不是为了解决什么问题,整篇论文其实是技术报告。YOLOv3 在 YOLOv2 基础上做了一些小改进,文章篇幅不长,核心思想和 YOLOv2、YOLO9000差不多。
模型改进:
边界框预测:定位任务采用 anchor box 预测边界框的方法,YOLOv3 使用逻辑回归为每个边界框都预测了一个分数 objectness score,打分依据是预测框与物体的重叠度。如果某个框的重叠度比其他框都高,它的分数就是 1,忽略那些不是最好的框且重叠度大于某一阈值(0.5)的框。
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详解
出版时间跟你发表时间是不一样的,所以要区分开来,我的经验告诉我,早点发表会好些
考虑到发表论文对于评职称来说是非常重要的,因此在发表论文时应当尽量考虑到评职称的具体要求,以保证论文质量。最佳发文时间是在近几年中,根据评职称所提出的相关要求发表论文最好。一般来说,针对评职称相关要求,申请人最好在最近的几年中发表论文,以保证论文质量。另外,在近几年中发表的论文也可以得到更多人的关注,有助于实现个人在学术界的成就。同时,在发表论文的过程中也应当了解国内学术界的最新发展动态,以便申请人更好地理解论文发表的背景,从而发表更有竞争力的论文。
发表论文 多久能发表 ?有很多人快到评职称提交评估材料的时间,各种考试都通过了,但还没有发表文章,即使加急发表,但也不能保证100%的发表成功,比如参加各类考试而耽误些文章,导致文章不符合杂志的要求,同时期刊杂志上也有各种各样的出版延误的原因,如版面已经排满,这是很耽误时间的,或许几个月,甚至是一年之后才会有版面的情况也是很有可能的,所以把握好发布时间是至关重要的,那么 什么时候发表论文最为合适 呢?职称评审一年只有一次,一年的延迟对于作者来说会带来什么样的损失,不言而喻,下面具体讲下发表论文什么时候发表最为合适。 省级、国家级期刊建议至少提前8个月准备;一般来讲,杂志社为了确保每期杂志正常出刊,都会提前将当期之后1-3个月的稿件提前安排好,而一些创刊较早,认可度更高的热门期刊,来稿量较大,发表周期可能就会更久。提前准备,意味着杂志的可选择性更多。 核心期刊建议至少提前12个月准备;核心期刊正常的审稿周期为1-3个月,且审核严格,退稿、返修几率更大,这意味着在流程上耗费的时间更久;且 核心期刊 版面有限,投稿竞争更加激烈,即使被录用,排刊也比普通期刊晚很多,因此需要更早准备。 因此我们建议大家,评职称之前3-6个月收到刊物就行,不要提前太多,也不要迟于3个月。原因是这样的:太早发表,可能评职称的要求变了,还要重新发表,而且刊物容易丢失;太晚发表也不行,如果刊物发行延迟,势必影响晋职,另外,刊物在知网收录还需要1-2个月的时间,所以最好能提前3个月-6个月的时间拿到刊物,这样比较保险。
问题一:论文投稿到发表一般要多长时间?怎么样发表比较快? 你要自己向杂志社投稿,需要等待的时间就比较长,而且如果不通过审核,你的论文就会石沉大海。这样容易耽误事,找个论文网帮你发表,我以前找学位论文网给发表了两篇论文,两个月就出刊了。 问题二:发表论文需要多长时间? 发表一篇省级的论文最快要一个月左右 因为以前我和我们同事发的挺多的,一般周期我还比较了解 网上有很多说一周即收到书,那种就不要相信了,最快也要一个月的 别太着急,容易上当 我们以前单位都是在信远论文网发表的,书也收到了 发表论文这种事不能太着急,选择一本合适的期刊,正规的期刊发表吧 问题三:发表一篇文章需要多长时间? 学报的级别不同,时间不同, 文章的质量不同,时间也不需要同, 用钱多少,时间也不同! 如果有特殊关系,文章质量也不错, 最快需要2―3个月, 一般的需要半年左右! 一级学报最少需要1年左右! 问题四:一般职称论文要多长时间可以发表? 不同的杂志出版周期不一样,一般要两三个月(特别快的一个月左右甚至半个月, 一部分可以办理特别加急发表 ),杂志有个出版周期的问题,而且有的杂志版面很紧张,所以,如果用,应尽早预订,不宜临时抱佛脚,以免被动。每年三月份到十月份,是各地陆续上报职称材料的高峰期,各个正规杂志稿子都大量积压,版面都比较紧张,有的杂志可以安排的论文又很有限,因此应当及早准备。早准备,早受益,拖拉很有可能误事。 问题五:杂志上发表的论文要多久才在知网检测的到 一般1-3个月,期刊一般比较快,如果是学报,就有点慢。再一个,核心刊物会更慢一点。 问题六:核心期刊论文发表一般多长时间能出稿? 一般快的话1-2个月,慢的话3-4个月,这要看你怎么发表了,现在发表的话,不过两个方法。 问题七:核心论文一般要多久才能发表到期刊? 10分 如果你的讠仑文内容和质量符合杂志的要求,一般从投稿到发表需要一年时间吧,通过中介可能会快些,不过费用相对较高,具体可参考本人网攒。 问题八:论文投稿到发表一般要多长时间要怎样发表比较快?有什么好的网站能进 论 文投稿 到 发 表 一 般通 过 审核 就 是 两 三 天 问题九:发表的论文投稿后一般等多长时间呢? 你好!论文投出去后,第一步初审,初审合格后进行第二步外审,外审得三个月左右,所以到收录至少8个月左右。祝你投稿成功!!
论文发表一般需要的时间如下: 1、普刊即省级国家级一般安排周期是1到3个月。 2、本科学报的安排周期一般为2到4个月。 3、北大核心以上级别期刊的安排周期一般为6到8个月,审稿周期为一个月。 4、科技核心期刊从投稿到录用发表,一般是3到6个月。
发表论文 多久能发表 ?有很多人快到评职称提交评估材料的时间,各种考试都通过了,但还没有发表文章,即使加急发表,但也不能保证100%的发表成功,比如参加各类考试而耽误些文章,导致文章不符合杂志的要求,同时期刊杂志上也有各种各样的出版延误的原因,如版面已经排满,这是很耽误时间的,或许几个月,甚至是一年之后才会有版面的情况也是很有可能的,所以把握好发布时间是至关重要的,那么 什么时候发表论文最为合适 呢?职称评审一年只有一次,一年的延迟对于作者来说会带来什么样的损失,不言而喻,下面具体讲下发表论文什么时候发表最为合适。 省级、国家级期刊建议至少提前8个月准备;一般来讲,杂志社为了确保每期杂志正常出刊,都会提前将当期之后1-3个月的稿件提前安排好,而一些创刊较早,认可度更高的热门期刊,来稿量较大,发表周期可能就会更久。提前准备,意味着杂志的可选择性更多。 核心期刊建议至少提前12个月准备;核心期刊正常的审稿周期为1-3个月,且审核严格,退稿、返修几率更大,这意味着在流程上耗费的时间更久;且 核心期刊 版面有限,投稿竞争更加激烈,即使被录用,排刊也比普通期刊晚很多,因此需要更早准备。 因此我们建议大家,评职称之前3-6个月收到刊物就行,不要提前太多,也不要迟于3个月。原因是这样的:太早发表,可能评职称的要求变了,还要重新发表,而且刊物容易丢失;太晚发表也不行,如果刊物发行延迟,势必影响晋职,另外,刊物在知网收录还需要1-2个月的时间,所以最好能提前3个月-6个月的时间拿到刊物,这样比较保险。
你好,根据一般习惯,是以杂志实际出版的日期为准,因为自它印刷并公开发行的时候就已经达到了出版的事实标准。杂志上标注的刊期只是杂志社为了杂志的时效性所以都会把时间往后写,这样当你8月收到9月杂志的时候不会觉得晚。特别是对一些在市场上公开销售的刊物来说,这样能避免读者买杂志总觉得像是买到过期的一样,保持读者的新鲜感。一般杂志从收稿到编辑、校对、印刷、发行都会有不同的时长,刊期越长(月刊、双月刊、季刊)出版周期就越长,特别好的学术期刊,长的甚至半年一年,所以你发表时一定要注意问清杂志的出版时间能不能赶上你的时间需要,以免做了无用功。要发表可以再问我,我就是杂志编辑
看你上面的刊期,在职称评定中,是以刊期为准的。如果是5月份的刊期,即使是8月份收到的,也是按5月份算的。
论文发表时间是指文章见刊时间。
首先如果论文发表纯属作者个人爱好,那么发表时间就是文章见刊时间。但是如果论文发表是用来评职称晋升的,就需要特别注意一下了,职称论文的发表是以论文被检索为标准的,并不单单是见刊,要见刊并且被检索才行,因此要区分不同的论文来看。
评职称论文发表注意事项:
1、要明确发表那种级别的期刊才可以顺利评过职称,省级以上的、或者要国家级的、核心期刊等。最好是询问你们单位管理职称的部门,评定相应级别的职称是需要发那种级别的期刊。
2、明确职称评定时间。这一点非常重要,写作论文,发表论文前,一定要了解明确职称评定时间,早做准备,因为一般论文发表的时间为3个月左右,长的则半年甚至一年,而职称评定时,有的要求必须通过数据库检索到,论文发表出刊后,几个数据库一般2个月后才能收录进去,因此,还有考虑2个月的收录时间。
在您刚当上老师的评职称的时候,要发表论文,在每年一度的教师评比的时候可以发,这样就有更多的人在论坛里看到你所发表的论文,就会觉得给你支撑,其实是挺不错的
你好,根据一般习惯,是以杂志实际出版的日期为准,因为自它印刷并公开发行的时候就已经达到了出版的事实标准。杂志上标注的刊期只是杂志社为了杂志的时效性所以都会把时间往后写,这样当你8月收到9月杂志的时候不会觉得晚。特别是对一些在市场上公开销售的刊物来说,这样能避免读者买杂志总觉得像是买到过期的一样,保持读者的新鲜感。一般杂志从收稿到编辑、校对、印刷、发行都会有不同的时长,刊期越长(月刊、双月刊、季刊)出版周期就越长,特别好的学术期刊,长的甚至半年一年,所以你发表时一定要注意问清杂志的出版时间能不能赶上你的时间需要,以免做了无用功。要发表可以再问我,我就是杂志编辑
看你上面的刊期,在职称评定中,是以刊期为准的。如果是5月份的刊期,即使是8月份收到的,也是按5月份算的。
肯定算的是9月份发表的。严格意见上来讲,就没有发表时间这一说,都是出版时间,按《出版物管理条例》及其实施细则等,连续出版物是不允许提前出刊的,像这种9月的刊期,8月出版的,都是违法操作的,就是为了评职称提前拿到刊物而操作的。按相关规定,连续出版物一般为当月或次月出版,一般来说,月刊为每月15日出版,旬刊为每月5、15、25日出版,半月刊为每月10日、20日出版。8年专业发表经验,希望我可以帮到您