tensorflow随笔——Yolo v1

Yolo背景

Yolo的训练和检测均在一个端到端的网络中进行,将物体检测作为回归问题求解,输入图像经过一次Inference,便能得到图像中所有物体的位置和其所属类别及相应置信概率。这种直接选用整图训练模型的架构可以更好的区分目标和背景区域,相比于proposal的方法更少把背景区域误检为目标。

Inference过程

这里写图片描述

YOLO网络结构由24个卷积层与2个全链接层构成,卷积层用来提取图像特征,全链接层用来预测图像位置和类别概率,网络结构借鉴了GoogleNet分类网络,大量使用1×1和3×3卷积层。网络入口为448×448,图片进入网络之前需要经过resize,网络的输出的张量维度是:S × S ×(B × 5 + C)。

这里写图片描述

根据上图将图片划分成7×7(S=7),每个网格设置2个box负责预测目标(B=2),C为类别数(VOC取20)。该式表达的含义为:

(1)每个小格会对应B个边界框,每个bbox预测5个值: x, y, w, h, 置信度。(x, y)是bbox的中心在对应格子里的相对位置,范围

         [0,1]。(w, h)是bbox相对于全图的的长宽,范围[0,1]。x, y, w, h的4个gt值可以算出来。它和ssd及rcnn系列在这里有个很不

         同的地方,它是直接回归bbox的位置,而ssd及rcnn系列是回归的是default box/anchor的偏移量,就是现有一个预设box,

        然后网络只用学习这个预设box的偏移使它更准,但是yolo没有default box/anchor这个东西。

(2)每个边界框都有一个置信度,反映当前bounding box是否包含物体以及物体位置的准确性:

         confidence = P(object) × IoU_{pred}^{truth}

         其中,若bounding box包含物体,则P(object)=1,否则P(object)=0。IoU为预测bounding box与物体真实区域的交集面积。

         如果格子内有物体,则Pr(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0,此时置信度为0。

(3)每个小格会对应C个概率值,找出条件概率对应的类别P(Class|object),表示该单元格存在物体且属于第i类的概率。

(4)在测试的时候,每个网格预测的类别信息和bounding box预测的confidence信息相乘,就得到每个boundig box的

         class-specific confidence score,然后设置阈值,过滤掉得分低的boxes,再对剩余的进行NMS处理得到最终检测结果。     

这里写图片描述

注:class信息是针对每个网格的,confidence信息是针对每个bounding box的。

以论文参数为例,针对448×448的输入,将其划分为7×7=49个栅格,B设为2,预测PASCAL数据集则C=20,最后的prediction是维度等于1470的Tensor。

这里写图片描述

Loss函数

Yolo使用均方和误差作为损失函数来优化模型参数,即网络输出的S×S×(B×5+C)维向量与真实图像对应S×S×(B×5+C)维向量的均方和误差,设计目的就是让coord,confidence,classification这三个方面达到很好的平衡。

loss = \sum_{i=0}^{s^{2}}coordError + confiError + classError

但是粗暴的采用均方和误差作为优化目标会存在几点不足:

a.定位误差(x,y,w,h)和分类误差同等重要显然不合理,需给定位损失赋予较大的loss weight(pascal voc训练时取5)

b.置信度误差针对网格中有object和没有object同等重要会导致不平衡问题,需给没有object的置信度损失赋予较小的

   loss weight(pascal voc训练取0.5)

c.对于大的物体,小的偏差对于小的物体影响较大,为了减少这个影响,所以对bbox的宽高都开根号。

 

这里写图片描述

在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个 predictor就负责 predict object。
这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
神经网络输出后的检测流程

得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。

这里写图片描述

非极大值抑制

这里写图片描述获取Object Detect 结果

这里写图片描述

YOLO缺点

(1)每个网格只能预测一类物体且对小物体检测效果差:当一个小格中出现多于两个小物体或者一个小格中出现多个不同物体

         时效果不佳。虽然B表示每个小格预测边界框数,但YOLO默认同格子里所有边界框为同类物体,并且最终只选择IoU最高

         的bounding box作为输出。

(2)图片进入网络前会resize为448×448,降低检测速度,如果直接训练对应尺寸会有加速空间。

(3)基础网络计算量较大。

(4)识别物体位置精准性差,√w和√h策略并没有完全解决location准确度问题。

相关问题

YOLO的每个cell有两个检测器,每个检测器分别预测一个bounding box的xywh和相应的confidence。但分类部分的预测是共享的,由于这个原因,同一个cell是没办法预测多个目标的。

1. 假设类别预测不是共享的,cell中两个检测器都有各自的类别预测,这样能否在一个cell中预测两个目标?

答案:不可以。如果一个cell要预测两个目标,那么这两个检测器要怎么分工预测?谁负责谁很难确定。但是像faster rcnn算法,根据anchor和ground truth的IOU大小来安排anchor负责预测哪个物体,所以从yolo v2开始采用anchor思想可以同个cell预测多个目标。

2. 既然一个cell只能预测一个目标,为什么要预测两个bounding box?

答案:两个检测器一个预测,然后网络选择预测的好的哪个检测器(IOU大的)来进行预测。换句话说就是找一堆人干同一件事,最后选个干的最好的。

参考文档

https://blog.csdn.net/hrsstudy/article/details/70305791

https://blog.csdn.net/c20081052/article/details/80236015

https://blog.csdn.net/qq_28123095/article/details/80052308

https://www.cnblogs.com/fariver/p/7446921.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值