语义分割任务实际上是一种像素层面上的分类,需要识别图像中存在的内容和位置,同样也存在与分类类似问题-样本类别不平衡,对于语义分割更多的是前景区域的样本远小于背景区域。针对类别不平衡问题,在loss层面上有不同的选择。
1. dice Loss
dice loss 源于dice系数,是用于度量集合相似度的度量函数,通常用于计算两个样本之间的相似度,公式如下:
那么对应的dice loss的公式如下:
为了防止分母预测为0,会在分子和分母上加上一个平滑系数,公式如下。需要注意的是,一般预测值会经过sigmoid或softmax计算概率,是不存在输出为0的情况,但为了防止输出值过小的情况。
根据dice loss的定义可以看出,dice loss是一种区域相关的loss,也即意味着某像素点的loss以及梯度值不仅和该点的label和预测值相关,也与其他点的label及预测值相关。dice loss可用于样本极度不均衡的情况,而在一般情况下使用dice loss会对反向传播有不利的影响,使得训练不稳定。
关于交叉熵和dice的梯度:
假设使用来表示预测值,而
来表示真实标签值,那么交叉熵损失关于
的梯度形式为
,而dice loss的值为
,得到关于
的梯度形式为
,在极端情况下即
和
都很小时,计算得到的梯度值可能会非常大,导致训练十分不稳定。
2. IOU Loss
与dice loss类似,IoU loss也是一个区域相关的损失函数,其计算公式如下:
与dice loss一样存在训练过程不稳定的问题,且一般在分割任务中不怎么使用。
交叉熵损失函数的优点:其梯度形式更优。
Dice或IoU损失函数的优点:分割任务的优化目标是最大化dice系数和IoU度量,而交叉熵仅仅是一种代理形式。
3. 交叉熵
语义分割任务中最常用的损失函数是交叉熵,通过逐个对比每个像素得到损失值。
每个像素对应的损失函数为:
其中为一个one-hot向量,取值只有[0, 1],
为网络预测值经过softmax或sigmoid函数之后的概率值。
整个图像的损失就是每个像素的损失求平均。
交叉熵损失函数适用于大多数语义分割场景中,但是当前景像素的数量远小于背景像素的数量时,
此时背景的损失占主导地位,导致网络性能不佳。
4. 带权值的交叉熵
针对类别不平衡的问题,通过给每个类别添加一个权重系数来缓解。加上权重之后的公式如下:
其中权重系数的计算公式为:
,
表示总的像素个数,而
表示GT类别为
的像素个数。
5. Focal Loss
Focal loss用来解决难易样本,数量不平衡问题,在anchor-based目标检测算法中,设置的默认候选框的个数远大于图中目标的个数,此时anchor的正负样本数量极度不平衡。对于交叉熵损失函数:
为了解决正负样本数量不平衡问题,可以通过在损失值前面添加一个权重系数,来增强正样本的影响,默认的
.
由于大量的候选目标都是容易分类样本,即的取值一般很高,虽然得到的损失值很小,但是由于样本数量差距过大,使得容易分类样本的损失值堆叠占据了损失的主导地位。
为此,模型应该主要关注那些难以分类的样本,一个简单的想法是降低高置信度样本的损失影响。
最终,通过添加两个系数,同时解决了正负样本不均衡和难易样本问题。