论文阅读 || 目标检测系列——yolov1详解

yolo的实现方案:

1.网络结构

去掉label相关的内容,YOLO的结构很简单,卷积+池化+全连接层。
网络结构借鉴了GoogLeNet。24个卷积层,2个全连接层。(用 1x1 reduction layers + 3x3 convolutional layers 取代了GoogLeNet的inception modules,交替使用的1x1卷积层会降低前一层的特征空间)
在这里插入图片描述
为了加快检测速度,作者还训练了一个快速的YOLO版本–Fast YOLO。9层卷积替代了24层,使用更小的卷积核。除此之外,Fast YOLO和YOLO的训练和测试参数都是一样的。

2.输入和输出的映射关系

将图像分成SxS个网格(grid cell),如果某个object的中心落在这个网络中,则这个网格就负责预测这个object。

  1. 输入:原始图像缩放到 448 ∗ 448 448*448 448448。原因yolov1的卷积后接了两个全连接层,要求固定的输入维度。
  2. 输出: 7 ∗ 7 ∗ 30 7*7*30 7730的tensor。
    在这里插入图片描述

2.1 7*7的网格

根据yolo的设计,输出的tensor为 7 ∗ 7 ∗ 30 7*7*30 7730的张量,输入图像被划分为 7 ∗ 7 7*7 77的网格。刚好每个网格对应一个 1 ∗ 1 ∗ 30 1*1*30 1130的向量。
当然,并不是说仅仅网格内的信息被映射到一个30维的向量。经过神经网络对输入图像信息的提取和变换,图像的全局信息也会被整理,尤其是网格周边的信息,编码到对应的30为向量中。

2.2 30维向量

在这里插入图片描述
30维的信息,包括了object的分类和定位

(1) 20个对象分类的概率

yolo的标签共分为20类,故20个值表示该网格内存在任一种对象中心的概率。记为 P r ( C l a s s i ∣ O b j e c t ) Pr(Classi|Object) Pr(ClassiObject),如: P r ( C l a s s 1 ∣ O b j e c t ) Pr(Class1|Object) Pr(Class1Object) P r ( C l a s s 2 ∣ O b j e c t ) Pr(Class2|Object) Pr(Class2Object) P r ( C l a s s 20 ∣ O b j e c t ) Pr(Class20|Object) Pr(Class20Object)

(2) 2个bounding box的位置

每个bounding box需要4个数值来表示其位置, ( c e n t e r x , c e n t e r y , w i d t h , h e i g h t ) (center_x, center_y, width, height) (centerx,centery,width,height),即(bounding box 的中心点的x坐标、y坐标、bounding box的宽度、高度),2个bounding box共需要8个数值来表示位置。

(3)2个bounding box的置信度

bounding box的置信度 = 该boundingbox内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU。用公式来表示就是 c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence = Pr(Object)*IOU_{pred}^{truth} confidence=Pr(Object)IOUpredtruth

  1. 这里的 P r ( O b j e c t ) Pr(Object) Pr(Object)是bounding box内存是否存在对象,取值0 or 1。区别与上面第(1)点的 P ( C i ∣ O b j e c t ) P(Ci|Object) P(CiObject)
  2. I O U IOU IOU是预测的bbox和对象真实的bbox的IOU(Intersection over Union,交并比)。体现的是两者的接近程度。
    另外,这个IOU是在训练阶段计算的。也就是说,训练的时候,有对象的框的置信度为预测和真实框的IOU;预测时,置信度仅作为判断框内是否有对象的标准(不知道真实对象在哪里,是完全依赖于网络的输出,此时已经不需要也无法计算IOU了)

.
粗暴的理解就是:当box负责预测对象时,置信度就是IOU
所以,先看bbox的2个置信度,确定是否有被检测物;再看对应的bbox的位置,确定被检测物的位置;再看分类的概率,确定这检测者的类别。

2.3 yolov1的标签

  1. 一张图片最多可以检测出49个对象
    每个30维向量中只有一组(20个)对象分类的概率,也就是只能检测出一个对象。所以输出的7*7=49个 30维的向量,最多表示出49 个对象
  2. 总共 98=49*2个候选区
    每个30维向量中有2组bbox,故共98个候选区
  3. yolo中的bbox 和Fast RCNN的anchor 并不相同
    FastRCNN等系列是对每个grid手动设置n个固定的Anchor,每个anchor有不同的大小和宽高比。
    yolo的bbox并不是预先设置好的大小和形状,训练时也没有让2个同时预测bbox。

