michelle850322
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?:
蝶澈kaixin
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详解
论文发表一般需要的时间如下: 1、普刊即省级国家级一般安排周期是1到3个月。 2、本科学报的安排周期一般为2到4个月。 3、北大核心以上级别期刊的安排周期
改进yolov5能发小论文。 主做目标检测的,正好最近在用yolov5,说点个人看法吧,不一定对。 首先yolo系列发展到现在,思想已经很成熟了,像具体的改进,
yolo系列和ssd发表的时间顺序是yolov1,ssd,yolov2,yolov3,当然现在yolov4也出现了。这个是我之前在看完yolov1之后阅读ssd
调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax 对于多尺度检测来说,采用多个尺度进行预测,具体形式是在网络预测的最后
YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv