图像分割常见Loss

最近在研究图像分割,由于自己之前没学习过,只能好好鼓捣,好久没写了。忙完分割项目总结一下。

1、基于分类损失
①:binary cross entropy
二分类的交叉熵损失函数

当类别数M等于2的时候,这个损失就是二元交叉熵Loss。
交叉熵Loss可以用在大多数语义分割场景中,但它有个缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,即y=0的数量远大于y=1的数量,损失函数中y=0的成分就会占据主导,使得模型严重偏向背景,导致效果不好。
#二值交叉熵,这里输入要经过sigmoid处理

import torch
import torch.nn as nn
import torch.nn.functional as F
nn.BCELoss(F.sigmoid(input), target)

#多分类交叉熵, 用这个 loss 前面不需要加 Softmax 层
nn.CrossEntropyLoss(input, target)

②:Weighted cross Entropy
WCE是对BCE的改进,用于缓解类别不平衡的问题

③:Focal loss
用来解决难以样本数量不平衡。

class FocalLoss(nn.Module):def __init__(self, gamma=0, alpha=None, size_average=True):super(FocalLoss, self).__init__()self.gamma = gammaself.alpha = alphaif isinstance(alpha,(float,int,long)): self.alpha = torch.Tensor([alpha,1-alpha])if isinstance(alpha,list): self.alpha = torch.Tensor(alpha)self.size_average = size_averagedef forward(self, input, target):if input.dim()>2:input = input.view(input.size(0),input.size(1),-1)  # N,C,H,W => N,C,H*Winput = input.transpose(1,2)    # N,C,H*W => N,H*W,Cinput = input.contiguous().view(-1,input.size(2))   # N,H*W,C => N*H*W,Ctarget = target.view(-1,1)logpt = F.log_softmax(input)logpt = logpt.gather(1,target)logpt = logpt.view(-1)pt = Variable(logpt.data.exp())if self.alpha is not None:if self.alpha.type()!=input.data.type():self.alpha = self.alpha.type_as(input.data)at = self.alpha.gather(0,target.data.view(-1))logpt = logpt * Variable(at)loss = -1 * (1-pt)**self.gamma * logptif self.size_average: return loss.mean()else: return loss.sum()

2、基于评价函数
上面的损失函数都可以看做是对像素进行分类的损失函数,而在图像分割中经常使用IOU对分割效果进行评价,只要损失函数是可导的,可以进行反向传播,那这个损失函数就可以对模型进行优化。下面几个损失函数都是以IOU来设计的Loss。
①:Dice Loss
DIce Loss:公式定义为:

Dice Loss使用与样本极度不均衡的情况,如果一般情况下使用Dice Loss会会反向传播有不理影响,使得训练不稳定。

import torch.nn as nn
import torch.nn.functional as F
class SoftDiceLoss(nn.Module):def __init__(self, weight=None, size_average=True):super(SoftDiceLoss, self).__init__()def forward(self, logits, targets):num = targets.size(0)// 为了防止除0的发生smooth = 1probs = F.sigmoid(logits)m1 = probs.view(num, -1)m2 = targets.view(num, -1)intersection = (m1 * m2)score = 2. * (intersection.sum(1) + smooth) / (m1.sum(1) + m2.sum(1) + smooth)score = 1 - score.sum() / numreturn score

②:Generalized Dice Loss
Dice Loss对小目标的预测是十分不利的,因为一旦小目标有部分像素预测错误,就可能会引起Dice系数大幅度波动,导致梯度变化大训练不稳定。Dice Loss针对的是某一个特定类别的分割的损失。当类似于病灶分割有多个场景的时候一般都会使用多个Dice loss,故Generalized Dice loss就是将多个类别的Dice Loss进行整个,使用一个指标作为分割结果的量化标准。GDL Loss在类别数为2时公式如下:

其中rln表示类别l在第n个位置的真实像素类别,而pln表示相应的预测概率值,wl表示每个类别的权重,wl的公式为:

③:BCE + Dice Loss
即将BCE Loss和Dice Loss 进行组合,在数据较为均衡的情况下有所改善,但是在数据极度不均衡的情况下交叉熵Loss会在迭代几个Epoch远远小于Dice Loss,这个组合Loss 会退化为Dice Loss