.
这里采用2个bbox,跟以往的监督算法有所不同,更像进化算法。监督算法:需要事先根据样本就能给出一个正确的bbox作为回归目标。 但训练时,yolo的2个bbox事先并不知道会在什么位置,只能经过前向计算,网络会输出2个bbox,这两个bbox与样本中对象实际的bbox计算IOU,IOU大的那个bbox,作为负责预测该对象的bbox。
训练开始阶段,网络预测的bbox是乱来的,但总是选择IOU相对较好的那一个。随着训练的进行,每个bbox会逐渐擅长对某种情况的预测(可能是对象的大小,宽高比,不同类型的对象等),这是有区别完全监督学习的思想。


  • 可以调整网络数量、bbox数量
    77网格,对于448448输入图像来说覆盖粒度有点粗。可以设置更多的网格和bbox。设网格数量为SS,每个网络产生B个边框,网络支持识别C个不同的对象。这是,输出的向量长度为: C + B ∗ ( 4 + 1 ) C+B*(4+1) C+B(4+1),输出的整个tensor就是 S ∗ S ∗ ( C + B ∗ ( 4 + 1 ) ) S*S*(C+B*(4+1)) SS(C+B(4+1))这里yolov1选择的参数是77网格,20种对象,因此输出向量长度为20+2*(4+1)=30。整个输出的tensor是7730
    因为网格和bbox设置的比较稀疏,所以这个版本的哟咯训练后预测的准确率和召回率都不是很理想,后续有v2、v3版本进行改进。但速度能够满足实时处理的要求,对工业界有一定吸引力。

4. 训练样本的构造

这里描述网络样本的构造,来梳理前面叙述的网络输出与输入的对应关系。
在这里插入图片描述
对于一张图片,其对应输出的7730张量,应该设置什么样的数据呢

(1) 20个对象分类的概率

对于图片中的每个对象,先找到其中心点。如图中的自行车,中心点在黄色原点的位置,中心点落在黄色网格中。所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0,其它的48个网格的30维向量中,该自行车的概率都是0。这就是所谓的“中心点所在的网格对这种行为(预测该对象)负责”。假设第5个位置代表自行车,则标签为:[0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,]

(2) 2个bounding box的位置

训练样本中bbox位置应该填写对象实际的bbox,但一个对象对应了2个bbox,填写到哪个bbox中,需要根据就网络输出的bbox与实际的bbox的IOU来选择,训练时选择IOU较大的bbox填写实际的bbox坐标。
( c e n t e r x , c e n t e r y , w i d t h , h e i g h t ) (center_x,center_y, width, height) (centerx,centery,width,height),具体填入的数值,是要经过归一化的。具体操作为:

  • ( c e n t e r x , c e n t e r y center_x,center_y centerx,centery):是相对于bbox所在的 grid cell 的左上角的偏移量,然后进行的归一化
  • ( w i d t h , h e i g h t width,height width,height):bbox的宽高与图片大小的比值
    在这里插入图片描述

(3)2个bounding box的置信度

置信度的公式 c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence = Pr(Object)*IOU_{pred}^{truth} confidence=Pr(Object)IOUpredtruth这样一个网格会计算出两个 I O U IOU IOU,然后进行数值比较。较大的IOU对应的Pr(Object)为1,对应的bbox填写实际的bbox,即负责对该对象的预测。另外一个bbox的Pr(Object)为0。
也就是,对象实际的bbox最接近的那个bbox,它的 c o n f i d e n c e = I O U p r e d t r u t h confidence=IOU_{pred}^{truth} confidence=IOUpredtruth,其它的网格的bbox的 c o n f i d e n c e = 0 confidence=0 confidence=0
举例:上面图片中的自行车的中心位于4行3列网格中,所以对应的tensor的30维向量如图:
在这里插入图片描述
当训练时,假设bbox1处的左边与真实的bbox的IOU更大一些, C 1 = I O U p r e d t r u t h C1=IOU_{pred}^{truth} C1=IOUpredtruth C 2 = 0 C2=0 C2=0。反之同理。

