yolov2

直观理解yolov1

train

在 ImageNet 1000数据集上预训练一个分类网络,这个网络使用Figure3中的前20个卷积层,然后是一个平均池化层和一个全连接层。(此时网络输入是224×224。主干结构的输入要求必须是448x448的固定尺寸,主要原因是加入了平均池化层,这样不论输入尺寸是多少,在和最后的全连接层连接时都可以保证相同的神经元数目)

经过上一步的预训练,就已经把主干网络的前20个卷积层给训练好了,前20层的参数已经学到了图片的特征。接下来的步骤本质就是迁移学习,在训练好的前20层卷积层后加上4层卷积层和2层全连接层,然后在目标检测的任务上进行迁移学习。

NMS只发生在预测阶段,训练阶段是不能用NMS的,因为在训练阶段不管这个框是否用于预测物体的,他都和损失函数相关,不能随便重置成0。

dectect

首先将一张图像分成 S × S网格(gird cell),然后将它一股脑送入CNN,生成S × S × (B × 5 + C)个结果,最后用NMS选出合适的预选框。

yolov1损失函数 

 

  • S^2代表的S*S个网格

  • B代表的每个网格有几个预测框

  • obj表示i,j个框负责这个检测置1,否则为0

 S×S 个网格,每个网格要预测 生成B个bounding box,还要预测 C 个类。将两图合并,网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数,再加上每个网格都有C个预测类)
7 × 7 × 2 = 98个bounding box       7 × 7=49个grid cell    每个cell30个输出值

在YOLOv1中,类别概率是由grid cell来预测的,每个cell都预测2个boxes,每个boxes包含5个值,每个grid cell 携带的是30个信息(上图的那一根向量)。但是每个cell只预测一组分类概率值,供2个boxes共享。

直观理解yolov2

train

(1)在ImageNet训练Draknet-19,模型输入为224×224,共160个epochs

(2)将网络的输入调整为448×448,继续在ImageNet数据集上finetune分类模型,训练10 个epochs。参数除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001。

(3)修改Darknet-19分类模型为检测模型,并在监测数据集上继续finetune模型

detect

注意:v1直接输出坐标,v2网络是输出偏移量

416x416进去,darknet——19分类网络提取特征,最后得到13x13x1024(理解为13X13的小图片有1024个),用这1024个特征来预测K(1+C+4)个结果值。

Anchor初始是固定的,但在训练过程中会进行微调(不是直接预测生成了)。使用Anchor boxes之后,每个位置的各个Anchor box都单独预测一组分类概率值。

 在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由cell决定,因此这边每个box对应25个预测值。每个grid cell携带的是 25 × 5 =125个信息,25是 xywh+置信度+分类数,5就是5个Anchor。

13 × 13 × 5 = 845个bounding box   13 × 13个grid cell  每个cell 25 × 5 =125个输出值

YOLOv2(YOLO9000)

下面那个分叉就是 passthrough的体现

文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。

(两种数据集,一种学习分类,一种学习位置)

联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。

darknet-19就是分类数据集上训练出来的。

YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。

就是说只用大数据集训练得到darknet-19(来提取特征),用小数据集来得到自己最后的模型。

改进:

Batch Normalization(批量归一化) 

mAP提升2.4%。

批量归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。

High resolution classifier(高分辨率图像分类器)

mAP提升了3.7%

YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。

把得到的分类网络用更大的分辨率的imagenet图片训练10个epoch,适应分辨率变化。

Convolution with anchor boxes(使用先验框)

先验框在网格中心生成。

召回率大幅提升到88%,同时mAP轻微下降了0.2。

YOLOV1包含有全连接层,从而能直接预测Bounding Boxes的坐标值。Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

(正如同我们在大学学习高等数学,有了高中的数学积累后,高等数学中的许多东西学起来也就有了一些基础,尽管高中数学的内容完全不够用,但总好过于一个从来没有学过数学的人直接学高等数学,后者的学习难度可想而知)

(预测偏移量而不是直接预测坐标值可以简化问题、提高训练效果,并且带来更好的检测性能)

借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个。YOLO2如果每个grid采用9个先验框,总共有13*13*9=1521个先验框。

在之前的YOLOv1中,我们已经知道每个网格处会有1个边界框输出,而现在变成了预测k个先验框的偏移量。原先的YOLOv1中,每个网格处的B个边界框都有一个置信度,但是类别是共享的,因此每个网格处最终只会有一个输出,而不是B个输出(置信度最高的那一个),倘若一个网格包含了两个以上的物体,那必然会出现漏检问题。加入先验框后,YOLOv1改为每一个先验框都预测一个类别和置信度,即每个网格处会有多个边界框的预测输出。因此,现在的YOLOv1的输出张量大小是S×S×k×(1+4+C),每个边界框的预测都包含1个置信度、4个边界框的位置参数和个类别预测。

