语义分割的损失函数

        语义分割任务实际上是一种像素层面上的分类,需要识别图像中存在的内容和位置,同样也存在与分类类似问题-样本类别不平衡,对于语义分割更多的是前景区域的样本远小于背景区域。针对类别不平衡问题,在loss层面上有不同的选择。

1. dice Loss

dice loss 源于dice系数,是用于度量集合相似度的度量函数,通常用于计算两个样本之间的相似度,公式如下:

语义分割的损失函数_第1张图片

 那么对应的dice loss的公式如下:

语义分割的损失函数_第2张图片

 为了防止分母预测为0,会在分子和分母上加上一个平滑系数,公式如下。需要注意的是,一般预测值会经过sigmoid或softmax计算概率,是不存在输出为0的情况,但为了防止输出值过小的情况。

语义分割的损失函数_第3张图片

 根据dice loss的定义可以看出,dice loss是一种区域相关的loss,也即意味着某像素点的loss以及梯度值不仅和该点的label和预测值相关,也与其他点的label及预测值相关。dice loss可用于样本极度不均衡的情况,而在一般情况下使用dice loss会对反向传播有不利的影响,使得训练不稳定。

关于交叉熵和dice的梯度:

假设使用p来表示预测值,而t来表示真实标签值,那么交叉熵损失关于p的梯度形式为p-t,而dice loss的值为1-\frac{2pt}{p+t},得到关于p的梯度形式为\frac{2t(t^{2}-p^{2})}{(p^{2}+t^{2})^{2}},在极端情况下即pt都很小时,计算得到的梯度值可能会非常大,导致训练十分不稳定。

2. IOU Loss

与dice loss类似,IoU loss也是一个区域相关的损失函数,其计算公式如下:

语义分割的损失函数_第4张图片

 与dice loss一样存在训练过程不稳定的问题,且一般在分割任务中不怎么使用。

交叉熵损失函数的优点:其梯度形式更优。

DiceIoU损失函数的优点:分割任务的优化目标是最大化dice系数和IoU度量,而交叉熵仅仅是一种代理形式。

3. 交叉熵

语义分割任务中最常用的损失函数是交叉熵,通过逐个对比每个像素得到损失值。

每个像素对应的损失函数为:

pixel -loss = - \sum_{classes}^{}(y_{c}log(p_{c})))

其中y_{c}为一个one-hot向量,取值只有[0, 1],p_{c}为网络预测值经过softmax或sigmoid函数之后的概率值。

整个图像的损失就是每个像素的损失求平均。

交叉熵损失函数适用于大多数语义分割场景中,但是当前景像素的数量远小于背景像素的数量时,

此时背景的损失占主导地位,导致网络性能不佳。

4. 带权值的交叉熵

针对类别不平衡的问题,通过给每个类别添加一个权重系数来缓解。加上权重之后的公式如下:

pixel-loss = -\sum_{c}^{classes}(w_{c}y_{c}log(p_{c})))

 其中权重系数w_{c}的计算公式为:w_{c}= \frac{N-N_{c}}{N}N表示总的像素个数,而N_{c}表示GT类别为c的像素个数。

5. Focal Loss

Focal loss用来解决难易样本,数量不平衡问题,在anchor-based目标检测算法中,设置的默认候选框的个数远大于图中目标的个数,此时anchor的正负样本数量极度不平衡。对于交叉熵损失函数:

 为了解决正负样本数量不平衡问题,可以通过在损失值前面添加一个权重系数\partial > 0.5,来增强正样本的影响,默认的\partial =0.75.

 由于大量的候选目标都是容易分类样本,即p的取值一般很高,虽然得到的损失值很小,但是由于样本数量差距过大,使得容易分类样本的损失值堆叠占据了损失的主导地位。

为此,模型应该主要关注那些难以分类的样本,一个简单的想法是降低高置信度样本的损失影响。

 最终,通过添加两个系数,同时解决了正负样本不均衡和难易样本问题。

6. 参考链接

语义分割之dice loss深度分析(梯度可视化) - 知乎 (zhihu.com)

【损失函数合集】超详细的语义分割中的Loss大盘点 - 知乎 (zhihu.com)

你可能感兴趣的:(计算机视觉,语义分割,损失函数)