对YOLO-v2的理解及阅读笔记

YOLO-v2 阅读笔记

YOLO-v2论文标题:《YOLO9000:Better, Faster, Stronger》,CVPR2017的文章。论文地址:(懒得写链接了)。论文复现代码:http://pjreddie.com/yolo9000/
这篇文章其中提出了两种模型,YOLOv2和YOLO9000.但是少了很多细节,比如损失函数的设计、先验框的匹配原则等,想要真正搞懂需要花不少力气看源码。
采用多尺度的训练方法,YOLOv2在速度和准确度上有了很好的均衡。YOLO9000指的是,可以检测超过9000种物体的检测器。提出了一种联合进行目标检测和分类训练的方法,能够同时在COCO数据集和ImageNet数据集上训练YOLO9000。这样的训练方法使YOLO9000能够对没有label类别的数据进行检测。

第一章 介绍

  1. 相对于图像分类任务而言,目标检测任务能够检测出来的目标种类数目少得多。这主要是由于缺乏足够丰富的数据集造成的,因为给检测数据打标签要比分类标签难。
  2. 因此,我们提出了一种新方法能够利用现有的大量分类数据来扩充检测系统,将不同的数据结合起来。其次,我们提出了一种联合训练算法,使得我们能够同时进行检测和分类任务的训练。我们的方法利用带有标签的检测图像来学习如何精确定位目标,同时使用分类图像来增加其词汇量和鲁棒性。
  3. 文章结构是这样,先对YOLOv1进行改进,然后使用联合训练方法在ImageNet和COCO数据集上进行训练。

第二章 Better

