YOLO系列(2)—— YOLO v2

 

1.YOLO v2的改进 

1.1.Batch Normalization

    加入了Batch Normalization。 通过Batch Normalization可以将dropout从网络中移除了,也不怕会过拟合。
 

1.2.高分辨率分类器

    YOLO v1:首先在224*224分辨率上训练分类网络,再升到448*448用于检测。不太理解,是否是:先以224*224的分辨率将YOLO当成分类器训练,目标是使得卷积层学习到特征提取的能力。之后再将其全连接层换掉,换成另外的全连接层,然后把分辨率搞成448*448,再训练成检测器。如果不换掉全连接层的话,分辨率调大是会匹配不上的(参考为何要用RoIPool)。
    YOLO v2:首先在ImageNet数据集上,以448的分辨率训练10次,以此来微调分类网络。然后再将所得网络继续微调成为目标检测网络。也就是说于YOLO v1相比,YOLO v2的两次微调都直接是在448的分辨率上的,这就能够让网络有够多的时间调整自己的过滤器以适应高分辨率输入。
 

1.3.使用Anchor box

    YOLO v1直接预测边框的坐标,Faster R-CNN是先选用一些先验框,然后通过网络精修先验框,预测offset,最后预测出边框。这些先验框就是anchor box。因为在RPN中,输出仍是以矩阵(feature map)的形式,每个点都都有一个向量,包含了一些预测边框的信息。因为预测offset比直接预测坐标要更加容易被网络学习,所以YOLO v2就借助Faster R-CNN的RPN的思想,利用anchor box来进行预测边框:
    (1)首先将v1中最后面的两个全连接层去掉;
    (2)然后又移除后面一个池化层以保持较高的分辨率;然后将原来的输入从448*448换成412*412,这一步的目的是使得最后的feature map有一个中心点。经过前面网络下采样倍数是32,412/32=13,所以最终所得feature map大小是13*13,也就是说YOLO v2将原始输入图像分割成13*13的格子(v1是7*7)。因为是奇数,故feature map有中心点。但是,这个中心点有什么用?
    (3)最后估计就是调整一下最后一层的通道数,使得通道数正好与anchor box所需的信息数相等。假如一个格子预测5个anchor box,每个anchor box预测x、y、w、h、confidence的信息,此外还预测20个类别信息,一个格子需要5(5+20)=125个数,因此最后一层的通道数为125,故最终输出为13*13*125。
    因此,YOLO v2的网络结构就非常类似于RPN,它是没有全连接层的,最后一层输出的是以feature map形式的anchor box信息。也正因为v2没有全连接层,实际上v2的输入size可以是变化的,但要满足是32的倍数,因为网络的下采样倍数是32。
 

1.4. Dimension Clusters

    在RPN中,anchor box首先是人工设定它初试的长度和长宽比例,然后再经过网络进行精修的。但是,人工设定使用用它不合理的地方,因为不一定是最优的,不一定是最合适的,而且每个数据集,它的ground true box都有各自的特性,人为设定显然忽略了这些特性。既然如此,何不用算法去学习出最适合这个数据集的anchor box的形状和大小?YOLO v2通过k-means聚类,将groun true box聚成5个类,也就是得到5个最合适的anchor box,作为初始的先验框。
    k-means聚类算法的距离一般使用欧式距离来度量,但是欧式欧式距离在数值上偏向于size大的边框,为了平衡大边框和小边框对距离的贡献,这里的距离用交并比的补的表示,因为交并比并不因为边框size的变化而变化。(好像YOLO v1的损失函数那里也有考虑到大size和小size对数值的贡献不平衡问题,以后要注意以下这个问题)
 

