草庐IT

YOLOV5损失函数

反正也没人看我的昵称 2023-05-07 原文

yolov5的损失函数包括:

classification loss 分类损失

localization loss 定位损失,预测框和真实框之间的误差

confidence loss 置信度损失,框的目标性

总损失函数为三者的和

 classification loss + localization loss + confidence loss

也可以在三个损失前乘上不同的权重系数,已达到不同比重的结果。

在yolov5中的置信度损失和分类损失用的是二元交叉熵来做的,而定位损失是用的CIOU Loss来做的

类别预测(Class Prediction)

在传统的多分类任务中,一般使用的是softmax函数,将预测得分转换为综合为1的概率,就有点二极管那种感觉,不是动物,那就是人,再不行就是背景,就会导致有极强的排他性。

而在yolov3/v4/v5当中,在计算分类损失进行训练时,对每个标签使用二元交叉熵,去替换了softmax函数,降低了计算复杂度,以计算输入特定的标签的可能性,可以输出的标签是行人+儿童这种类型,输出的总分可以大于1。

边界框损失(localization loss)

IoU Loss

早先的对于边界框的损失使用的IoU损失去做的,去看真实框和预测框的交并比,来计算损失。但是会出现一个问题,就是当真实框和预测框不重叠时,IoU值将为0,并不会反应两个形状彼此之间的距离,会造成梯度为0并且无法优化。

GIoU Loss

后来在在CVPR2019时,出现了一个叫GIoU的损失他引入了一个最小包围框的概念。如图

  将绿色框A和土黄色框B,完全包围起来,这个框我们称为C框

 那么GIoU损失就为,两框的交并比IoU — (|C ÷ (A ∪ B)|  ÷  |C|)

 但是GIoU也有一些问题:

1.当检测框和真实框出现包含现象(一个完全套住了另一个,没有并集了)的时候GIoU退化成IoU

2.两个框相交时,在水平和垂直方向上收敛慢

DIoU Loss

这时候时又出现了一个DIoU Loss

 这时候引入了两框中心点的距离d 对角线C 的概念

 b和 bgt代表预测框的中心点和gt框的中心点。 ρ2() 代表的是欧式距离,c代表包含这两个框的最小矩形的对角线长度。这样的话,对于包含这种情况,中心点的距离也成为了一个评判标准,也能有一个优化的方向。从而解决了两个框相交时,在水平和垂直方向上收敛慢,这个问题。

原论文中作者给出了训练过程

 

第一排是 GIoU 第二排是DIoU,中心点的绿框是真实框,这图片可以清楚的看出,GIoU的收敛需要400次,而DIoU只需要120次,而且DIoU收敛的效果更好。原因就是DIoU考虑了两框中心点的距离,当两框中心点的距离为0或接近0时,可以判断是拟合的状态

CIoU Loss 

CIoU 又加入了一个长宽比这个条件,比较两个框宽高比的吻合度

 最后的αv就是相较于 GIoU增加的部分。

总结

DIoU相比于IoU和GIoU有更快的收敛速度。

CIoU考虑的范围更多,包括了重叠的面积,中心点距离,宽高比。这样的话对于框的回归会更充分,所以Yolov5当中默认的矩形框损失是CIoU Loss。

参考:

DIOU-loss - 知乎

有关YOLOV5损失函数的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

  7. ruby - 在 ruby​​ 中使用 .try 函数和 .map 函数 - 2

    我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法

  8. ruby - 是否可以从也在该模块中的类内部调用模块函数 - 2

    在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC

  9. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  10. ruby - 我可以在 Ruby 1.9.x 中使用无参数函数吗? - 2

    所以我正在研究RubyKoans,而且我遇到了一个我认为是ruby1.9.x特有的问题。deftest_calling_global_methods_without_parenthesesresult=my_global_method2,3assert_equal5,resultend我明白了:james@tristan:~/code/ruby_projects/ruby_koans$rake(in/home/james/code/ruby_projects/ruby_koans)cdkoans/home/james/.rvm/rubies/ruby-1.9.2-p180/bin/ru

随机推荐