机器学习33:YoloV1/V2/V3学习笔记

机器学习33:YoloV1/V2/V3学习笔记

1.YoloV1简介:

           1.1 YOLO的特点:

                速度快,可达到实时检测的要求;

                使用全图作为背景信息,背景错认为物体的情况较少;

                泛化能力强。

           1.2 YOLO V1的实现方法:

                 1.2.1 YOLO V1的输出信息:

                        将图像划分为S*S个网格,如果某个物体目标的中心落在这个网格中,则这个网格负责这个物体目标。每个网格预测B个边界框,每个边界框包含的信息有:

                                 1)位置信息(x,y,w,h);

                                 2)置信度值:

                                       a.含有目标的置信度;

                                       b.预测的边界框和实际groundtruth之间的IOU;

                        每个网格还需预测一个类别信息,记为C类;因此输出tensor的尺寸为S*S*(5*B+C)。

                 1.2.2 YOLO V1的网络结构:

                        YOLO V1的网络结构借鉴了 GoogLeNet ,包括24个卷积层和2个全连接层,用1×1 reduction layers 紧跟 3×3卷积层取代Googlenet的inception模块。

                        去掉候选区这个步骤以后,YOLO V1的结构非常简单,单看网络结构和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测边界框的位置(数值型),而不仅仅是对象的概率。

                 1.2.3 YOLO V1的网络训练:

                         (1)网络训练过程:

                                   YOLO V1的预训练在ImageNet上,分类模型采用前20个卷积层加一个平均池化层和全连接层,输入尺寸为224*224。

                                   训练时在预训练的20层卷积层上随机初始化4个卷积层和2个全连接层,输入尺寸改为448*448。

                         (2)训练损失函数: 

                                   1)损失函数的构成:

                                           1. 坐标预测损失(coordinate loss)

                                                损失函数的第一部分是对预测bbox的坐标损失,有两个注意点:一是对宽高取平方根,抑制大物体的loss值,平衡小物体和大物体预测的loss差异;二是采用了权重系数5,因为参与计算正样本太少(如上面7*7掩膜中只有三个单元的坐标参与计算),因此应该增加权重。

                                           2.置信度损失(Confidence loss)

                                                 损失函数的第二部分是正负样本bbox的置信度损失,注意下ground truth的置信度: 对于正样本其置信度为预测框和ground truth之间的IOU*1, 对于负样本,置信度为IOU*0;另外由于负样本多余正样本,取负样本的权重系数为0.5。

                                           3.分类损失(Classification Loss)

                                                损失函数的第三部分是预测所属分类的损失,预测值为网络中softmax计算出,真实值为标注类别的one-hot编码(可以理解为20分类任务,举例若为第五类则编码为00001000000000000000)。

                                   2)损失函数的平衡:

                                           损失函数的设计目标就是让位置信息(x,y,w,h)/置信度/分类这个三个方面达到很好的平衡,简单的全部采用sum-squared error loss来做这件事会有以下不足:

                                           a) 8维的定位误差和20维的分类误差同等重要显然是不合理的;

                                           b) 如果一个网格中不包含目标(图像中这种网格很多),那么就会将这些网格中边界框的置信度 push到0,相比于较少的有目标的网格,这种做法是不合理的,这会导致网络不稳定甚至发散。

                                           这个问题的解决方案为:

                                           a)更重视8维的坐标预测,给这些损失前面赋予更大的损失权重(上图蓝色框);对不包含目标的边界框的置信度损失,赋予小的损失权重(上图橙色框);包含目标的边界框的置信度损失(上图红色框) 和分类损失 (上图紫色框)的损失权重正常取1。

                                           b)对不同大小的边界框预测中,相比于大边界框预测的偏移,小边界框预测同样的偏移对于预测结果的影响更大,而sum-square error loss中对同样的偏移损失是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将边界框的width和height取平方根代替原本的width和height。

                 1.2.4 YOLO V1的网络预测:

                         (1)其他目标检测算法的预测过程:

                                   a.从检测框中找出置信度最大的框;

                                   b.挨个计算其与剩下的框的IOU;

                                   c.如果其值大于设定的阈值,即重合过高,则剔除该框;

                                   d.重复上述过程,直至处理完所有的检测框。

                         (2)YOLO V1的预测过程:

                                   a.设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0);
                                   b.遍历每一个对象类别:
                                     1)遍历该对象的所有得分;
                                  2)找到得分最大的对象及其边界框,添加到输出列表;
                                  3)对每个得分不为0的候选对象,计算其与上面列表中输出对象的边界框的IOU;
                                  4)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0);
                                  5)如果所有边界框都在输出列表中或Score=0,则该对象类别的非极大值抑制处理完成,继续遍历下一种对象。
                                   c.此时的输出列表即为预测的对象。


           1.3 YOLO V1的不足之处:

                 (1)由于输出层为全连接层,因此YOLO V1的输入尺寸固定;

                 (2)对于占比较小或相距很近的目标检测效果不好,因为每个网格只预测两个框并且属于同一个目标物体,当每个网格包含多个目标物体时只能检测其中之一;

                 (3)测试图像过程中,当同一类物体出现新的不常见的长宽比或其他情况时,泛化能力较差;

                 (4)由于损失函数的问题,定位误差是影响检测效果的主要原因,因此在大小目标物体的处理上有待加强。

