目标检测中分类loss的计算

突然有一天发现自己连loss怎么算的都没搞透彻,只知道是交叉熵损失,要么Focal loss,可是具体计算的时候有有点问题,因为目标检测会分正/负样本,而正负样本里其实都包含每个类别的置信度,相当于二级分类?那这个损失该怎么计算呢?


(1)Faster rcnn 的roi_cls_loss

就是第二阶段多分类时候的loss计算
根据作者自己的博客
目标检测中分类loss的计算
目标检测中分类loss的计算
如上图所示,0是背景类,也就是说正/负样本的计算公式都是一样的,把负样本的背景类当作一个普通的类别,和其他类别一起无差别参与计算。
怎么表示正/负样本
就是ground truth为0的就是负样本,为其他的就是正样本
计算公式
就是第二张图的计算公式,每个sample算loss计算平均。问题是log里的数好像跟交叉熵损失不太一样?
交叉熵损失:
目标检测中分类loss的计算
图中的n代表sample数,这里其实是没有做平均的。p(x_i)是gt的置信度,就是1,q(x_i)是gt对应的类别的预测置信度
而上图中却成了两个指数的形式,其实是softmax计算置信度的过程,第一张图中的x是最后输出未经过softmax的结果

(2)RetinaNet 的 Focal loss

这个跟上面faster rcnn的不太一样,不是把负样本直接算作背景类和正样本一起计算的,而是做了一个标志位表示正/负/忽略样本,是确实的二级分类。那么这又是怎么计算的呢,等我研究一下代码了再来写