先概括一下本章:作者在YOLO1的基础上进行改进,想要在保持速度的基础上增加准确率,主要有两个思路:使用高分辨率的特征以提高小目标检测,使用更精细的Bbox设计使得定位更准确。主要做了以下几方面的工作:添加BN层;在ImageNet上使用高分辨率的图像训练分类网络,在VOC检测数据上使用多尺度输入图像以适应不同输入尺寸;尝试了anchor box,虽然recall上升但是mAP下降了,那么吸收anchor的优点对YOLO的Bbox设计进行改进;最后用了一个类似shortcut的传递层将高、低分辨率的特征图结合起来。
这部分细节很多,我没有看源码,想要真正理解还是要去看源码。

  1. 根据YOLOv1存在的缺点,我们主要针对recall和定位准确性进行了改进。表2展示了YOLO与YOLOv2的对比,很清楚地看出在添加不同设计方法后mAP的变化(良心)。然后下面分别说明了每个设计策略。(一些tricks)
    对YOLO-v2的理解及阅读笔记_第1张图片
  2. BN层
    添加BN层能够显著提升模型的收敛效果,有助于规范模型,同时我们将dropout去掉的情况下也没有出现过拟合的现象。在所有的卷积层上使用BN使得mAP增加了2%。
  3. 高分辨率分类器
    对于YOLOv2,我们首先在ImageNet上使用448×448的图像对分类网络运行10个epoch,进行fine tune。使得网络能够在较高的分辨率上运行良好(之前的分类网络一般是256*256)。然后再在检测数据上fine tune(与YOLOv1相同)。高分辨率的分类网络训练使得mAP增加4%。
  4. 带有anchor的卷积
    学习FR-CNN的思想,用带有anchor的卷积,直接预测anchor的偏移量,而不是预测坐标值,更有易于网络学习。然后说明了作者使用anchor在YOLO中的一些实验。(这部分可以跳过,因为YOLOv2里并没有使用anchor,这里记录为了学习实验方法)首先移除了YOLO中的全连接层,并且移除了一个池化层来使得卷积网络的输出有更高的分辨率;其次将输入图像的尺寸从448缩小为416,这样做是因为我们希望在特征图中有一个奇数的位置,只有一个中心单元格。那么对于大的目标就可以占据较为中心的位置,所以有一个中心格来预测这个位置。经过下采样,最终YOLO输出是13*13的特征图。再次,与YOLO类似,将分类和检测任务分开,confidence的计算方法也与YOLO相同,此处不再赘述。最终,带有anchor的YOLO对一张图像会生成超过1000个anchor box,而原来的YOLO只有98个,尽管recall上升,但mAP下降了0.3%。
  5. Dimension Clusters.
    在使用anchor的时候遇到了两个问题。
    首先anchor的尺寸是手工设计的,尽管网络可以对box进行调整,但是如果我们有更好的先验框,就能让网络更容易学习。于是,作者使用k-means算法对训练集的目标边界框进行聚类(刷分trick,获取先验知识),通过聚类获得较好的anchor尺寸。这里需要注意的是,使用k均值原始的欧式距离计算误差是不合适的,较大尺寸的边界框会得到更大的误差损失,又由于我们的目的是使得边界框与GT框的IOU较大,因此设计了如下的距离计算公式:
    在这里插入图片描述
    我们尝试了不同的k值下的效果。K均值聚类的结果如下图所示,尽管k越大IOU越高,但是作者只取到k=5,为啥呢?因为这是考虑recall效果与模型复杂度均衡的结果。虽然k越大越好,但是模型会更复杂,因此取到5(这样的说法学到了没)。
    对YOLO-v2的理解及阅读笔记_第2张图片
    然后还没完,作者又对不同的先验框尺寸生成方法作了分析,如下表。没啥好说的,还是聚类好。
    对YOLO-v2的理解及阅读笔记_第3张图片
  6. 直接定位预测
    使用带有anchor的YOLO还有第二个问题(第一个问题还记得在哪吗…):模型不稳定,尤其在刚开始的epoch中。大部分的不稳定性来自于预测box的(x,y)位置。
    在RPN网络中不是直接预测边界框的位置,而是预测对先验框的偏移(转置)tx,ty,如果用x,y表示Bbox中心点坐标,那么公式为:
    在这里插入图片描述
    经过查阅资料(百度一下)发现,这里的减号应该是加号,这样也才能满足论文中给出的例子说明,即如果预测的tx=1,那么Bbox就会向右移动一个宽度大小;如果是-1,会向左移动一个宽度大小。
    这个公式是无约束的,因此anchor的位置可以在图像上的任何一点,而不用考虑哪个单元格预测的box。通过随机初始化,模型需要很长时间才能稳定预测合理的偏移量。
    然后在YOLO2中我们还是沿用YOLO1的坐标预测方法,计算与单元格的相对位置。输出的13*13特征图中,每个单元格会预测5个Bbox,每个Bbox有5个坐标值:tx, ty, tw, th, and to。设单元格相对于图像左上角偏移为(Cx,Cy),Bbox的原始宽高为pw,ph,(注意,此时的cx,cy是已经经过归一化的,范围在0~1之间)那么由边界框回归算法可知,预测值为:
    对YOLO-v2的理解及阅读笔记_第4张图片
    其中,σ是sigmoid激活函数,目的是将Bbox的中心点约束在当前单元格中,将值约束在0~1的范围内。to类似于confidence. 预测过程如下图所示,写得挺明白,不再赘述。
    对YOLO-v2的理解及阅读笔记_第5张图片
    由于我们限制了位置预测,因此参数化更容易学习,使网络更加稳定。
  7. Fine-Grained Features
    这部分我觉得别人解释地很好,我放个截图。
    对YOLO-v2的理解及阅读笔记_第6张图片
  8. 多尺度训练
    这部分讲的是,由于我们没有全连接层,因此我们想让网络适应不同输入尺寸(不同分辨率)的图像。具体做法是,我们每10个batch随机选取一个输入尺寸,由于我们的下采样降低了32倍的输入尺寸,所以我们从下列32的倍数中提取:{320,352,…,608}。
    注意这是在检测数据集,也就是VOC上做的,跟ImageNet的预训练是两回事。

