【YOLOv1】的那点事儿

2023-12-04 14:10
文章标签 那点 事儿 yolov1

本文主要是介绍【YOLOv1】的那点事儿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

  • 1. YOLOv1重要知识点总结
  • 2. YOLOv1算法原理介绍
  • 3. YOLOv1网络结构图
  • 4. YOLOv1损失函数
  • 5. YOLOv1存在缺点
  • 6. 解决问题

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 # 归一化中心坐标xw = w*dw # 归一化bbox宽度y = y*dh # 归一化中心坐标yh = 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直接输出就是回归框偏移量、置信度以及每一类的概率(全为连续量),包括损失函数采用均方差损失函数,从这些看这就是一个回归问题。

这篇关于【YOLOv1】的那点事儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453749

相关文章

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

编译和链接那点事下

http://www.0xffffff.org/?p=357 上回书我们说到了链接以前,今天我们来研究最后的链接问题。         链接这个话题延伸之后完全可以跑到九霄云外去,为了避免本文牵扯到过多的话题导致言之泛泛,我们先设定本文涉及的范围。我们今天讨论只链接进行的大致步骤及其规则、静态链接库与动态链接库的创建和使用这两大块的问题。至于可执行文件的加载、可执行文件的运行时

编译和链接那点事上

http://www.0xffffff.org/?p=323  有位学弟想让我说说编译和链接的简单过程,我觉得几句话简单说的话也没什么意思,索性写篇博文稍微详细的解释一下吧。其实详细的流程在经典的《Linkers and Loaders》和《深入理解计算机系统》中均有描述,也有国产的诸如《程序员的自我修养——链接、装载与库》等大牛著作。不过,我想大家恐怕很难有足够的时间去研读这些厚如

【UML建模】时序图的那点事

【UML建模】时序图的那点事 开篇词:干货篇:1.概述2.时序图的组成元素2.1角色(Actor):2.2生命线(Lifeline):2.3消息(Message):2.4激活条(Activation Bar):2.5时间标线(Time Axis):2.6组合片段(Combined Fragment):2.7注释(Note): 3.绘制步骤‌4. ‌注意事项‌:5.总结 我是杰叔叔,一名沪漂

安卓学习第一弹-关于ListView的那点事

ListView之手动的简单老虎机 如何使用listview: 第一步:在布局文件总声明ListView <ListView android:id="@+id/lv"android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent"></ListView

Objective-C总Runtime的那点事儿(一)消息机制

最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等。其他的问题如果有机会我会在其他文章中介绍。本篇文章主要介绍RunTime。 RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪

JAVA操作Excel那些事儿

前段时间接了一个Excel的数据处理单子后,小生百度千寻,终于先后使用JXL,POI两个包的后,最终在老师的见一下,使用ODBC访问EXCEL的形式,对处理,对于几种处理EXCEKL的数据方法有了大致的了解和感受,现总结如下: 目标数据:固定格式的EXCEL数据从10W条到100W条不等,根据不同的要求,添加新的记录。即原来一条ABCD数据,变成ABCDE,对于EXCEL的使用

关于分布式数据库缓存设计的那点事和实践

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(8 分) 【问题 3】(8 分) 【答案】 【问题 1】答案 【问题 2】解析 【问题 3】解析 相关推荐 案例         阅读以下关于分布式数据库缓存设计的叙述,在答题纸上回答问题 1 至问题 3。 【题目】         某企业是为城市高端用户提供高品质蔬菜生鲜服务的初创企业,创业初期为快速

关于Scrapy的那些事儿(四)Scrapy Shell

Scrapy Shell launch Scrapy shell 使用如下命令: scrapy shell <url> 当运行scrapy shell的时候,它为我们提供了一些功能函数: shelp() :打印可用对象和快捷命令的帮助列表fetch(request or url):根据给清的请求request或URL获取一个新的Response对象,并更新原有的对象。views(resp

关于回调函数的那点事

1 什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客