mmdetection2.6 自定义losses

首先介绍mdmetection的loss的计算pipeline,然后逐步介绍如何自定义loss function。主要的修改包括调整与加权两种。

一、 loss的计算pipeline

给定输入的预测结果与真实值目标,还有loss函数的权重,loss函数将输入tensor映射为最终的loss张量,步骤如下:

  1. 按照loss函数的计算得到element-wise或者sample-wise的损失
  2. 利用一个权重tensor按照element-wise的方式加权损失函数
  3. 将loss的tensor降维为一个标量
  4. 加权这个标量损失

二、 调整损失

这种方式主要与上述的1,3,4步骤相关。大多数修改都在config文件中进行,以focal loss为例。

# focal loss 的代码定义
@LOSSES.register_module()
class FocalLoss(nn.Module):

    def __init__(self,
                 use_sigmoid=True,
                 gamma=2.0,
                 alpha=0.25,
                 reduction='mean',
                 loss_weight=1.0):
# config文件中focal loss函数的使用
loss_cls=dict(
    type='FocalLoss',
    use_sigmoid=True,
    gamma=2.0,
    alpha=0.25,
    loss_weight=1.0)

2.1 调整超参数

在focal loss 中gamma与beta是一种超参数。可以在config文件中直接修改

loss_cls=dict(
    type='FocalLoss',
    use_sigmoid=True,
    gamma=1.5,
    alpha=0.5,
    loss_weight=1.0)

2.2 调整reduction的方式

可选的有summean,可以直接在config文件中修改

loss_cls=dict(
    type='FocalLoss',
    use_sigmoid=True,
    gamma=2.0,
    alpha=0.25,
    loss_weight=1.0,
    reduction='sum')

2.3 调整loss的权重

这个权重是一个标量,多任务中控制不同人物的loss函数的权重表示。

loss_cls=dict(
    type='FocalLoss',
    use_sigmoid=True,
    gamma=2.0,
    alpha=0.25,
    loss_weight=0.5)

三、 加权loss

加权loss意味着按照element-wise的方式重新加权loss值,具体操作就是直接采用与loss唯独相同的权重tensor与loss tensor相乘。这样不同的位置的loss就会被不同程度的放缩。损失权重在不同模型之间有所不同,并且与上下文高度相关,但是总的来说,存在两种损失权重:label_weights分类损失和bbox_weightsbbox回归损失。您可以get_target在相应头的方法中找到它们。在这里我们以ATSSHead为例,它继承了AnchorHead,但是覆盖了它的get_targets方法,产生了label_weightsbbox_weights

class ATSSHead(AnchorHead):

    ...

    def get_targets(self,
                    anchor_list,
                    valid_flag_list,
                    gt_bboxes_list,
                    img_metas,
                    gt_bboxes_ignore_list=None,
                    gt_labels_list=None,
                    label_channels=1,
                    unmap_outputs=True):

专栏所有文章请点击下列文章列表查看:

知乎专栏:小哲AI专栏文章分类索引跳转查看

AI研习社专栏:小哲AI专栏文章分类索引