④:Focal Loss + Dice Loss

⑤:Lovasz-Softmax Loss

且行且珍惜…

图像分割常见Loss相关推荐

  1. [人工智能-深度学习-14]:神经网络基础 - 常见loss损失函数之逻辑分类,对数函数,交叉熵函数

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  2. 【深度学习】V-Net 3D医学图像分割 Dice loss 损失

    论文:https://arxiv.org/abs/1606.04797 论文 本文引入Dice coefficient 去处理医学3D图像里面 前景和背景体素数量严重不平衡的情况. 网络用于处理3D图 ...

  3. [人工智能-深度学习-9]:神经网络基础 - 常见loss损失函数之均分误差MSE、绝对值误差MAE、平滑平均绝对误差Huber

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  4. [医学图像分割综述] Medical Image Segmentation Using Deep Learning: A Survey

    使用深度学习的医学图像分割:一项调查 论文地址 本综述有两个独创之处,首先,与传统的调查方法直接将医学图像分割的文献划分为多个组,并对每个组详细介绍文献的方法相比,我们将目前流行的文献按照从粗到细的多 ...

  5. 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大lossz 本节说caffe中常见loss的推导,具体包含下面的cpp. ...

  6. [caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss

    本节说caffe中常见loss的推导,具体包含下面的cpp. multinomial_logistic_loss_layer.cpp 01 multinomial_logistic_loss_laye ...

  7. nnUNet原创团队全新力作!MedNeXt:医学图像分割新SOTA

    Title:MedNeXt: Transformer-driven Scaling of ConvNets for Medical Image Segmentation MedNeXt:用于医学图像分 ...

  8. Python-各种Loss总结

    目录 1.简介 2.常见loss nn.L1Loss nn.SmoothL1Loss nn.MSELoss(均方损失)

  9. 【损失函数合集】超详细的语义分割中的Loss大盘点

    前言 前两天介绍了一下Contrastive Loss,Triplet Loss以及Center Loss.今天正好是周六,时间充分一点我就来大概盘点一下语义分割的常见Loss,希望能为大家训练语义分 ...

最新文章

  1. 2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷,73人天团,正式出道!
  2. 连信的会话加密密钥协商过程
  3. 计算机网络数据链路层 --- 选择重传协议(SR)
  4. axure form列表_常见的列表页如何用Axure画出来
  5. 深度学习(三十九)LSTM、GRU网络入门学习-未完待续
  6. EXTASPNET C# ASP.NET sql server 调用存储过程超时,解决方法
  7. C++ 输入和输出IO
  8. jni java c 变量对应_GitHub - jkangzhang/JNIDemo: JNI中Java和C的数据传递
  9. linux重定向权限不够,linux – 如何使用sudo将输出重定向到一个我没有权限写入的位置?...
  10. marmalade android 5.0 JNI 调用失败的解决方案
  11. PyTorch学习—1.深入浅出PyTorch(如何学习PyTorch)
  12. c语言必背数组函数100代码,C语言必背的典型程序设计题目 数组、函数参考答案.pdf...
  13. 电源篇 -- 升压电路 Boost
  14. 2020苏州大学计算机考研经验总结博
  15. Gateway之过滤器
  16. 游戏制作人谈10大开发经验
  17. Java 构造函数的详解
  18. Mac版word空格变成小点,多了很多“分节符(下一页)”和“窗体顶端”和“窗体底端”等字样,怎么解决?
  19. 我的世界服务器npc怎么修改,我的世界NPCmod教程如何设置任务NPC
  20. 两篇科普文章【开创文章】

热门文章

  1. [转]真核生物预测软件
  2. 【算法】并查集的运用
  3. 藏书馆APP产品分析报告
  4. route 命令的使用
  5. java 横向 打印出来_在双工模式下使用Java打印横向文档
  6. 【LINUX】Linux之Ubuntu系统安装搜狗输入法
  7. 行业新生态,从区块链系统开发开始
  8. 台式计算机摄像头怎么打开,电脑外接摄像头怎么打开怎么用
  9. sqlserver官方网站地址
  10. 【大学生软件测试基础】三角形类型 - 白盒测试 - 语句覆盖 -02