YOLO V1学习笔记

YOLO V1学习笔记

1.YOLOV1的思路:

         YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别,把目标检测的问题转化成一个回归问题。

 

2.YOLO系列的特点:

    (1)速度快,能够达到实时的要求,在Titan X的GPU上 能够达到 45 帧每秒;

    (2)使用全图作为环境信息,背景错误(把背景错认为物体)比较少;

    (3)泛化能力强。

 

 

3.YOLOV1处理流程:

    (1)基本操作:

                1)YOLO将图片分成7*7的单元网格,每个单元网格对应2个bounding box,故共有98个bounding box;

                2)YOLO中每一个目标只对应一个中心点,该中心点只唯一出现在一个单元网格中,目标中心点落在的单元网格负责回归该目标;

    (2)训练过程:

                1)输入图像为448*448*3,经过类似GoogLenet(不相同)的网络卷积后,得到7*7*30的特征图,7*7对应每一个单元网格,30个维度对应2个bbox的5个位置信息和置信度,以及20个类别信息;

                2)损失函数分为三部分:座标偏移/置信度损失/分类损失。

    (3)测试过程:

                1)网络训练好后,输入一张图片,得到98个bbox的预测结果,其中包括置信度/分类和位置信息。

                2)分类概率显然是一个条件概率,与前面的置信度相乘,得到真正Pr(Classi)*IoU,对所有98个bbox都进行这些操作,得到98个20*1的分类得分;

                3)再针对某一个目标的得分进行降序排列,将小于某个阈值的得分清零,再进行NMS操作得到对应的98个20*1的分类得分;

                4)对其中一个bbox的分类得分查找其最大的score,如果大于0标记bbox为结果并输出;没有则放弃该bbox。由于置信度的存在,使得大部分的得分都是0,如果最大为0,说明该bbox对应的单元网格不是任何目标的中心点。

 

4.网络结构:

          YOLOV1的网络结构借鉴了GoogLeNet(用1×1卷积层紧跟 3×3卷积层取代Goolenet的inception模块),包括24个卷积层,2个全连接层;在该结构中输入图像的尺寸固定为448*448,最终输出的特征图大小为7*7*30。

 

5.实现细节:

    (1)模型用ImageNet预训练;

    (2)训练中使用Dropout和数据增强防止过拟合;

    (3)激活函数除最后一层使用线性激活函数外,其他层使用leak RELU;

    (4)最终的预测特征由类别概率/边框的置信度和边框的位置组合构成。其中类别概率共20个类别,置信度表示区域内包含物体的概率,由于有两个边框因此存在两个置信度,边框位置为4*2共8个预测值,因此一共有30个预测值;

    (5)预测值座标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。

    (6)一个区域内两个框共用一个类别预测,在训练时选取与物体IOU更大的框,在测试时选取置信度更高的框,另一个舍弃;因此整张图最多检测出49个目标;

    (7)FasterRCNN将背景作为一个类别共21个类别,而YOLO将置信度和类别分开。

 

6.损失函数:

    (1)正负样本区分原则:

              1)当一个真实物体的中心点落在了某个区域内,该区域负责检测这个物体,具体做法是将与该真实物体有最大IOU的边框设为正样本,这个区域的类别真值为该真实物体的类别,该边框的置信度真值为1;

              2)除了上述被赋予正样本的边框,其余边框全部赋予负样本,负样本没有类别损失和位置损失,只有置信度损失,其真值为0。

    (2)损失函数构成:

              损失函数中包括五个部分:

                1)正样本中心点座标的损失;

                2)正样本宽高的损失;

                3)正样本的置信度损失;

                4)负样本的置信度损失;

                5)正样本的类别损失。

              损失函数的设计目标就是让座标损失/置信度损失/分类损失这三个方面达到很好的平衡,解决办法是:

                1)更重视8维的座标预测,给这些损失前面赋予更大的损失权重, 在pascal VOC训练中取5;

                2)对没有目标的bbox的置信度损失,赋予小的损失权重,在pascal VOC训练中取0.5;

                3)有目标的bbox的置信度损失和类别损失的损失权重正常取1。

                4)对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更敏感。作者将box的width和height取平方根代替原本的height和width。small bbox的横轴值较小,发生偏移时,反应到y轴上的损失比big box要大。

              在这个损失函数中:

              只有当某个网格中有目标的时候才对分类误差进行惩罚。

              只有当某个预测框对某个ground truth box负责的时候,才会对box的座标误差进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IOU是不是在那个单元格的所有box中最大。

              一个网格预测多个bounding box,在训练时希望每个真实目标只有一个bounding box专门负责,具体做法是与gtbox(目标)的IOU最大的bounding box 负责该ground true box(目标)的预测,每个预测器会对特定大小/纵横比/分类的gt box预测的越来越好;IOU最大者偏移会更少一些,可以更快速的学习到正确位置。

 

7.YOLOV1缺点:

    (1)小物体/靠的近的物体检测效果不好;

    (2)新的/不常见的长宽比检测效果不好;

    (3)边框检测精度不高;

    (4)大物体/小物体的位置损失权重相同,导致同等比例的定位误差,会使小物体定位不准确;

 

8..参考资料:

    (1)YOLO V1的过程解读

    (2)深刻解读YOLO V1

    (3)《深度学习之pytorch物体检测实战》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章