2.YOLO V2简介:

           2.1 YOLO V2网络结构:

                           

           2.2 YOLO V2对YOLO V1进行的改进:

      (1) 加入BN批量标准化层, 去掉dropout:

                             神经网络在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过标准化每层的输入解决这个问题,YOLO V2网络在每一个卷积层后添加批量标准化并处理通过这一方法获得了2%的提升。

                             BN层也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

      (2) 高分辨率图片分类器(High resolution classifier ):

                                YOLO V1中分类器在ImageNet数据集(224*224)上预训练,而检测时图片的大小为448*448,网络需要适应新的尺寸,因此yolo V2中又加入了一步finetune,步骤如下:

                   a.在ImageNet上预训练分类器(224*224),大概160个epoch;

                   b.将ImageNet的图片resize到448*448,再finetune 10个epoch, 让模型适应大图片;

                   c.采用上述预训练的权重,在实际数据集上finetune(416*416),最终输出为13*13.

      (3) 引入 Anchors:

                               借鉴Faster RCNN中Anchors的思想,通过kmeans方法在VOC数据集(COCO数据集)上对检测物体的宽高进行了聚类分析,得出了5个聚类中心,因此选取5个anchor的宽高: (聚类时衡量指标distance = 1-IOU(bbox, cluster))

                                COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
                                VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

                         这样每个网格单元将对应5个不同宽高的anchor, 上面给出的宽高是相对于网格单元,对应的实际宽高还需要乘以32,如下图所示:

                         关于预测的边界框的计算:(416*416-------13*13 为例)

                   1) 输入图片尺寸为416*416, 最后输出结果为13*13*125,这里的125指5*(5 + 20),5表示5个anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一个anchor预测一组值;

                   2) 对于每一anchor预测的25个值, x, y是相对于该grid cell左上角的偏移值,需要通过sigmoid函数将其处理到0-1之间。如13*13大小的grid,对于index为(6, 6)的cell,预测的x, y通过sigmoid计算为xoffset, yoffset,   则对应的实际x = 6 + xoffset,   y = 6+yoffset, 由于0<xoffset<1, 0<yoffset<1, 预测的实际x, y总是在(6,6)的cell内。对于预测的w, h是相对于anchor的宽高,还需乘以anchor的(w, h), 就得到相应的宽高;

                   3) 由于上述尺度是在13*13下的,需要还原为实际的图片对应大小,还需乘以缩放倍数32。

     (4) 低层和高层特征融合(Fine-grained Features ):

                               由上面网络架构中可以看到一条短路连接,将低层的特征图(26*26*512)和最后输出的特征图(13*13*1024)进行concat,从而将低层的位置信息特征和高层的语义特征进行融合。另外由于26*26尺度较大,网络采用Reorg层对其进行了尺寸转换,使其转变为13*13,如下图所示:

     (5)不同尺度图片的训练 (Multi-scale Training ):

                 上述网络架构中,最后一层的(Conv22)为1*1*125的卷积层代替全连接函数,可以处理任何大小的图片输入,因此在训练时,每10个epoch,作者从[320×320, 352×352, … 608×608](都是32的倍数,最后输出都降采样32倍)选一个尺度作为输入图片的尺寸进行训练,增加模型的鲁棒性,当尺度为416*416时,输出为13*13*125;输入为320*320,则输出为10*10*125。

           2.3 YOLO V2的特点:

    (1)采用Darknet19网络结构,层数比Yolo V1更少,且没有全连接层,计算量更少,模型运行更快;

       (2)使用卷积代替全连接,解除了输入尺寸的限制,多尺度的训练使得模型对不同尺度的图片的检测更加具有鲁棒性;

    (3) 每个单元采用5个anchor box进行预测,对拥挤和小物体检测更有效。