5. 损失函数

假设使用平方和误差进行模型优化
问题:这样会比较容易优化,但是不完全符合我们的最大化平均精度。1) 这样将定位误差和分类误差同等对待是不合理的。2)图像中有很多的网格不包含任何的物体,这样网格的confidence趋于0的梯度,会很大程度上超多confidence趋于1的梯度。这样会导致网络不稳定,从而使网络在训练初期就出现了梯度爆炸。
解决方法:
给损失的不同项赋予不同的权重:坐标的回归的系数为5,没有对象bbox的confidence的系数为0.5

.
论文中给出损失的公式为:
在这里插入图片描述
公式中

  • 1 i o b j 1_{i}^{obj} 1iobj 网格 i i i中存在对象
  • 1 i j o b j 1_{ij}^{obj} 1ijobj 网格 i i i中的第 j j j个bbox中存在对象
  • 1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj 网格 i i i中的第 j j j个bbox中不存在对象

损失函数的设计,让损失函数在坐标(x,y,z,h),confidence,classification这三个方面达到很好的平衡。
网络输出7x7x30中,有7x7x2个置信度的数值量,对应的有7x7x2个bbox的坐标,7x7个分类。
测试时我们需要:先看每个grid的2个置信度,确定是否有被检测物;再看grid对应的bbox的位置,确定被检测物的位置;再看分类的概率,确定这检测者的类别。


所以就按照这个顺序来分析损失函数

  1. bbox的置信度(第三四行)
     a) 所有bbox的置信度 ,都会参与loss的计算。第三行 1 i j o b j 1_{ij}^{obj} 1ijobj:计算负责预测对象的bbox对应的置信度的误差;第四行 1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj:计算其余所有的bbox的置信度的误差。
     b) 第四行的意义:不负责预测对象的bbox 表明自己的位置不存在对象,输出时尽量降低自己的置信度,与正确的bbox的置信度拉开距离。(与对象分类一样,正确的对象概率尽量为1,其余的都为0)。
     c) λ n o o b j = 0.5 \lambda _{noobj}=0.5 λnoobj=0.5
  2. bbox的坐标(第一二行)
     a) 其中的 1 i j o b j 1_{ij}^{obj} 1ijobj:负责预测对象的bbox的位置信息参与loss的计算。(当确定了负责对象预测的bbox,就只关注该bbox的坐标的误差,其余的bbox不参与计算)
     b) 中心的误差直接使用欧氏距离进行计算;宽高的误差需要先取了平方根。原因:直接取差值的话,大的对象对差值的敏感度较低,小的对象对差值敏感度较高。效果:取平方根可以降低这种敏感度的差异,使得较大的对象和较小的对象在尺寸误差上有相似的权重。
     c) 系数 λ c o o r d \lambda _{coord} λcoord,调节bbox的中心及宽高误差在总误差中的权重。 λ c o o r d = 5 \lambda _{coord}=5 λcoord=5
  3. bbox中对象的分类(第五行)
     a) 其中的 1 i o b j 1_{i}^{obj} 1iobj:负责预测对象的bbox的分类信息,参与loss的计算。

.
总结:
从3种任务的角度来看,所有的 b b o x bbox bbox c o n f i d e n c e confidence confidence都要进行优化,负责预测对象的 b b o x bbox bbox的位置信息和分类信息要进行优化。且设置了相应的权重
从bbox的角度来看,负责预测对象的 b b o x bbox bbox,三个任务(置信度 位置信息 分类) 均要参与优化;不负责预测对象的 b b o x bbox bbox的置信度参与优化即可。

6. 训练

在这里插入图片描述

6.1 预训练分类网络

在ImageNet 1000-class competition dataset上预训练一个分类的网络,这个网络是(20个卷积网络)+(一个平均池化层)+(一个全连接层)。此时网络输入是224*224。

6.2 训练检测网络

转换模型去执行检测任务,论文中提到:在预训练网络的基础上增加卷积和全连接层可以改善性能。所以添加了4个卷积层和2个全连接层,随机初始化权重。为了检测细粒度的视觉信息,所以把网络输入也由224224变成了448448。

  • dataset:PASCAL VOC
  • 2007、2012
  • epochs:135
  • batchsize: 64
  • momentum:0.9
  • decay:0.0005
  • learningrate:在第一个epoch中将 l r lr lr 从0.001逐渐提高到0.01。(如果直接从较高的学习率开始训练,由于不稳定的梯度会导致网络的发散)然后再已0.01训练75个epoch,在以0.001训练30个epoch,以0.0001训练30个epoch

