医学图像分割常用Loss

分割loss

1. CE Loss(交叉熵损失函数)

1. 二分类

在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为p1-p,此时表达式为(log的底数是 e
L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ⁡ ( p i ) + ( 1 − y i ) ⋅ log ⁡ ( 1 − p i ) ] L=\frac{1}{N} \sum_i L_i=\frac{1}{N} \sum_i-\left[y_i \cdot \log \left(p_i\right)+\left(1-y_i\right) \cdot \log \left(1-p_i\right)\right] L=N1iLi=N1i[yilog(pi)+(1yi)log(1pi)]
其中

  • y i y_i yi——表示样本 i i i 的label,正类为1,负类为0
  • p i p_i pi——表示样本 i i i 预测为正类的概率

2. 多分类

多分类的情况实际上就是对二类的拓展:
L = 1 N ∑ i L i = − 1 N ∑ i ∑ c = 1 M y i c log ⁡ ( p i c ) L=\frac{1}{N} \sum_i L_i=-\frac{1}{N} \sum_i \sum_{c=1}^M y_{i c} \log \left(p_{i c}\right) L=N1iLi=N1ic=1Myiclog(pic)
其中

  • M M M——类别的数量
  • y i c y_{ic} yic——符号函数(0或者1),如果样本 i i i 的真实类别等于 c c c 取 1,否则取 0
  • p i c p_{ic} pic——观测样本 i i i 属于类别 c c c 的预测概率

2. WCE Loss (权重交叉熵损失函数)

为了平衡分割(分类)问题中的正负样本不平衡的问题,提出了WCE,其公式如下:
W C E = − 1 N ∑ i = 1 N α y i log ⁡ p i + ( 1 − y i ) log ⁡ ( 1 − p i ) W C E=-\frac{1}{N} \sum_{i=1}^N \alpha y_i \log p_i+\left(1-y_i\right) \log \left(1-p_i\right) WCE=N1i=1Nαyilogpi+(1yi)log(1pi)
其中

  • α \alpha α——每个类别的权重, 一般根据目标像素所占比例的倒数来确定:
  • y i y_i yi——表示样本 i i i 的label,正类为1,负类为0
  • p i p_i pi——表示样本 i i i 预测为正类的概率

3. Focal Loss

Focal Loss的引入主要是为了解决**难易样本数量不平衡(注意,有区别于正负样本数量不平衡)**的问题,根据正、负、难、易一共可以分为以下4类:正难、正易、负难、负易
L = − 1 N ∑ i = 1 N α y i ( 1 − p i ) γ log ⁡ ( p i ) + ( 1 − α ) ( 1 − y i ) ( p i ) γ log ⁡ ( 1 − p i ) L=-\frac{1}{N} \sum_{i=1}^N \alpha y_i\left(1-p_i\right)^\gamma \log \left(p_i\right)+(1-\alpha)\left(1-y_i\right)\left(p_i\right)^\gamma \log \left(1-p_i\right) L=N1i=1Nαyi(1pi)γlog(pi)+(1α)(1yi)(pi)γlog(1pi)
其中

  • α \alpha α——每个类别的权重, 一般根据目标像素所占比例的倒数来确定,尽管平衡了正负样本,但对难易样本的不平衡没有任何帮助
  • y i y_i yi——表示样本 i i i 的label,正类为1,负类为0;
  • p i p_i pi——表示样本 i i i 预测为正类的概率;
  • γ \gamma γ ——修正因子,调节难学样本的loss,可以降低分类正确的样本对熵的贡献,增加分类矛盾甚至分类错的结果对熵的贡献。同样的负样本的也按此类推。平衡难易样本

4. Dice Loss

两个轮廓区域的相似程度,弥补交叉熵损失函数在分割任务中样本不均衡的问题
 DiceLoss  = 1 − 2 ∣ X ⋂ Y ∣ ∣ X ∣ + ∣ Y ∣ \text { DiceLoss }=1-\frac{2|X \bigcap Y|}{|X|+|Y|}  DiceLoss =1X+Y2∣XY
其中

  • ∣ X ∣ |X| X——ground truth
  • ∣ Y ∣ |Y| Y——predict_mask

5. GeneralizedDiceLoss

与原始的dice loss 相比,GDL 对多分类问题进行了扩展,可以同时优化多个类别的分割效果,对类别不均衡鲁棒性更好,公式如下:
G D L = 1 − 2 ∑ l = 1 2 w l ∑ n r l n p l n ∑ l = 1 2 w l ∑ n r l n + p l n \mathrm{GDL}=1-2 \frac{\sum_{l=1}^2 w_l \sum_n r_{l n} p_{l n}}{\sum_{l=1}^2 w_l \sum_n r_{l n}+p_{l n}} GDL=12l=12wlnrln+plnl=12wlnrlnpln