为什么去掉全连接层了呢?

因为全连接层容易过拟合,训练慢。(参数太多)如下图,YOLOv1中通过全连接层将7×7×1024的特征图变换为7×7×30的特征图。但是这种变换完全可以通过一个3×3的卷积核做到,从而节省参数。

(就是原来是每个格代表一个类,仅输出一个框,现在每个先验框都可以代表一个类,输出多个框。)

所以最终YOLO去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。

作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率。

收缩网络让其运行在416*416而不是448*448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO的卷积层采用32这个值来下采样图片,所以通过选择416*416用作输入尺寸最终能输出一个13*13的Feature Map。

使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。

Dimension clusters(维度聚类提取先验框的尺度信息)

之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2的做法是对训练集中标注的边框进行K-mean聚类分析,以寻找尽可能匹配样本的边框尺寸。

如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:

centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。

锚框在每个cell中间,不同大小形状的

Direct location prediction(约束预测边框的位置)

在训练初期,模型很有可能会输出数值极大的中心点偏移量,导致训练不稳定甚至发散。于是,作者使用sigmoid函数使得网络对偏移量的预测是处在01范围中 

 

因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。

 Fine-Grained Features(passthrough层检测细粒度特征)

注意: 这里的叠加不是ResNet里的add,而是拼接,是DenseNet里的concat。

passthrough层检测细粒度特征使mAP提升1。

对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416*416经过卷积网络下采样最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。

YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

另外,根据YOLO2的代码,特征图先用1*1卷积从 26*26*512 降维到 26*26*64,再做1拆4并passthrough。

不难发现,特征图在经过reorg操作的处理后,特征图的宽高会减半,而通道则扩充至4倍,因此,从backbone拿出来的26×26×512特征图就变成了13×13×2048特征图。这种特殊降采样操作的好处就在于降低分辨率的同时,没丢掉任何细节信息,信息总量保持不变。

Multi-ScaleTraining(多尺度图像训练)

区别于之前的补全图片的尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batches,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小320*320,最大608*608,网络会自动改变尺寸,并继续训练的过程。

这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在YOLO v2的速度和精度上进行权衡。

因为YOLOV2调整网络结构后能够支持多种尺寸的输入图像。通常是使用416*416的输入图像,如果用较高分辨率的输入图像,比如544*544,则mAP可以达到78.6%,有1.8%的提升。

这种多尺度训练的好处就在于可以改变数据集中各类物体的大小占比,比如说,一个物体在608的图像中占据较多的像素,面积较大,而在320图像中就会变少了,就所占的像素数量而言,相当于从一个较大的物体变成了较小物体。通常,多尺度训练是常用的提升模型性能的技巧之一。不过,技巧终归是技巧,并不总是有效的,若是我们的目标几乎不会有明显的尺寸变化,那么也就没必要进行多尺度训练了。

  Darknet-19(backbone网络)

其中的卷积层即为前面所提到的“卷积三件套”:线性卷积、BN层以及LeakyReLU激活函数的组合。DarkNet19名字中的19是因为该网络共包含19个卷积层。

作者首先将DarkNet19在ImageNet上进行预训练,获得了72.9%的top1准确率和91.2%的top5准确率。在精度上,DarkNet19网络达到了VGG网络的水平,但前者模型更小。

预训练完毕后,去掉表中的最后第24层的卷积层、第25层的平池化层以及第26层的softmax层,然后换掉原先的backbone网络。于是,YOLOv1网络从上一次的69.2% mAP提升到69.6% mAP。

(最后三步就是,通道数变为1000,然后全局池化,输出1000个数,每个数是一个特征。然后softmax来预测各个类别的概率)

注意:!这个网络是提前训练好的,去掉后三层直接用!

Hierarchical classification(分层分类) 

作者提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集的图片去学习检测相关的信息,例如bounding boxes 坐标预测,是否包含物体以及属于各个物体的概率。使用仅有类别标签的分类数据集图片去扩展可以检测的种类。

作者通过ImageNet训练分类、COCO和VOC数据集来训练检测,这是一个很有价值的思路,可以让我们达到比较优的效果。 通过将两个数据集混合训练,如果遇到来自分类集的图片则只计算分类的Loss,遇到来自检测集的图片则计算完整的Loss。

直观理解

“只从模型的分类层反向传播损失”时,意味着我们仅将损失反向传播到网络的最后几层(通常这些层被视为分类层)。这时,网络的前面几层(常常被称为特征提取层)不会被更新。这种方法通常被称为“冻结模型的第一部分”或者是"冻结一部分参数"。

