YOLO系列(1)—— YOLO v1

 

1.YOLO简介

1.1.R-CNN系列与YOLO

    R-CNN系列的目标检测模型,其步骤可分为两步:第一步是生成许多个region proposal,第二步是对region proposal进行分类和边框回归。也就是说R-CNN系列不仅网络结构复杂,而且把目标检测任务由分类和回归共同完成。R-CNN系列检测的精确度是非常好的,但因为模型复杂,步骤繁杂,因此速度也慢。
    YOLO的出现就是为了追求目标检测的速度,它的模型十分简单,只需要一个单一的卷积神经网络既可以完成任务,也就是说能够实现端到端的目标检测。YOLO把目标检测任务完全看成是回归问题。因为YOLO的结构简单,速度上是非常快的,但精度上却是比不上R-CNN系列。这也是速度与精度不可调和的矛盾。
 

1.2.YOLO基本思想

    YOLO的基本思想就是将图像分割成S*S个格子,每个格子都负责检测一个物体(如果有的话),所以最多可检测S*S个物体。如何检测?
    (1)每个格子分配B个box,这B个box的中心都是这个格子,用这B个box去检测物体。
    (2)每个box都要预测5个值,分别是x、y、w、h、confidence。(x,y)表示box的中心坐标,w、h分别是box的宽和高,confidence是这个box含有物体的置信度,它被定义为:confidence=Pro(Object)*IoU,也就是该box含有物体的概率乘上该box与ground true box的IoU。(注意:这里的置信度与概率是不同的,置信度<=概率)(注意:Pro(Object)是“是否含有物体”,而非“含有什么物体”)。
    (3)每个格子再预测C个条件概率Pro(Classi|Object),C就是目标种类数,这C个条件概率的意思是:在含有物体的条件下,该物体属于种类i的概率。注意:这C个条件概率只为每个格子设置一套,也就是说同一个格子下的B个box是共用这套条件概率的。如此一来,在训练时,将置信度和条件概率相乘:Pro(Classi|Object)*Pro(Object)*IoU = Pro(Classi)*IoU,就是这个box属于某个种类的置信度了。
    (4)最后,对于每个格子,取其中属于某个种类置信度最高的那个box,作为该格子检测到的物体,如果所有box的置信度都低于某个阈值,那么就表示该格子没有检测到物体。
   

1.3.网络结构

    YOLO的网络结构是一个单一的卷积神经网络,它有24个卷积层,紧随其后的是2个全连接层。最终的输出是长度为S*S*(B*5+C)的向量。其中S*S就是格子的个数,B就是一个格子所含的box数,因每个box要预测5个数,所以是B*5。此外,每个格子还需要预测C个条件概率。综上,向量的长度为S*S*(B*5+C)。
    注意:下图中最后面那个是全连接层吗?怎么看都是卷积层?个人理解:这个图有点误导,最终的输出是S*S*(B*5+C)的向量,但作者可能为了更直观理解(对应S*S个格子),这里的输出画成了这样。
 
 

2.训练

2.1.训练集的设置

    发现目标检测系列的算法,都需要对原始数据进行比较复杂的操作才能对应模型的输入和输出(X和Y)。因为是有监督学习,所以在训练集中,每张图像中的所有目标物体已经给出了box,这个就是ground true box。对于每个 ground true box,计算出它的中心坐标,然后将中心坐标所在的那个格子(就是原始图像被分成S*S个的那些格子)用于检测该物体,因此这个格子的其中一个box,它的目标输出就是ground true box的x、y、w、h,其中Pro(Object)为1,因为这个格子实实在在地含有物体。对于每个格子是C个条件概率,就将格子要检测的物体类型设置为1,其他的设置为0。
    疑问1:如果有2个物体的中心都落在同一个格子,那么设置训练数据时,该将那个设为ground true box?
    疑问2:一个格子最多只有一个ground true box,但一个格子又设置了B个检测box,那这B个检测box该怎么设置他们的ground true box?都一样吗?都一样的话,那么这B个检测box不就是完全一样了吗?
 

2.2.损失函数

    回归问题一般就采用mean-squared error,但这里采用sum-squared error,可能是因为个数不太好计算吧?
    问题1:因为大多数格子都是没有物体的,而没有物体的格子的confidence为0,这样就很容易将损失函数推向0,导致模型不稳定。因此,需要降低不含物体格子confidence的损失值在损失函数中所占的权重,此外,还提x、y、w、h四个值的损失值在损失函数中的权重。
    问题2:此外,小box的偏差比大box的偏差更应引起重视(这是从比例来考量的,比如500-1=499,499/500约等于1,所以这1的偏差不会引起什么问题。但如果是2-1=1,1/2=0.5,少了一半,所以这个1的偏差会引起大问题)。解决方法是,先对w和h开根,再求。为何是开根?因为根据:y=根号(x)这个函数的图像,在x越大的时候,y增加得越小,因此受重视的程度也不会太高。
    总得来讲,YOLO的损失函数包含三个部分:第一部分是box的位置x、y、w、h,第二部分是每个检测box的confidence置信度,第三部分是每个格子的条件概率。
 
 

3.优缺点

3.1.优点

    (1)YOLO速度快,因为它的结构简单,是一个单一结构的卷积神经网络,而且把目标检测问题当作回归问题,不像R-CNN系列那样拥有复杂的模型结构,而且把任务分成多个部分,利用分类和回归去实现。
    (2)YOLO能够实现端到端的目标检测。
    (3)YOLO还可以考量图像的全局信息来进行分割?sliding window只局限于window之内的信息,RCNN系列也只能局限于区域提议之内,因此不能看到更大的内容以及上下文。
 

3.2.缺点

    (1)因为YOLO把检测box限制得比较死,最多只有S*S个box能检测物体,而且目标也不能挨得太近,或者物体不能太小。因此YOLO比较难检测一些成群出现的小物体,比如一群鸟。
    (2)比较难泛化到新的或者未出现过的长宽比例的物体。
    (3)损失函数同等对待大box和小box的损失值,但小box上的小错误更加重要,因为它对IoU有更大的影响。本网络主要的误差来源是错误定位。
 
 

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

导航