其中

  • w l w_l wl——为不同的类别提供不变性,每个类别之间的贡献将通过其体积的倒数进行校正。
  • r l n r_{l n} rln ——ground truth
  • p l n p_{l n} pln——predict_mask

6. GeneralizedWassersteinDiceLoss

是 Generalized Dice Loss (GDL) 的拓展,是一种更加稳定和高效的医学图像分割损失函数。Dice LossGeneralizedDice Loss对类不平衡问题更具鲁棒性。然而存在其他两个问题:至少有两个可用信息没有在这个公式中充分的被利用

(1)标签空间的结构

(2)跨尺度的空间信息

GeneralizedWassersteinDiceLoss引入了Wasserstein距离:**利用Wasserstein距离,它可以自然地嵌入类之间的语义关系,用于比较标签概率向量,以推广多类分割的Dice得分。实现更具语义意义的分割。**公式如下:

7. Tversky Loss

Tversky loss 是一种用于图像分割任务的损失函数,它是在 Dice loss 的基础上进行改进设计的。公式如下:
T ( α , β ) = ∑ i = 1 N p 0 i g 0 i ∑ i = 1 N p 0 i g 0 i + α ∑ i = 1 N p 0 i g 1 i + β ∑ i = 1 N p 1 i g 0 i T(\alpha, \beta)=\frac{\sum_{i=1}^N p_{0 i} g_{0 i}}{\sum_{i=1}^N p_{0 i} g_{0 i}+\alpha \sum_{i=1}^N p_{0 i} g_{1 i}+\beta \sum_{i=1}^N p_{1 i} g_{0 i}} T(α,β)=i=1Np0ig0i+αi=1Np0ig1i+βi=1Np1ig0ii=1Np0ig0i
其中

  • α \alpha α——假阳的权重,在 α + β = 1 \alpha + \beta = 1 α+β=1的情况下, α \alpha α 越大,产生结果中假阳越小
  • β \beta β——假阴的权重,在 α + β = 1 \alpha + \beta = 1 α+β=1的情况下, β \beta β 越大,产生结果中假阴越小

8. DiceCe Loss

L = α D i c e + β W C E L = {\alpha Dice} + {\beta WCE} L=αDice+βWCE

其中

  • α \alpha α——Dice Loss的权重
  • β \beta β——WCE Loss的权重

9. DiceFocal Loss

L = α D i c e + β F o c a l L = {\alpha Dice} + {\beta Focal} L=αDice+βFocal
其中

  • α \alpha α——Dice Loss的权重
  • β \beta β——Focal Loss的权重

10. GeneralizedDiceFocalLoss

L = α G D L + β F o c a l L = {\alpha GDL} + {\beta Focal} L=αGDL+βFocal

其中

  • α \alpha α——GeneralizedDiceLoss的权重
  • β \beta β——Focal Loss的权重

11. MSE Loss

MSE(Mean Squared Error) 即均方误差,是回归任务中常用的一个损失函数。公式如下:
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 MSE=n1i=1n(yiyi^)2
其中

  • n n n ——样本数量

  • y i y_i yi—— 样本i的真实目标值

  • y i ^ \hat{y_i} yi^—— 样本i的预测值

参考文献

飞鱼Talk——损失函数|交叉熵损失函数

AdamLau——医学影像处理常用loss笔记

中国移不动——5分钟理解Focal Loss

dilligencer——Tversky loss

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
医学图像分割在PyTorch中的实现可以基于一些常用的网络架构,如U-Net、DeepLab等。下面以U-Net为例,给出一个简单的医学图像分割的PyTorch代码: 首先,需要导入所需的库: ```python import torch import torch.nn as nn import torch.optim as optim ``` 定义U-Net网络结构: ```python class UNet(nn.Module): def __init__(self, n_channels, n_classes): super(UNet, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(n_channels, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) ) self.decoder = nn.Sequential( nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, n_classes, kernel_size=1), nn.Sigmoid() ) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x ``` 定义损失函数和优化器: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = UNet(n_channels, n_classes).to(device) criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 加载训练数据和标签数据,并进行数据预处理: ```python train_dataset = MyDataset(train_data, train_labels) # 自定义训练数据集类 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) val_dataset = MyDataset(val_data, val_labels) # 自定义验证数据集类 val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False) ``` 进行训练: ```python for epoch in range(num_epochs): model.train() for images, labels in train_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() model.eval() with torch.no_grad(): for images, labels in val_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) val_loss = criterion(outputs, labels) print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}, Val Loss: {val_loss.item()}") ``` 这是一个简单的医学图像分割的PyTorch代码,你可以根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值