1.5.边框 Direct location prediction

    一开始,YOLO v2是如RPN那样,预测box中心x、y的offset,如下公式。但这个公式的问题tx、ty的取值范围是没有限制的,使得box可以出现在图像的任何地方而不管初始位置在哪里,这也就违背了“目标边框中心点落在哪个box,哪个box就负责检测这个物体”的规则,也就是说:“某个各格子所拥有box,这些box的中心都必须在格子里面”。因为这个问题,就需要让模型自己去学习这个限制条件,容易使得模型不稳定。(注:xa、ya、wa、ha分别是anchor box的中心点和宽高)
    如果能把tx、ty的取值范围限制住了,那么模型就能变得稳定。YOLO v2放弃了像RPN那样预测anchor box的offset,而是像YOLO v1那样,直接预测anchor box相对于所属格子(左上角)的位置。也就是说预测的是一个相对值,在这里,以格子为一个长度单位(而上述方式好像是以原始图像的一个像素为一个长度单位)。因为anchor box的中心必须落在所属格子里面,所以它的x和y的相对值的取值范围为[0,1],而sigmiod函数的取值范围也为[0,1],所以很自然能够想到用sigmoid函数来限制住x、y的相对值,而不是让模型自己去学习。
    如下列公式,Cx、Cy就是所属格子的坐标,sigmod(tx)、sigmoid(ty)就是anchor box相对于所属格子的位置,取值被限定在[0,1]。这里不懂的就是为什么宽和高要用e的幂函数来求,可能好收敛一点吧?待解决?
    注意:bx、by、bw、bh是边框的中心坐标、宽高,是实际的,但模型预测的是tx、ty、tw、th,计算损失函数时,也是用t*而非b*。因为模型直接输出t*,所以预测的t*直接就有了,那真实的t*怎么得到呢?很简单,对上面公式进行变换,将t*移到等式的左边,求出t*的表达式即可。
 

1.6. Direct location prediction细粒度特征

    这个看不懂
 

1.7.多尺度训练

    因为YOLO v2没有全连接层,所以输入就可以随心一点了,不需要固定。但因为经过网络之后下采样了1/32,故size最好是32的倍数。为了增强鲁棒性,使模型适应各种size的输入,训练时,每10个batch就随机选一个新的size,这些size都是32的整数倍,比如320、352……608等等。
 
 

2.新的训练方法WordTree

2.1.为什么要用WordTree?

    用于目标检测的数据集(如COCO)与用于图像分类的数据集(如ImageNet)相比,实在太小了,而且打标签的花费也高,因为目标检测数据集的规模基本上都小于分类数据集的规模。能否将图像分类的数据集拓展到目标检测任务上呢?本文提出一种方法,可以让目标检测器在分类数据集和检测数据集下训练,其中,目标检测图像用来学习目标精确定位,分类图像用来增强词汇量、鲁棒性。这种方法的基本思想就是:当网络遇到是检测类图像时,他就反向传播整个YOLO v2损失;当网络遇到分类图像时,它就只传播分类的损失(这听起来有点天马行空,有点不能理解)。
    那么,首先需要做的就是将分类数据集和检测数据集合并或者说集成在一起,但这里有个问题,多分类一般用softmax,但使用softmax就意味着不同类之间是相斥的,但问题是如果要合并不同的数据集,有些标签不一定是相斥的,如果一个数据集里面有标签“狗”,另一个数据集有标签“哈士奇”,这两个标签并非相斥的。如何解决这个问题?这就需要用到WordTree。
 

2.2.如何生成WordTree?

    ImageNet、COCO的标签都来自于一个叫WordNet的单词网络,它是一个网状结构,准确地说是一个有向图,类似于面向对象中的多继承(因为是多继承,所以不是树形结构)。有此前提下,可通过如下步骤,将两种数据集集成在一起,成为一个WordTree。
    (1)首先,将ImageNet的标签全部取出来,去WordNet中找到对应的位置,如果当前节点到根节点只有一条路径,那么就点亮这条路径上的所有节点(被点亮的节点及路径就作为WordTree的组成部分)。
    (2)然后,将ImageNet剩下的标签(从本身节点到根节点有多条路径),选择路径最短的进行点亮。
    (3)对于COCO的标签,也如(1)(2)步骤。(注意:是先放检测数据集,再放分类数据集,因为两者中有些标签可能是重复的,如COCO可能有“dog”,ImageNet也可能有“dog”,优先考虑检测数据集的。)
 

2.3.如何用WordTree训练?

    当网络看到是检测类图像时,他就反向传播整个YOLO2损失,当网络遇到分类图像时,它就只传播分类的损失。
  因为一个目标很有可能属于多个种类了,比如“哈士奇”也属于“狗”,那么当遇到“哈士奇”这个标签时,两个标签都应该是True,也就是说从所属的节点一直往上到根节点的标签都是True。因此可以发现,WordTree上,除了根节点,每个节点都对应一个条件概率。
 
 

posted on 2020-07-11 15:25  ZhicongHou  阅读(273)  评论(0编辑  收藏  举报

导航