YOLO v1

本文深入探讨了YOLOv1的运作原理,包括其独特的格子划分方式、损失函数的设计思路以及优缺点分析。此外,还详细解释了如何通过计算置信度得分来进行物体检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本上看了别人的博客和论文,自己再总结一些细节。
一 、yolo v1


yolo 最重要的一个特点是划分格子,这个只是我们让网络自动适应学习的一个规则,实际上我们并不会在图像上进行划分,输入的时候,我们输入的还是一整张的图片。然后输出的的时候,是按预想的格子输出的,比如划分为7*7的格子,那我们最后的输出就是7*7*30。这样好像输出的每一个长条向量(30)好像就对应图像上划分的一个格子。实际上,最后的输出特征向量的一个格子的感受野在原图上是很大的,这也是yolo效果好的一个原因,是基于全图的视野的。还有一个我们体现在损失函数里的规则就是,我们只让一个格子特征向量来负责一个物体的检测。也就是如果的标定的标签的物体的中心位于这个这个格子,我们主要优化的就是这个格子的特征向量,让他去贴合标签的数值,而其他的不管。
位于中心的这个特征向量的感受野实际上在原图上是以他为中心向四周发散,这样能更好的去概括一个物体,这样这个特征才能更好的用来检测物体。

二、细节
1、每个bounding box都对应一个confidence score ,如果grid cell里面没有object,confidence就是0,如果有,则confidence score等于预测的box和ground truth的IOU值,见上面公式。 如何判断一个grid cell中是否包含object呢?答案是:如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。  然后计算该grid cell预测的box和ground truth的IOU值,这个就是它的置信度。也就是confidence 的计算步奏是先判断是否含objec ,不含的就是0,含的话再计算与ground truth的iou值,作为最后的confidence score
然后用这个值和预测的20个类别分别相乘,最后得出的就是该 grid cell预测的属于某个类的概率。
即得到每个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里面没有物体,跳过即可。具体细节参考最后的参考资料1。
2、为什么有两个bbox,最后的结果向量里只是一个20维的类别的向量呢,因为每个grid cell只负责预测出一个类别,所以这个类别向量服务于两个bbox。也就是说,最后这个grid cell属于哪个类别和bbox没关系。
3、 一个grid cell中是否有object怎么界定? 
首先要明白grid cell的含义,以文中7*7为例,这个size其实就是对输入图像(假设是224*224)不断提取特征然后sample得到的(缩小了32倍),然后就是把输入图像划分成7*7个grid cell,这样输入图像中的32个像素点就对应一个grid cell。回归正题,那么我们有每个object的标注信息,也就是知道每个object的中心点坐标在输入图像的哪个位置,那么不就相当于知道了每个object的中心点坐标属于哪个grid cell了吗,而只要object的中心点坐标落在哪个grid cell中,这个object就由哪个grid cell负责预测,也就是该grid cell包含这个object。另外由于一个grid cell会预测两个bounding box,实际上只有一个bounding box是用来预测属于该grid cell的object的,因为这两个bounding box到底哪个来预测呢?答案是:和该object的ground truth的IOU值最大的bounding box。
4、

5、  
这里详细讲一下loss function。在loss function中,前面两行表示localization error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。 
三、优缺点
损失函数里边的 λcorrd系数(iou最大的那个第i个单元格的第j个bbox)这个系数会设置的很大,
λnoobj(不包含物体的bbox的置信度的系数)
  • 速度快。YOLO将物体检测作为回归问题进行求解,使用单个网络完成整个检测过程。
  • 召回率低,表现为背景误检率低。YOLO可以get到图像的整体信息,相比于region proposal等方法,有着更广阔的“视野”。
  • 泛化能力强,对其他类的东西,训练后效果也是挺好的。
  • YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
  • 对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。
  • 由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
  • 每个网格只预测一个物体,容易造成漏检;对于物体的尺度相对比较敏感,对于尺度变化较大的物体泛化能力较差。(一个网格的特征向量信息量 毕竟还是小的。)
四、疑问
一、损失函数了里选择某些框计算损失和计算所有的框的损失相比有什么好处,backword的时候会偏重优化某些权重吗?
1、一些思考,可能不会选择的优化某些权重,但是他会让权重去让这些有决定性的输出特征向量(包含物体的的格子对应的特征向量)不断地变化来贴合我们打的标签,从而来降低损失函数。也就是你这一次决定性的向量的变化会影响最后的损失,而其他的向量再怎么变化,损失函数也不变。所以随着训练的就行,网络会意识到这点,所以这样选择损失函数还有有益的。
2、想明白一点,是会选择某些权重去优化的。因为就是这些不同位置的权重使得最后的输出变得不一样。
二、第二个疑问:这样是不是每次计算损失都是只计算某几个位置(对应到图中的格子,包含物体中心的格子)的损失,而其他的格子就不用管了。

引用:
这个ppt讲的非常好,整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值