动手学CV-目标检测入门教程5:损失函数

Posted 随煜而安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手学CV-目标检测入门教程5:损失函数相关的知识,希望对你有一定的参考价值。

3.5 损失函数

本文来自开源组织 DataWhale 🐳 CV小组创作的目标检测入门教程。

对应开源项目 《动手学CV-Pytorch》 的第3章的内容,教程中涉及的代码也可以在项目中找到,后续会持续更新更多的优质内容,欢迎⭐️。

如果使用我们教程的内容或图片,请在文章醒目位置注明我们的github主页链接:https://github.com/datawhalechina/dive-into-cv-pytorch

3.5.1 Matching strategy (匹配策略):

我们分配了许多prior bboxes,我们要想让其预测类别和目标框信息,我们先要知道每个prior bbox和哪个目标对应,从而才能判断预测的是否准确,从而将训练进行下去。

不同方法 ground truth boxes 与 prior bboxes 的匹配策略大致都是类似的,但是细节会有所不同。这里我们采用SSD中的匹配策略,具体如下:

第一个原则: 从ground truth box出发,寻找与每一个ground truth box有最大的jaccard overlap的prior bbox,这样就能保证每一个groundtruth box一定与一个prior bbox对应起来(jaccard overlap就是IOU,如图3-26所示,前面介绍过)。 反之,若一个prior bbox没有与任何ground truth进行匹配,那么该prior bbox只能与背景匹配,就是负样本。

图3-26 IOU

一个图片中ground truth是非常少的,而prior bbox却很多,如果仅按第一个原则匹配,很多prior bbox会是负样本,正负样本极其不平衡,所以需要第二个原则。

第二个原则: 从prior bbox出发,对剩余的还没有配对的prior bbox与任意一个ground truth box尝试配对,只要两者之间的jaccard overlap大于阈值(一般是0.5),那么该prior bbox也与这个ground truth进行匹配。这意味着某个ground truth可能与多个Prior box匹配,这是可以的。但是反过来却不可以,因为一个prior bbox只能匹配一个ground truth,如果多个ground truth与某个prior bbox的 IOU 大于阈值,那么prior bbox只与IOU最大的那个ground truth进行匹配。

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

用一个示例来说明上述的匹配原则:

图3-27

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

图3-28

3.5.2 损失函数

下面来介绍如何设计损失函数。

将总体的目标损失函数定义为 定位损失(loc)和置信度损失(conf)的加权和:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) ( 1 ) L(x,c,l,g) = \\frac1N(L_conf(x,c)+\\alpha L_loc (x,l,g)) (1) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))(1)

其中N是匹配到GT(Ground Truth)的prior bbox数量,如果N=0,则将损失设为0;而 α 参数用于调整confidence loss和location loss之间的比例,默认 α=1

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

L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p l o g ( c ^ i p ) − ∑ i ∈ N e g l o g ( c ^ i 0 ) W h e r e c ^ i p = e x p ( c i p ) ∑ p e x p ( c i p ) ( 2 ) L_conf(x,c) = -\\sum_i \\in Pos^N x^p_ij log(\\hatc^p_i) - \\sum_i \\in Neg log(\\hatc^0_i) Where \\hatc^p_i = \\fracexp(c^p_i)\\sum_p exp(c^p_i) (2) Lconf(x,c)=iPosNxijplog(c^ip)iNeglog(c^i0)Wherec^ip=pexp(cip)exp(cip)(2)

其中i指代搜索框序号,j指代真实框序号,p指代类别序号,p=0表示背景。其中 x i j p = 1 , 0 x^p_ij=\\left\\1,0\\right\\ xijp=1,0 中取1表示第i个prior bbox匹配到第 j 个GT box,而这个GT box的类别为 p 。 C i p C^p_i Cip 表示第i个搜索框对应类别p的预测概率。此处有一点需要关注,公式前半部分是正样本(Pos)的损失,即分类为某个类别的损失(不包括背景),后半部分是负样本(Neg)的损失,也就是类别为背景的损失。

而location loss(位置回归)是典型的smooth L1 loss

L l o c ( x , l , g ) = ∑ i ∈ P o s m ∈ c x , c y , w , h N ∑ x i j k s m o o t h L 1 ( l i m − g ^ j m ) ( 3 ) L_loc(x,l,g) = \\sum_i \\in Pos m \\in \\left\\c_x,c_y,w,h\\right\\^N \\sum x^k_ij smooth_L1(l^m_i-\\hatg^m_j) (3) Lloc(x,l,g)=iPosmcx,cy,w,hNxijksmoothL1(limg^jm)(3)

g ^ j c x = ( g j c x − d i c x ) / d i w \\hatg^c_x_j=(g^c_x_j-d^c_x_i)/d^w_i g^jcx=(gjcxdicx)/diw

g ^ j c y = ( g j c y − d i c y ) / d i h \\hatg^c_y_j=(g^c_y_j-d^c_y_i)/d^h_i g^jcy=(gjcydicy)/dih

g ^ j w = l o g ( g j w d i w ) \\hatg^w_j=log(\\fracg^w_jd^w_i) g^jw=log(diwgjw)

g ^ j h = l o g ( g j h d i h ) \\ha

以上是关于动手学CV-目标检测入门教程5:损失函数的主要内容,如果未能解决你的问题,请参考以下文章

动手学CV-目标检测入门教程:基本概念

动手学CV-目标检测入门教程:基本概念

动手学CV-目标检测入门教程4:模型结构

动手学CV-目标检测入门教程4:模型结构

动手学CV-目标检测入门教程2:VOC数据集

动手学CV-目标检测入门教程2:VOC数据集