Yolo损失函数说明


16

我试图了解Yolo v2损失函数:

λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2

如果有人可以详细说明功能。


5
没有上下文,没有人能为您提供帮助...至少告诉我们这是什么论文。
bdeonovic

1
“我不理解”和“详细功能”过于宽泛。请尝试识别特定问题。请注意,已经有许多与Yolo有关的问题,其中一些问题可能至少为您提供了您所寻求的部分
Glen_b -Reinstate Monica

1
如果您指出这个出色的解释尚不清楚,请补充我的答案:medium.com/@jonathan_hui/…–
Aksakal,

1
在此博客中有yolo和yolov2的详细图形说明。它确实回答了有关损失函数的问题。Ifind对于初学者和更高级的用户非常有用。
MBoaretto

Answers:


18

不同术语的解释:

  • 3常数仅是考虑损失函数一方面的常数。在文章中是最高的,以便在第一学期具有更高的重要性λ Ç ö ø - [R dλλcoord
  • YOLO的预测是向量:每个网格单元的 bbox预测和每个网格单元的类预测(其中是类数)。单元格i的框j的5个bbox输出是bbox高度中心,高度,宽度和置信指数坐标B C C x i j y i j h i j w i j C i jSS(B5+C)BCCxij yijhijwijCij
  • 我认为带帽子的值是从标签读取的真实值,而没有帽子的值是预测的值。那么标签上每个bbox的置信度分数的实际值是多少?它是预测边界框与标签中边界框的并集​​的交集。C^ij
  • 1i01iobj如果单元格有一个对象,则为,而其他位置为1i0
  • ji1ij 1 n o o b j i j i1ijobj “表示单元格中的第个边界框预测变量负责该预测”。换句话说,如果单元格有一个对象且该单元格的第个预测变量的置信度在该单元格的所有预测变量中最高,则等于。几乎相同,只是当单元格中没有对象时它的值为1ji1ij1ijnoobji

请注意,对于每个bbox预测,我都使用了两个索引和,但本文中并非如此,因为总会有一个因子或因此没有模棱两可的解释:所选的是与该单元格中最高置信度得分相对应的。Ĵij 1 n o o b j j j1ijobj1ijnoobjj

每个和项的更一般的解释:

  1. 这个术语惩罚细胞中心的不良定位
  2. 这个术语用不正确的高度和宽度惩罚边界框。由于存在平方根,因此小边界框内的错误比大边界框内的错误更容易受到惩罚。
  3. 当存在一个对象时,该术语试图使置信度得分等于对象与预测之间的IOU
  4. 当单元格中没有对象时尝试使置信度得分接近0
  5. 这是一个简单的分类损失(本文未解释)

1
第二点应该是B*(5+C)吗?YOLO v3就是这种情况。
sachinruk

@sachinruk,这反映了原始YOLO与v2和v3之间的模型更改。
David Refaeli

12

λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2

YOLOv2损失功能看起来并不可怕吗?实际上不是!它是周围最大胆,最聪明的损失函数之一。

首先让我们看一下网络实际预测的结果。

如果我们回顾一下,YOLOv2会在13x13的特征图上预测检测到的物体,因此总共有169个图/单元。

我们有5个锚框。对于每个锚点框,我们需要对象置信度得分(是否找到任何对象?),锚点框的4个坐标(和)以及20个顶级类。对于所有5个锚框预测,这可以粗略地看成20个坐标,5个置信度得分和100个类别概率。tx,ty,tw,th

我们没有什么可担心的:

  • xi,yi,它是锚框质心的位置
  • wi,hi,它是锚框的宽度和高度
  • Ci,是Objectness,即是否存在对象的置信度得分,以及
  • pi(c),这是分类损失。
  • 我们不仅需要训练网络以检测单元格中是否存在物体,还需要惩罚网络,如果预测单元格中是否存在物体,则该网络也会受到惩罚。我们如何做到这一点?我们为每个单元格使用一个掩码(和)。如果最初有一个对象为1,其他无对象像元为只是逆,此处为1如果没有对象在细胞和0,如果有。𝟙iobj𝟙inoobj𝟙iobj𝟙inoobj𝟙iobj
  • 我们需要对所有169个单元格执行此操作,并且
  • 我们需要这样做5次(对于每个锚框)。

除分类损失(使用交叉熵函数)以外,所有损失均为均方误差。

现在,让我们打破图像中的代码。

  • 我们需要计算每个锚框的损失(总共5个)

    • j=0B代表这部分,其中B = 4(5-1,因为索引从0开始)
  • 我们需要对S = 12的13x13单元格中的每个单元格执行此操作(因为我们从0开始索引)

    • i=0S2代表这一部分。
  • 𝟙ijobj当单元格有一个对象时,为1 ,否则为0。i

  • 𝟙ijnoobj当单元格没有任何对象时,为1 ,否则为0。i
  • 𝟙iobj当预测到特定类别时,为1,否则为0。
  • λs是常数。λ对于坐标来说是最高的,以便更多地专注于检测(请记住,在YOLOv2中,我们首先训练它进行识别,然后再进行检测,对识别进行惩罚会浪费时间,而我们专注于获取最佳边界框!)
  • 我们还可以注意到在平方根下。这样做是为了惩罚较小的边界框,因为我们需要在较小的对象上比在较大的对象上更好的预测(作者的电话)。看看下表,观察如果遵循“平方根”方法,较小的值将受到更多的惩罚(当输入值为0.3和0.2时,请看拐点)(PS:我保持了var1的比率和var2相同,仅用于说明):wi,hi

        var1 | var2 | (var1-var2)^ 2 | (sqrtvar1-sqrtvar2)^ 2

        0.0300 | 0.020 | 9.99e-05 | 0.001

        0.0330 | 0.022 | 0.00012 | 0.0011

        0.0693 | 0.046 | 0.000533 | 0.00233

        0.2148 | 0.143 | 0.00512 | 0.00723

        0.3030 | 0.202 | 0.01 | 0.01

        0.8808 | 0.587 | 0.0862 | 0.0296

        4.4920 | 2.994 | 2.2421 | 0.1512

没那么吓人吧!

这里阅读更多信息。


1
\ sum中的i和j应该从1而不是0开始吗?
webbertiger

1
是的,那是正确的webertiger,已经相应更新了答案。谢谢!
RShravan

心不是 1当在小区i边界框j的一个目的?不是所有的j?我们如何选择将哪个j设置为1,将其余j设置为零。即打开它的正确的比例尺/锚点是什么。1ijobj
sachinruk

1
我认为S仍应为13,但如果求和从0开始,则应以结尾S21
朱利安

3
@RShravan,您说:“所有损失都是均方误差,但分类损失除外,后者使用了交叉熵函数”。你能解释一下吗?在此等式中,它看起来也像MSE。在此先感谢
朱利安(Julian)

3

您的损失功能适用于YOLO v1,而不适用于YOLO v2。我也对两个损失函数的区别感到困惑,似乎很多人都在:https : //groups.google.com/forum/#!topic/darknet/TJ4dN9R4iJk

YOLOv2论文解释了与YOLOv1的体系结构差异,如下所示:

我们从YOLO(v1)中删除了完全连接的图层,并使用锚定框预测边界框...当移到锚定框时,我们还将类预测机制与空间位置解耦,而是为每个锚定框预测类和对象。

这意味着以上的置信概率不仅应取决于和而且还取决于锚框索引,例如。因此,损失需要与上面有所不同。不幸的是,YOLOv2文件没有明确说明其损失功能。pi(c)icj

我尝试猜测YOLOv2的损失函数并在此处进行讨论:https ://fairyonice.github.io/Part_4_Object_Detection_with_Yolo_using_VOC_2012_data_loss.html


1

这是我的学习笔记

  1. 损失函数:平方和误差

    一个。原因:易于优化b。问题:(1)与我们实现平均平均精度最大化的目标不完全一致。(2)在每个图像中,许多网格单元都不包含任何对象。这会将这些单元格的置信度得分推向0,通常会超过确实包含对象的单元格的梯度。C。解决方案:增加边界框坐标预测的损失,并减少不包含对象的框的置信度预测的损失。我们使用两个参数和 = 0.5 d。平方和误差也同样权重大箱子和小箱子的误差

    λcoord=5
    λnoobj

  2. 每个对象仅应负责一个边界框。我们分配一个预测变量来负责预测一个对象,根据该预测,当前预测的IOU最高且具有基本事实。

一个。边界框坐标(x,y)的损失请注意,损失来自一个网格单元的一个边界框。即使obj不在网格单元格中作为地面真理。

{λcoordi=0S2[(xix^i)2+(yiyi^)2]responsible bounding box0 other

b。宽度w和高度h的损失。请注意,即使物体作为地面真相不在网格单元中,损失也来自一个网格单元的一个边界框。

{λcoordi=0S2[(wiw^i)2+(hih^i)2]responsible bounding box0 other

C。每个边界框的置信度损失。并不是说损失是来自一个栅格单元的一个边界框,即使该对象不是作为地面真相的栅格单元。

{i=0S2(CiC^i)2obj in grid cell and responsible bounding boxλnoobji=0S2(CiC^i)2obj not in grid cell and responsible bounding box0other
d。仅当对象作为基本事实在网格单元中时,才会从网格单元的类概率中损失。

{i=0S2cclasses(pi(c)p^i(c))2obj in grid cell0other

仅当网格单元中存在obj时,损失函数才会惩罚分类。如果该框负责地面框(最高IOU),也会对边界框坐标进行惩罚


关于“ C”的问题,在本文中,置信度是输出的有或无对象值乘以IOU;只是为了测试时间还是用于培训成本函数?我以为我们只是从输出和标签中减去C值(就像我们对网格值所做的那样),但这是错误的吗?
moondra

0

您编写的损失公式是原始的YOLO纸张损失,而不是 v2或v3损失。

版本之间存在一些主要差异。我建议阅读论文或检查代码实现。论文:v2v3

我注意到一些主要差异:

  • 类别概率是根据边界框计算的(因此输出现在为S * S * B *(5 + C)而不是S S(B * 5 + C))

  • 边界框坐标现在具有不同的表示形式

  • 在v3中,他们在3个不同的“标度”中使用3个框

您可以尝试查看损失的实质内容,方法是查看python / keras实现v2v3(查找函数yolo_loss),或者直接查看c实现v3(查找delta_yolo_box和delta_yolo_class)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.