为了避免过拟合:

  • dropout层:在第一个全连接层之后,使用0.5的dropout层
  • 数据增强:随机缩放或平移,最大程度为原始图像的20%;在HSV色彩空间中随机调整图像的曝光和饱和度,最高达1.5倍。

7. 预测+NMS

预测

训练好的YOLO网络,输入一张图片,会得到一个7x7x30的张量来表示:图片中的网络包含的对象的概率以及该对象2个bbox和置信度。(需要注意的是,在预测过程中没有了对象的真实坐标,也就没有了IOU的计算)
故预测时的score公式为 s c o r e i j = P r ( C i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C i ∣ O b j e c t ) ∗ P r ( O b j e c t ) score_{ij}=P_r(C_i|Object)*P_r(Object)*IOU_{pred}^{truth}=P_r(C_i|Object)*P_r(Object) scoreij=Pr(CiObject)Pr(Object)IOUpredtruth=Pr(CiObject)Pr(Object)

注意区别:
P r ( O b j e c t ) P_r(Object) Pr(Object):bbox中是否有对象
C o n f i d e n c e i j Confidence_{ij} Confidenceij:置信度,也是标签中或网络输出的tensor中30维度的20、21维的具体数值。等于 P r ( O b j e c t ) ∗ I O U P_r(Object)*IOU Pr(Object)IOU
s c o r e i j score_{ij} scoreij:预测时的得分。等于 置信度*分类概率

.

  1. 一张图片共有7x7x2=96个bbox,每个bbox对20种分类都有得分。
    在这里插入图片描述
  2. 计算每个bbox的分类得分后,设置阈值,去掉得分低的bboxes。然后就每类别而言,进行NMS处理,得到最终结果。直观的讲:就该图片而言,所有的bbox的分类中,除了狗、自行车、小车之外的得分应该都小于阈值。也就是只有狗、自行车、小车这三类,会进行有效的NMS。然后得到object的最终的bbox和相应的分类。

NMS

网络的设计在边界框预测中强制实现了空间多样性,通常能够清楚的知道物体落入哪个网格中,并且为每个物体只预测一个边界框。但,一些较大的物体或跨越多个网络边界的物体,可能被多个网格都很好的检测出来(即重建测问题:一个物体被多次检测出来)。使用NMS可以很好的解决这个问题

具体操作步骤:(一张图片上有猫,假设有N个框,每个框被分类器计算得分Si,1<=i<=N)
a) 构建一个集合H,初始化包括N个框;构建一个集合O,初始化空集
b) 将集合H中的框按得分大小排序,将得分最高的框m,从集合H移至O
c) 遍历集合H中的框,分别与框m计算IoU。如果高于阈值(一般为0.3~0.5),则认为与此框重叠,将此框从集合H删除
d) 回到第1步,进行迭代,直至集合H为空。集合O中的框为我们所需(集合O中有几个框,图片中就有几只猫)
在这里插入图片描述

8. yolov1的缺点

  • yolo对相互靠的很近的物体、很小的群体检测效果不好。YOLO对边界框预测事假了强烈的空间约束:一个网格中只预测了两个框(只有一个可用),并且只能属于一类。当出现一堆小鸟时,就会出现物体间的竞争。
  • 对测试图像中,同一类物体出现新的不常见的长宽比,便无法正确预测。泛华能力不够
  • 由于损失函数的设定,定位误差 是影响检测效果的主要原因。在训练一个损失函数不断提高检测性能时,依然将小边框和大边框的损失同等对待。这样,一个较小的损失值对较大的边界框来说影响较小,但是对较小的边界框意味着极大的影响IOU。

9. 实验

在PASCAL VOC 2007上,进行了 YOLO和 Fast R-Cnn的对比;
在VOC 2012上,进行了YOLO和当时最先进的方法的mAP的对比 ;
在两个艺术品数据集上,YOLO比其他检测器更容易迁移到其它领域。

9.1 与其他实时系统对比

参考https://www.jianshu.com/p/cad68ca85e27

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值