第三章 Faster

  1. 先吐槽一下,VGG-16虽然很强大,但是不必要的复杂,太慢;GoogleNet虽然快一点,但是分类效果差一点。轮子不好使那怎么办?于是作者自己提出了一个新的分类网络模型:DarkNet-19,它拥有19个卷积层和5个maxpooling层。
  2. 然后介绍了DarkNet-19在ImageNet上的训练过程,也就是文章开头提到的分类网络的训练。这里借用别人的解释做一些补充。
    对YOLO-v2的理解及阅读笔记_第7张图片对YOLO-v2的理解及阅读笔记_第8张图片
    YOLOv2的结构示意图如下:
    在这里插入图片描述
    对YOLO-v2的理解及阅读笔记_第9张图片
    另外需要注意的一点是,在计算boxes的和误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正.这里详细介绍了损失函数的改进。

第四章 Stronger

这部分提出了YOLO9000.
YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。在YOLO中,边界框的预测其实并不依赖于物体的标签(由单元格确定目标的分类,与Bbox无关),所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。

  1. 在训练过程中,联合了检测和分类的数据集。当遇到分类数据时,只反向传播YOLO中分类网络的部分。
  2. 这就会遇到一些问题,标签的不一致。分类数据的标签更加细致。因此我们需要融合这些标签。
  3. 层次分类法(下面介绍这个方法,可以跳过,虽然很有意思)
    对ImageNet的标签进行了层次划分。
    如果我们想要计算特定节点的绝对概率,我们只需沿着路径穿过树到根节点,然后乘以每个结点的条件概率。举个例子,如果我们想知道一张照片是否是诺福克猎犬,我们可以这样计算,我们假定Pr(physical object) = 1.
    对YOLO-v2的理解及阅读笔记_第10张图片
    为了验证这种方法,我们在使用1000类ImageNet构建的WordTree上训练了Darknet-19模型。为了构建WordTree1k,我们添加了所有中间节点,这些节点将标签空间从1000扩展到1369。在训练过程中,我们会在树上贴上GT标签,这样,如果一个图像被贴上“诺福克犬”的标签,它也会被贴上“狗”和“哺乳动物”的标签,等等。
    举个例子可能更清楚,以下图为例,
    对YOLO-v2的理解及阅读笔记_第11张图片
    通常的分类模型使用一个所有类别的大向量来进行softmax,而使用WordTree,我们执行多个Softmax操作,每个层级下取得一个softmax输出值。
    在应用检测数据时,由YOLOv2给出是否含有目标的概率,即Pr(physical object)。检测器会得到一个Bbox和概率树,我们遍历树,(在某个层级)每次分裂时,取最高的置信度路径,直到达到某个阈值停止,我们就将此时的类别作为预测对象类。(这就是相当于从网络输出中的不同通道数中作softmax,不断细化子类别,直到达到某个阈值条件停止。)
  4. 我们可以使用WordTree以合理的方式将多个数据集组合在一起,只需将数据集中的类别映射到树中的不同层级。利用WordNet概念图,我们建立了视觉概念的层次树。如图6,然后,通过将DataSet中的类映射到树中的同步集,我们可以将数据集合并在一起。
  5. 具体的,我们希望训练出一个非常大规模的检测器,因此我们使用CoCO检测数据集和完整ImageNet发布版中的前9000类创建我们的组合数据集。利用这个数据集,我们训练了YOLO9000。我们使用基本的YOLOv 2体系结构,但是只有3个先验框而不是5个来限制输出大小。
  6. 当我们分析Yool9000在IMAGENET上的表现时,我们看到它学习了新的动物物种,但是在诸如服装和设备之类的类别上不是很好。YOLO9000是缩小检测和分类之间的数据集大小差距的有力步骤。

如有错误,欢迎指正。
下篇更新YOLOv3

参考文献

[1] https://blog.csdn.net/hysteric314/article/details/53909408
[2] https://blog.csdn.net/lwplwf/article/details/82895409
[3] https://blog.csdn.net/shanlepu6038/article/details/84778770
[4] https://blog.csdn.net/u010579901/article/details/79387098#%E7%BD%91%E7%BB%9C%E6%94%B9%E8%BF%9B-stronger

你可能感兴趣的:(目标检测,YOLO,YOLO2,目标检测,计算机视觉)