冻结模型层的核心原理是,深度神经网络的前几层通常能够学习到更通用的特征,而后几层则会学习到针对特定任务的特征。在你们的实例中,使用分类数据集来训练网络时,只更新最后的分类层。这样,前几层会保持原来的特征提取能力,而最后几层则会重点学习针对新任务(即图像分类)的特殊特征。这种训练策略对于数据不平衡的任务,或者是在有限的标注数据集上训练模型尤其有用。

但是ImageNet对应分类有9000种,而COCO则只提供80种目标检测,作者使用multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。通过作者Paper里的图来说明,由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为分层树):

  1. 遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径;
  2. 如果路径直有一条,那么就将该路径直接加入到分层树结构中;
  3. 否则,从剩余的路径中选择一条最短路径,加入到分层树。

这个分层树我们称之为 WordTree,作用就在于将两种数据集按照层级进行结合。

分类时的概率计算借用了决策树思想,某个节点的概率值等于该节点到根节点的所有条件概率之积。最终结果是一颗 WordTree (视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。如果想求得特定节点的绝对概率,只需要沿着路径做连续乘积。例如,如果想知道一张图片是不是“Norfolk terrier ”需要计算: 

另外,为了验证这种方法作者在WordTree(用1000类别的ImageNet创建)上训练了Darknet-19模型。为了创建WordTree1k,作者添加了很多中间节点,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播。例如,如果一张图片被标记为“Norfolk terrier”,它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。

softmax操作也同时应该采用分组操作,下图上半部分为ImageNet对应的原生Softmax,下半部分对应基于WordTree的Softmax

尽管增加了369个额外的概念,但我们的准确率只下降了一点。以这种方式进行分类也有一些好处。在新的或未知的对象类别上,性能会优雅地下降。例如,如果网络看到一张狗的照片,但不确定它是什么类型的狗,它仍然会以高置信度预测 “狗”,但在假名中分布的置信度会降低。

这种表述也适用于检测。现在,我们不是假设每张图片都有一个物体,而是使用YOLOv2的物体性预测器来给我们提供Pr(物理物体)的值。检测器会预测出一个边界框和概率树。我们向下遍历这棵树,在每一个分叉处采取最高的置信度路径,直到我们达到某个阈值,我们就可以预测那个物体类别。

 

YOLO9000是怎样进行联合训练的?
YOLO9000采用 YOLO v2的结构,Anchorbox由原来的5调整到3,对每个Anchorbox预测其对应的边界框的位置信息x , y , w , h和置信度以及所包含的物体分别属于9418类的概率,所以每个Anchorbox需要预测4+1+9418=9423个值。每个网格需要预测3×9423=28269个值。在训练的过程中,当网络遇到来自检测数据集的图片时,用完整的 YOLO v2 loss进行反向传播计算,当网络遇到来自分类数据集的图片时,只用分类部分的loss进行反向传播。

YOLO 9000是怎么预测的?
WordTree中每个节点的子节点都属于同一个子类,分层次的对每个子类中的节点进行一次softmax处理,以得到同义词集合中的每个词的下义词的概率。当需要预测属于某个类别的概率时,需要预测该类别节点的条件概率。即在WordTree上找到该类别名词到根节点的路径,计算路径上每个节点的概率之积。预测时, YOLO v2得到置信度,同时会给出边界框位置以及一个树状概率图,沿着根节点向下,沿着置信度最高的分支向下,直到达到某个阈值,最后到达的节点类别即为预测物体的类别。子节点的分类概率小于给定的预设阈值时,就会停止遍历。

总结

YOLOv2(You Only Look Once v2)是一种实时目标检测算法,其算法流程可以总结如下:

  1. 输入:将输入图像分割为 S × S 个网格单元(grid cell)。

  2. 特征提取:使用卷积神经网络(CNN)对输入图像进行特征提取。YOLOv2使用Darknet-19作为基础网络,其中包含19个卷积层和5个池化层,但去掉了最后的全连接层。

  3. 特征融合:在最后一个卷积层之后添加一个1×1卷积层,用于将通道数调整为 B × (5 + C),其中 B 是每个网格单元预测的边界框数量,5表示每个边界框需要预测的值(边界框坐标和置信度),C 是待检测的类别数。

  4. 预测边界框:对特征融合后的特征图进行解码,得到每个网格单元的预测边界框。对于每个网格单元,预测 B 个边界框,每个边界框包含 5 个预测值。

  5. NMS(非极大值抑制):对预测的边界框进行非极大值抑制,去除重叠度较高且置信度较低的边界框,保留置信度较高的边界框。

  6. 输出:得到最终的检测结果,每个边界框附带预测的置信度和类别概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值