3.YOLO V3简介:

          3.1 YOLO V3的架构概览:


              上面的结构图中,有三个基本的组件:
              (1)Darknetconv2D_BN_Leaky:

                      如图左下角所示,Darknetconv2d_BN_Leaky是YOLO v3的基本组件,也就是卷积+BN+Leaky relu,对于YOLO V3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外)。

              (2)Res_n:

                        n代表数字,表示这个Res_block里含有多少个Res_unit,有Res1,Res2, … ,Res8等等。Res_block是YOLO V3的重要组件,YOLO V3借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从YOLO V2的darknet-19上升到YOLO V3的darknet-53,前者没有残差结构)。对于Res_block的解释,其基本组件也是Darknetconv2D_BN_Leaky。
              (3)concat:

                        张量拼接即为将darknet中间层和后面的某一层经过上采样之后进行拼接,拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

                        拼接是为了对不同尺寸的目标进行特征提取,从而增大对小目标的识别能力,这也是YOLO V3相较于YOLO V2版本的一大改进。

          3.2 YOLO V3对YOLO V2的改进:

                3.2.1 类别预测方面主要是将原来的单标签分类改进为多标签分类(softmax->logistic):

                         网络结构上将原来用于单标签多分类的Softmax层换成用于多标签多分类的逻辑回归层。

                         做这样的修改的原因是网络中的Softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类,需要用逻辑回归层来对每个类别做二分类。

                         逻辑回归层主要用到的是sigmoid函数,sigmoid函数可以将输入约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示属于该类。

                         YOLO V3不使用Softmax对每个框进行分类,主要考虑因素有两个:

                         1)Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类;
                         2)Softmax可被独立的多个逻辑分类器替代,且准确率不会下降。
                         分类损失采用二元交叉熵损失(binary cross-entropy loss)。
                3.2.2 YOLO V3采用多个scale融合的方式做预测(predictions across scales):

                         YOLO V2有一个层叫:passthrough layer,假设最后提取的特征图的尺寸是13*13,那么这个层的作用就是将前面一层的26*26的特征图和本层的13*13的特征图进行连接,有点像ResNet。当时这么操作也是为了加强YOLO算法对小目标检测的精确度。

                         有一个概念叫做:bounding box prior,其实就是实现聚类得到的几个检测边框,YOLO V2和YOLO V3均采用了这种方式,但是又有所不同。

                         关于边界框的初始尺寸还是采用YOLO V2中的k-means聚类的方式来做,这种先验知识对于边界框的初始化帮助还是很大的,毕竟过多的bounding box虽然对于效果来说有保障,但是对于算法速度影响还是比较大的。作者在COCO数据集上得到的9种聚类结果:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116*90); (156*198); (373*326),这应该是按照输入图像的尺寸是416*416计算得到的。

                         YOLO V2一共有13*13个单元,每一个单元预测5个候选框,故而总的候选框数目为:13*13*5,但是由于YOLO V3采用了多个不同的尺度的特征图,每一张特征图上均采用3个候选框:

                          1)对于13*13的特征图,有13*13*3;

                          2)对于26*26的特征图,有26*26*3;

                          3)对于52*52的特征图,有52*52*3;

                         YOLO V3的候选框单从数量上来说就已经比YOLO V2版本多了很多,不仅如此,由于V3版本特征图的尺度是不一样的,而且应用在每一个特征图上的候选框的大小也是不一样的,这样对于不同尺寸的目标的适应能力自然更强了。

                3.2.3 基本特征提取器网络架构完全不一样(darknet-19->darknet-53):

                        YOLO V2采用的是darknet-19,而YOLO V3采用的是darknet-53,二者的设计也有很多不一样的点,主要特现在以下几个方面:

                        (1)darknet-53中无池化层,全连接层/特征图的缩小是通过增加卷积核的步长实现的(YOLO V2中采用池化层做特征图的采样,这里换成卷积层来做);

                        (2)darknet-53中卷积层+BN层+LeakyRelu激活函数成为了标准组件;

                        (3)darknet-53采用了残差的设计思想。
          3.3 YOLO V3和YOLO V2的基本特征提取器:
                整个YOLO V3结构里面是没有池化层和全连接层的,前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2)就相当于将图像边长缩小了一半(即面积缩小到原来的1/4)。

                在YOLO V2中,要经历5次缩小,会将特征图缩小到原输入尺寸的2的5次方分之一,即1/32,若输入为416x416,则输出为13x13(416/32=13)。YOLO V3也和YOLO V2一样,基本特征提取器都会将输出特征图缩小到输入的1/32,所以,通常都要求输入图片是32的倍数,可以对比YOLO V2和YOLO V3的基本特征提取器DarkNet-19 与 DarkNet-53:


                从上图发现,YOLO V2中对于前向过程中张量尺寸变换,都是通过最大池化来进行,一共有5次,而YOLO V3是通过卷积核增大步长来进行,也是5次。(darknet-53最后面有一个全局平均池化,在yolo-v3里面没有这一层,所以张量维度变化只考虑前面那5次),这也是416x416输入得到13x13输出的原因。

               从上图可以看出,darknet-19是不存在残差结构的,和VGG是同类型的基本特征提取器(属于上一代CNN结构),而darknet-53是借鉴了resnet-152的基本特征提取器。

                补充:YOLO V3的结构稍微显得复杂,除此之外还有一个更加轻量化的版本tiny-darknet作为基本特征提取器可以替代darknet-53,在官方代码里用一行代码就可以实现切换backbone。搭用tiny-darknet的YOLO,也就是tiny-YOLO在轻量和高速两个特点上,tiny-YOLO模型非常小,大约只有4M左右,基本上和SqueezeNet不分上下。

          3.4  YOLO V3的输出——predictions across scales(即多尺度预测):
                上面的结构图中所显示出来的YOLO V3的输出为:

                从上面YOLO V3输出了3个不同尺度的特征图,如上图所示的y1, y2, y3。这也是YOLO V3版本中相较于YOLO V2版本最大的一个改进点之一,也正是这个改进点,使得YOLO V3在小目标的检测中有了更好的进展。

                什么是predictions across scales(多尺度预测)?多尺度预测借鉴了FPN(feature pyramid networks),采用多尺度来对不同尺寸的目标进行检测,越精细的网格单元就可以检测出越精细的物体。
                y1,y2和y3的深度都是255,边长的规律是13:26:52。对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率;YOLO V3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。这个255就是这么来的。(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box)
                 YOLO V3用上采样的方法来实现这种多尺度的特征图,可以结合上面的结构图来看,图中concat连接的两个张量是具有一样尺度的(两处拼接分别是26x26尺度拼接和52x52尺度拼接,通过(2, 2)上采样来保证concat拼接的张量尺度相同)。作者并没有像SSD那样直接采用基本特征提取器中间层的处理结果作为特征图的输出,而是和后面网络层的上采样结果进行一个拼接之后的处理结果作为特征图,这样做检测效果有所提高。

          3.5 为什么要用逻辑回归——为了找寻目标得分最大的Box:

                 每个anchor prior(名字叫anchor prior,但并不是用anchor机制)就是两个数字组成的,一个代表高度另一个代表宽度。YOLO V3对边界框进行预测的时候,采用了逻辑回归,YOLO V3每次对边界框进行预测时,输出和YOLO V2一样都是(tx,ty,tw,th,to ),然后通过公式1计算出绝对的(x, y, w, h, c)。
                逻辑回归用于对anchor包围的部分进行一个目标评分,即这块位置是目标的可能性有多大,这一步是在预测之前进行的,可以去掉不必要anchor从而减少计算量。

                如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行预测。不同于faster R-CNN的是,YOLO V3只会对1个prior进行操作,也就是那个最佳prior。而逻辑回归就是用来从9个anchor priors中找到目标得分最高的那一个。逻辑回归就是用曲线对prior相对于目标得分映射关系的线性建模。

4.YOLO系列和RCNN系列的简单对比:

          (1)统一网络:
                    YOLO没有显式求取候选区域的过程;Faster R-CNN中尽管RPN与Fast RCNN共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和Fast RCNN网络,相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要Look Once。

          (2)YOLO统一为一个回归问题:
                    R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。

5.参考资料:

          (1)【深度学习YOLO V1】深刻解读YOLO V1

          (2)yolov1, yolo v2 和yolo v3系列

          (3)https://blog.csdn.net/qq_27825451/article/details/88971395

          (4)https://blog.csdn.net/leviopku/article/details/82660381

发布了92 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39504171/article/details/105047821