【YOLOv1】的那点事儿

本文主要记录YOLOv1的重要知识点、研读论文时产生的疑问问题及解决过程。
本文出现的图片和部分文字源于网络,侵删~~

1. YOLOv1重要知识点总结

  1. 输入图像尺寸:448×448
  2. 将图片分成7×7个网格(grid cell)
  3. 每个网格预测生成2个bounding box
  4. 所以,整个图像含有7×7×2=98个bounding box
  5. 每个bounding box含有5个信息,分别是[x,y,w,h,c],表示中心点相对grid cell的偏移量x,y、物体框的宽度w和高度h、置信度c
  6. 中心点所在的grid cell负责检测物体,其他网格不负责。
  7. 置信度公式为: P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Object)×IOU^{truth}_{pred} Pr(Object)×IOUpredtruth,其中 P r ( O b j e c t ) ∈ Pr(Object)∈ Pr(Object) {0,1}
  8. 所以,整个图像含有的信息总数为:S×S×(5 × B + C) = 7×7×(5×2+20)=1470,其中7表示7×7个网格,2表示2个bounding box,5表示[x,y,w,h,c],20表示待训练数据集共有20个种类。
  9. 每个网格只预测一种类别,也就是每个网格有20种可能性。
  10. 每个网格有类概率,每个bounding box有置信度。
  11. 最后预测是7×7×30的tensor,其中30=5×2+20。
  12. YOLOv1含有24个卷积层,2个全连接层。其中卷积层借鉴了GoogLeNet网络。
  13. ground truth框即标签框
  14. 交并比IOU
  15. 非极大抑制NMS(Non-Maximum Suppression)
  16. 对于卷积层和全连接层,采用Leaky ReLU激活函数。但是最后一层却采用线性激活函数。
    Φ ( x ) = { x , i f x > 0 0.1 x , o t h e r w i s e \Phi(x)= \begin{cases} x,\qquad if \quad x>0 \\ 0.1x,\quad otherwise \end{cases} Φ(x)={x,ifx>00.1x,otherwise
  17. 在每个图像中,许多网格单元不包含任何对象。增加了边界框坐标预测的损失,并减少了不包含对象的框的置信预测的损失。使用两个参数, λ c o o r d λ_{coord} λcoord λ n o o b j λ_{noobj} λnoobj来实现这一点。我们设置了 λ c o o r d = 5 λ_{coord}=5 λcoord=5 λ n o o b j = 0.5 λ_{noobj}=0.5 λnoobj=0.5
  18. YOLO训练和检测均是在以单独的网络中进行的。

存在的问题:

1.中心点是怎样确定的?
2. bounding box是怎样生成的?
3. 如果中心点落在某个网格的边线上或者顶点上,哪个网格负责检测物体?
4. GoogLeNet 模型是怎样的?为什么采用这种模型?
5. 24个卷积层是哪24个?在结构图中怎样表示的?
6. 怎样理解损失函数?
7. 怎样解决过拟合问题?
8. IOU是怎样计算的?有什么用?
9. 非极大抑制是怎样实现的?为什么用NMS算法?
10. 条件类概率 P r ( C l a s s ∣ O b j e c t ) Pr(Class|Object) Pr(ClassObject)是怎样计算的?
11. YOLOv1是怎样预测物体的种类的?
12. 为什么说YOLOv1是把这个物体分类任务当做一个“回归问题(regression)”?

2. YOLOv1算法原理介绍

在这里插入图片描述

3. YOLOv1网络结构图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. YOLOv1损失函数

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
简单的全部采用了sum-squared error loss来做这件事会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的。
b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。
针对这两个问题,论文引入了 λ c o o r d \lambda_{coord} λcoord λ n o o b j \lambda_{noobj} λnoobj两个平衡参数。
在这里插入图片描述

5. YOLOv1存在缺点

  • 输入尺寸是固定的
  • 小目标检测效果差
  • 同一个网格包含有多个物体时,只能预测一个IOU最高的

6. 解决问题

  1. 中心点是怎样确定的?

YOLOv1预测的bbox的中心点坐标是网络直接输出的,要归一化。在scipts找到了vol_label.py文件才知道中心坐标是根据标签中的xmin,xmax,ymin,ymax计算出来的。

def convert(size, box):
    dw = 1./size[0] # 归一化的时候就是使用宽度除以整个image_size的宽度 
    dh = 1./size[1] # 归一化的时候就是使用高度除以整个image_size的高度
    x = (box[0] + box[1])/2.0 # 使用(xmin+xmax)/2得到x的中心点
    y = (box[2] + box[3])/2.0 # 使用(ymin+ymax)/2得到y的中心点
    w = box[1] - box[0] # 然后宽度就是使用xmax-xmin计算得到
    h = box[3] - box[2] # 然后高度就是使用ymax-ymin计算得到
    x = x*dw # 归一化中心坐标x
    w = w*dw # 归一化bbox宽度
    y = y*dh # 归一化中心坐标y
    h = h*dh # 归一化bbox高度
    return (x,y,w,h)
  1. bounding box是怎样生成的?

简单的说,bounding box是回归产生的。运行CNN,得到一些bbox的坐标、bbox中包含物体的置信度和class probabilities。其实回归的输入并不是这些预测的坐标数字,而是预测的坐标对应的feature map中的内容,这个内容与相对于ground truth进行对比,计算,是回归的根本依据。
通过不断的训练,得到了回归的参数,在预测时,网络产生了图像的feature map,对于任意一个预测框,背后对应了一个feature 区域,将学习到的参数与此feature区域进行运算,就会得到调整预测框的参数了。
参考链接:
https://blog.csdn.net/Li_haiyu/article/details/80509268
https://blog.csdn.net/brightming/article/details/78072045

  1. 如果中心点落在某个网格的边线上或者顶点上,哪个网格负责检测物体?

暂时未找到答案。

  1. GoogLeNet 模型是怎样的?为什么采用这种模型?

GoogLeNet是一个分类网络。YOLOv1遵循GoogleNet分类网络的结构,在这个基础上不使用inception module,而是使用1×1卷积层+3×3卷积层简单代替。使用1×1的原因:1x1卷积层能够跨通道信息整合。

  1. 24个卷积层是哪24个?在结构图中怎样表示的?

YOLOv1采用卷积网络来提取特征,然后使用全连接层来得到预测值。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用前20个卷积层,预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。在这里插入图片描述

  1. 怎样理解损失函数?

首先要明确两个概念:一是网格中有无目标;二是网格中的一个目标只有一个box负责(responsible),另一个box也算没有目标。根据在线计算IOU的大小确定哪一个bbox负责。
位置损失: 容易理解,负责检测的才有位置损失,其他的都不需回传损失,也就不需要计算,此外小目标对于预测wh的误差更敏感,用开根的方法缓解。举例来说,大小为10和大小为100的目标,预测大小分别为20和110,损失一样,按道理说,检测效果应该是一样的,但是显然小目标检测的更差一些。开根后, ( 20 − 10 ) 2 = 1.7 (\sqrt{20}-\sqrt{10})^2=1.7 (20 10 )2=1.7,而 ( 110 − 100 ) 2 = 0.24 (\sqrt{110}-\sqrt{100})^2=0.24 (110 100 )2=0.24,相当于强化了小目标的wh的损失。这样就使同样的偏移量,小目标损失比大目标损失大,呈现小目标检测效果更差的现象。符合常理。
confidence损失: 不负责和无目标的box比较多(除了负责检测物体的那个框),为了平衡,加入这部分box加入平衡参数 λ n o o b j \lambda_{noobj} λnoobj
类别损失: 含有目标的网格才有类别损失,其他都不需要回传损失,也就不需要计算。(也就是负责检测物体的那个框需要计算损失,其他都不需要)

  1. 怎样解决过拟合问题?

为了防止过拟合,在第一个全连接层后面接了一个 ratio=0.5 的 Dropout 层。

  1. IOU是怎样计算的?有什么用?

IOU 的值可以认为是两个区域的重叠部分(交集)除以两个区域的集合部分(并集)所得到的比值。 I O U = A ∩ B A ∪ B IOU=\frac{A{\cap}B}{A{\cup}B} IOU=ABAB,用于去除多余的bounding box,保留最好的一个bounding box。

  1. 非极大抑制是怎样实现的?为什么用NMS算法?

NMS算法主要解决的是一个目标被多次检测的问题,使用NMS算法能输出其中一个最好的预测框。NMS算法实现过程:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;如果其值小于一定阈值,那么就先保留,等待第二轮处理。对剩余的检测框重复上述过程,直到处理完所有的检测框(筛选出最好的一个预测框)。

  1. 条件类概率 P r ( C l a s s ∣ O b j e c t ) Pr(Class|Object) Pr(ClassObject)是怎样计算的?

概率其实就是000010000···,某一个是1,其余19个是0。
在判断网格中是否存在物体时,如果 P r ( O b j e c t ) Pr(Object) Pr(Object)!=0,表明该网格中有物体,那么需要继续计算该网格中的物体属于某一类的后验概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject)。假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率 P r ( C l a s s i ∣ O b j e c t ) , i = 1 , 2 , . . . , C Pr(Class_i|Object), i=1,2,...,C Pr(ClassiObject),i=1,2,...,C;每一个网格预测B个bounding box的位置,就有B个后验概率值。即这B个bounding box共享一套条件类概率 P r ( C l a s s i ∣ O b j e c t ) , i = 1 , 2 , . . . , C Pr(Class_i|Object), i=1,2,...,C Pr(ClassiObject),i=1,2,...,C

  1. YOLOv1是怎样预测物体的种类的?

最后一个fc层是用来预测物体属于不同类的概率+bbox中心点坐标x,y和高宽w,h。bbox的高宽是相对于图像归一化后得到的,bbox的中心位置的坐标是相对于某一个网络的位置坐标进行过归一化,因此x,y,w,h的值在[0,1]之间。

  1. 为什么说YOLOv1是把这个物体分类任务当做一个“回归问题(regression)”?

原来的目标检测网络比如fast-rcnn 都是先生成提取框(也就是检测区域),然后基于这些区域后面进行的就是一个“分类问题”,但是yolo直接输出就是回归框偏移量、置信度以及每一类的概率(全为连续量),包括损失函数采用均方差损失函数,从这些看这就是一个回归问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值