目标检测学习笔记

标检测学习笔记(三、深入篇)

  • 5 损失函数
    • 5.1 匹配策略(Matching Strategy)
    • 5.2 损失函数
    • 3.3 难例挖掘(Hard Negative Mining)

本篇续上一篇,继续学习目标检测相关知识。笔记仅为巩固个人学习效果、督促自我进步用,若有读者发现不正确的地方请不吝指教。
参考链接: https://datawhalechina.github.io/dive-into-cv-pytorch/#/?id=dive-into-cv-pytorch

5 损失函数

5.1 匹配策略(Matching Strategy)

根据上节描述,我们生成了很多先验框(prior bboxes),并需要用这些先验框预测类别和目标框信息。因此,我们需要先知道每个先验框和哪个目标对应,从而才能判断预测是否准确。
不同方法的ground truth box与prior bboxes匹配策略大致类似,但细节不同,此处采用SSD中的匹配策略,描述如下:

1)第一原则:从ground truth boxes出发。寻找与每一个ground truth box有最大IoU的prior bbox,这样能保证每一个ground truth box一定有一个prior bbox与之对应。此时,若某一个prior bbox没有与任何ground truth box对应,那么该prior bbox将只能与背景匹配,为负样本。
按此原则匹配,由于一张图片中ground truth box远少于prior bbox数量,则很多prior bbox会是负样本,正负样本极其不平衡,此时有第二个原则。

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

注:第二个原则一定在第一个原则之后进行。如果某个ground truth box所对应最大IoU的prior bbox小于阈值,并且所匹配的prior bbox却与另外一个ground truth box的IoU大于阈值,那么该prior bbox应该匹配谁?答案是前者,首先确保每个ground truth box一定有一个prior bbox与之匹配。
目标检测学习笔记_第1张图片
图像中有7个红色的框代表先验框,黄色的是ground truths,在这幅图像中有三个真实的目标。按照前面列出的步骤将生成以下匹配项:
目标检测学习笔记_第2张图片

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 ) ) L(x,c,l,g)=\frac1N(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是匹配到GT(Ground Truth)的prior bbox数量,如果 N = 0 N=0 N=0,则将损失设为0;而 α \alpha α 参数用于调整 c o n f i d e n c e l o s s confidence loss confidenceloss l o c a t i o n l o s s location loss locationloss之间的比例,默认 α = 1 \alpha=1 α=1
c o n f i d e n c e l o s s confidenceloss confidenceloss是在多类别置信度 ( c ) (c) (c)上的 s o f t m a x l o s s softmax loss softmaxloss,公式如下:
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 ) L_{conf}(x,c)=-\sum_{i\in{Pos}}^Nx_{ij}^Plog(\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 x p ( c i P ) ∑ P e x p ( c i P ) \hat c_i^P=\frac{exp(c_i^P)}{\sum_Pexp(c_i^P)} c^iP=Pexp(ciP)exp(ciP)

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

l o c a t i o n l o s s location loss locationloss(位置回归)是典型的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 ) 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}-\hat{g}^{m}_{j}) Lloc(x,l,g)=iPosm{cx,cy,w,h}NxijksmoothL1(limg^jm)
w h e r e where where
{ g ^ j c x = ( g j c x − d i c x ) d i w g ^ j c y = ( g j c y − d i c y ) d i h g ^ j w = l o g ( g j w d i w ) g ^ j h = l o g ( g j h d i h ) \left\{ \begin{aligned} \hat{g}^{c_x}_{j} & = & \frac{(g^{c_x}_{j}-d^{c_x}_{i})}{d^{w}_{i}}\\ \hat{g}^{c_y}_{j} & =& \frac{(g^{c_y}_{j}-d^{c_y}_{i})}{d^{h}_{i}}\\ \hat{g}^{w}_{j} & = & log(\frac{g^{w}_{j}}{d^{w}_{i}})\\ \hat{g}^{h}_{j} & = & log(\frac{g^{h}_{j}}{d^{h}_{i}}) \end{aligned} \right. g^jcxg^jcyg^jwg^jh====diw(gjcxdicx)dih(gjcydicy)log(diwgjw)log(dihgjh)

其中, l l l为预测框, g g g为ground truth。 ( c x , x y ) (c_x,x_y) (cx,xy)为补偿(regress to offsets)后的默认框d的中心, ( w , h ) (w,h) (w,h)为默认框的宽和高。更详细的解释看-看下图:
目标检测学习笔记_第3张图片

3.3 难例挖掘(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计算。

你可能感兴趣的:(pytorch,计算机视觉)