SE, SP, PC, F1, JS, DC医学图像分割训练的时候全为0?医学图像分割的评价指标

本文讨论了在使用深度学习模型进行图像分割时遇到的评价指标为0的问题。作者详细分析了问题原因,包括数据集非严格二值化、标签处理方式以及代码中的逻辑错误。通过调整代码,特别是修正了比较逻辑,解决了TP、FN等计数始终为0的错误,从而能够正确计算精确率、召回率等指标。


出现的问题

验证是一个深度图像分割模型是一个基本的任务,它评价了模型的好坏,以便于更好改进。
自己模型训练时候评价指标出现的问题,使用别人的代码https://github.com/LeeJunHyun/Image_Segmentation,改成自己的数据集之后错误频出,终于能开始训练,SE, SP, PC, F1, JS, DC这些指标全为0。整了1天。
还有一种可能,可能训练失败,Loss为NAN,然后其他指标也是0。我用的Focal Loss,把初始学习率调小一点。

解决方法

最新发现自己的数据集不是严格的二值,但是像素集中在0和255,为什么用他的evaluation不行,待研究。就是用我修改后的代码是可以的。

import cv2
import numpy as np
import matplotlib.pyplot as plt
path = '../tg3k/thyroid-mask/'
img = cv2.imread(path+'0001.jpg',-1)  
hist = cv2.calcHist([img], [0], None, [256], [0, 256])

在这里插入图片描述

最后发现自己的mask是灰度图,不是二值图像。转变成tensor,进行二值化即可。不必修改原作者的代码。😂

分割线————————————————————————————————————————

刚开始的时候,在考虑是不是模型崩塌了,输出的全是黑的,所以这些值全为0。看着Loss一点一点减少,acc增加,以及准确率明显大于只输出为黑色mask的情况,排除这个可能。
第二个我试了试GT,输出出来它是单通道,但是评价指标里面GT变成bool量,我觉得是二值化,他是用的 GT == torch.max(GT)。我测试一下,在我的数据集上输出来全是0。可能这个模型的标签是二值图像可以这样,我的图片还需要自己二值化。然后我就把它二值化了。

GT =GT/torch.max(GT) > threshold

训练了一次还是全为0????
我看着代码没问题。后来我输出TN,TP,FN,FP,发现他们也是全为0。这就奇怪了。
最后,我发现问题出现在这个代码上。

TP = ((SR==1)+(GT==1))==2

我在jupyter notebook里面跑了一下,发现这个不管SR和GT是什么它跑出来全是False。我才发现就是SR,GT相加也是bool值0-1,不会出现2。就只能用逻辑运算替换了。或者把这个bool量转换成float或者其他类型(我没试过)。我用的逻辑运算替换。

import torch


# SR : Segmentation Result
# GT : Ground Truth

def get_accuracy(SR, GT, threshold=0.5):
    SR = SR > threshold
    GT = GT / torch.max(GT) > threshold
    corr = (SR == GT).sum().item()
    tensor_size = SR.size(0) * SR.size(1)* SR.size(2) * SR.size(3)
    acc = float(corr) / float(tensor_size)

    return acc


def get_sensitivity(SR, GT, threshold=0.5):
    # Sensitivity == Recall
    SR = SR > threshold
    GT = GT / torch.max(GT) > threshold

    # TP : True Positive
    # FN : False Negative
    TP = ((SR == 1) & (GT == 1)).sum().item()
    FN = ((SR == 0) & (GT == 1)).sum().item()
    FP = ((SR == 1) & (GT == 0)).sum().item()
    TN = ((SR == 0) & (GT == 0)).sum().item()
    # TN = ((SR==0)*(GT==0))
    # FP = ((SR==1)*(GT==0))
    SE = float(TP) / (float(TP + FN)+ 1e-6)
    # print('TP:'+str(TP))
    # print('FN:' + str(FN))
    # print('FP:' + str(FP))
    # print('TN:' + str(TN))
    
### 医学图像分割评估指标 Sm 和 Em #### 定义与背景 在医学图像分割领域,为了衡量分割结果的质量,多种定量评价指标被广泛应用。其中敏感度(Sensitivity, Sn)和特异性(Specificity, Sp)是非常重要的两个基本概念。然而,在某些情况下,研究者们会采用其他衍生出来的综合性能指标来进行更面的评估。 对于特定提到的 **结构相似性指数 (Structural Similarity Index Measure, SM)** 和 **能量图谱匹配程度 (Energy Map Matching Degree, EM)** ,这两个术语并不常见于标准文献中关于医学图像分割质量评估的标准命名方式。但是可以推测: - 结构相似性指数(SM) 可能是指 Structural Similarity index measure (SSIM),这是一种广泛应用于图像处理领域的参考型图像质量评估模型,它不仅考虑亮度、对比度的变化还考虑到两幅图片之间的结构信息差异[^3]。 - 能量图谱匹配程度(EM) 则可能指代一种基于能量函数优化框架下的目标函数收敛情况或是与其他先验知识相结合所构建的能量场之间的一致性测量方法[^4]。 #### 计算方法 ##### 结构相似性指数 (SM) 假设原始标签图为 \(I\),预测分割图为 \(J\),则 SSIM 的计算公式如下所示: \[ \text{SSIM}(x,y) = \frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy}+C_2)} {(\mu_x^2+\mu_y^2+C_1)(\sigma_x^2+\sigma_y^2+C_2)} \] 这里, - \(x\) 表示窗口内原图像素值; - \(y\) 表示对应位置上另一张图(如分割后的二值化掩模)的像素值; - \(\mu_x,\mu_y\) 是均值; - \(\sigma_x^2 ,\sigma_y^2\) 是方差; - \(\sigma_{xy}\) 是协方差; - \(C_1=(K_1L)^2,C_2=(K_2L)^2\) 为常数项用来稳定除零操作,\(L\) 是动态范围,\(K_1,K_2\) 很小的正数。 ```python from skimage.metrics import structural_similarity as ssim def calculate_ssim(original_image, segmented_image): score, _ = ssim(original_image, segmented_image, full=True) return score ``` ##### 能量图谱匹配程度 (EM) 由于 "EM" 并不是一个通用定义明确的概念,因此具体的实现取决于具体应用场景以及如何定义“能量”。如果将其理解为某种形式的概率分布或代价矩阵,则可以通过比较实际输出与理想状态间的距离来量化这种一致性水平。例如,当涉及到分类任务时,“能量”可视为负对数似然;而在连续空间里,这可能是欧氏距离或其他几何测度。 ```python import numpy as np def energy_map_matching(true_distribution, predicted_distribution): # 假设输入的是概率分布向量 em_score = -np.sum(true_distribution * np.log(predicted_distribution)) return em_score ``` 需要注意的是以上解释是基于给定名称做出的最大合理猜测,并不代表普遍接受的确切定义。建议查阅最新的科研论文获取最权威的信息。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值