DataWhale_组队目标检测 :)化劲儿-损失函数设计

网络设计好以后,就来到了的损失函数设计的流程。

上一篇网络设计博客链接:练死劲儿-网络设计

本专栏笔记用于记录学习DataWhale开源CV教程动手学CV-Pytorch遇到的问题及思考

教程链接如下:动手学CV-Pytorch

重要内容文章会以黄色背景或者蓝色字体标出

损失函数

通俗的讲,损失函数(又称为代价函数)就是求解模型预测值与目标真实值的差距。我们的目标就是减小损失函数,缩小这种差距。对于不同的问题,有不同的损失函数。

在目标检测问题中,常常涉及到对两种损失,第一是置信度损失,第二是定位损失。

匹配策略

在介绍具体的损失函数组成之前,我们先要了解一下预测框与目标框的匹配策略问题。因为在前面的步骤中,我们分配了许多的锚框, 我们要想让其预测类别和目标框信息,我们先要知道每个prior bbox和哪个目标对应,从而才能判断预测的是否准确,从而将训练进行下去。

本教程中采用了和SSD一样的匹配策略,该匹配策略有两个原则。

从Ground true box出发,匹配Prior bbox

我们从每个Ground true box出发,找到与其有最大IOU的Prior bbox,将该Prior bbox首先与对应的Ground true box对应起来,这样我们就保证了每个Ground true box 至少有一个Prior bbox与其对应。 反之,若一个Prior bbox没有与任何Ground truth进行匹配,那么该prior bbox只能与背景匹配,就是负样本。

其实我们提前生成的Prior bbox有很多,但是能分配到对应的Ground true box的很少,很显然的这样就造成了一个问题,那就是正负样本的分配不均,正样本太少而负样本太多,影响网络的学习,这样我们就需要第二种匹配原则。

从Prior bbox出发,寻找任意Ground true box与其IOU超过阈值,进行配对

对第一原则完成后,剩下的还没有匹配的Prior bbox,继续进行配对。每个Prior bbox任意的寻找Ground true box进行配对,当两者的IOU大于阈值时,则取该Prior bbox也与该Ground true box匹配。这说明一个Ground true box可以与多个Prior bbox相对应。需要注意的是一个Prior bbox只能与一个Ground true box相对应。

注意:第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU的prior bbox小于阈值,并且所匹配的prior bbox却与另外一个ground truth的IOU大于阈值,那么该prior bbox应该匹配谁,答案应该是前者,首先要确保每个ground truth一定有一个prior bbox与之匹配。

示例

在这里插入图片描述图像中有7个红色的框代表先验框,黄色的是ground truths,在这幅图像中有三个真实的目标。按照前面列出的步骤将生成以下匹配项:

在这里插入图片描述

损失函数

此处目标检测的损失函数由两部分组成:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c) + \alpha L_{loc}(x,l,g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))

上式为定位损失和置信度损失的加权和, N N N是匹配到Ground Trueth 的Prior bbox的数量, α \alpha α用于调整confidence loss和location loss之间的权重,默认为1.

Confidence loss

confidence loss是在多类别置信度C上的softmax loss,公示如下:

L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j P log ⁡ ( c ^ i p ) − ∑ i ∈ N e g log ⁡ ( c ^ i 0 ) L_{conf}(x,c) = -\sum_{i \in Pos}^{N} x_{ij}^{P} \log(\hat c_{i}^{p}) - \sum_{i \in Neg} \log(\hat c_{i}^{0}) Lconf(x,c)=iPosNxijPlog(c^ip)iNeglog(c^i0) W h e r e Where Where c ^ i p = e c i p ∑ p e i p \hat c_{i}^{p} = \frac{e^{c_{i}^{p}}}{\sum_{p}e^{_{i}^{p}}} c^ip=peipecip

对于多类别置信度softmax loss的解释,有一篇博客写的很好,链接如下:softmax loss

softmax loss简单来说,就是将神经网络的logit用softmax包裹起来,再丢到交叉熵里面去。很多人说什么softmax loss是不严谨的说法。实际上,我看了很多顶会论文,大佬们都是用softmax loss作为softmax function+cross entropy loss的简称。
softmax是激活函数,交叉熵是损失函数,softmax loss是使用了softmax funciton的交叉熵损失。

Location loss

Location loss是典型的smooth L1 loss

在这里插入图片描述

其中,l为预测框,g为ground truth。(cx,xy)为补偿(regress to offsets)后的默认框d的中心,(w,h)为默认框的宽和高。

Hard negative mining

值得注意的是,一般情况下negative prior bboxes数量 >> positive prior bboxes数量,直接训练会导致网络过于重视负样本,预测效果很差。为了保证正负样本尽量平衡,我们这里使用SSD使用的在线难例挖掘策略(hard negative mining),即依据confidience loss对属于负样本的prior bbox进行排序,只挑选其中confidience loss高的bbox进行训练,将正负样本的比例控制在positive:negative=1:3。其核心作用就是只选择负样本中容易被分错类的困难负样本来进行网络训练,来保证正负样本的平衡和训练的有效性。

举个例子:假设在这 441 个 prior bbox 里,经过匹配后得到正样本先验框P个,负样本先验框 441−P 个。将负样本prior bbox按照prediction loss从大到小顺序排列后选择最高的M个prior bbox。这个M需要根据我们设定的正负样本的比例确定,比如我们约定正负样本比例为1:3时。我们就取M=3P,这M个loss最大的负样本难例将会被作为真正参与计算loss的prior bboxes,其余的负样本将不会参与分类损失的loss计算。

SSD损失函数原文

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值