# IDC医学病理图像识别 **Repository Path**: upper-computer_1688/computer-network ## Basic Information - **Project Name**: IDC医学病理图像识别 - **Description**: 用卷积神经网络代替病理专家和医护人员,识别出病理图像中所有带恶性病灶的区域。若存在恶性病灶,可快速精准判断出病灶大小及扩散程度,帮助患者确定肿瘤的侵略性分级。 使用的数据是真实的复现浸润性导管癌(IDC)病理检查图像,由搭载标本的整体载玻片按40倍放大扫描而来,图像的数据集样本量在27w,像素大约在200w~400w之间。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 11 - **Created**: 2025-02-08 - **Last Updated**: 2025-02-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目说明 ## 简介 本次项目中完成病理图像识别诊断,用卷积神经网络代替病理专家和医护人员识别出病理图像中所有带恶性病灶的区域。 若存在恶性病灶,快速精准判断出病灶大小及扩散程度,帮助患者确定肿瘤的侵略性分级。 ## 项目背景 **病理检查是当代最为可靠的肿瘤性质确诊方式,其结果就是临床的最后诊断**,**病理图像就是病变组织在光学显微镜下所呈现的形态图像**,病理学家需要观察该图像判定肿瘤的性质(良性/恶性,如果恶性具体是什么病变亚型),同时也需要判定肿瘤的侵略性分级(早期/中期/晚期)。然而,为执行病理检查,患者需要在疑似肿瘤的组织上提取部分细胞或器官。若肿瘤为恶性,此行为相当于在癌变组织上创造一个伤口,携带癌细胞的血液会外溢并扩散至全身,极大程度地提升癌症转移可能性、降低患者生存概率。 因此,能够迅速、准确地做出病理诊断,对癌症患者具有极大的意义。 ![](imgs/01.png) **使用卷积神经网络代替病理专家和医护人员,识别出病理图像中所有带恶性病灶的区域**。如上图所示,左侧是带有恶性病灶的原始图像,右侧则是通过深度学习完成的像素级识别。在原始图像中,病理专家人为绘制了绿色线作为标签,绿色线内部的像素则被标记为恶性病灶(标记为1),绿色线外部的像素则被标记为非恶性病灶(标记为0)。 深度学习的工作是利用卷积神经网络精准判断出带有恶性病灶的**像素块**,以判断病理图像中是否含有恶性病灶,若存在恶性病灶,也可快速精准判断出病灶大小及扩散程度,帮助患者确定肿瘤的侵略性分级。 所使用的数据是美国国家生物技术信息中心(NCBI)所提供真实的复现浸润性导管癌(IDC)病理检查图像,由搭载标本的整体载玻片按40倍放大扫描而来,图像的像素大约在200w~400w之间(图片大小为**1200\*1920**以上)。该数据的完整版本首次出现于哥伦比亚大学的论文《使用卷积神经网络自动检测病理图像中的浸润性导管癌》,**使用卷积神经网络代替病理专家和医护人员,识别出病理图像中所有带恶性病灶的区域**。在原始图像中,病理专家人为绘制了绿色线作为标签,绿色线内部的像素则被标记为恶性病灶(标记为1),绿色线外部的像素则被标记为非恶性病灶(标记为0)。 深度学习的工作,就是利用卷积神经网络精准判断出带有恶性病灶的像素块,以判断病理图像中是否含有恶性病灶,若存在恶性病灶,也可快速精准判断出病灶大小及扩散程度,帮助患者确定肿瘤的侵略性分级。Kaggle联合美国国家医学图书馆共同整理、披露了**部分患者**数据,专供深度学习研究者使用。 为实现**像素级**识别,研究团队在论文当中将所有图像切分成了50x50的方片数据(patch)。每个文件夹内部即是标签为0和为1的文件夹,其中标签0表示非恶性病灶,标签1表示恶性病灶。 【注】像素级说明,本次数据集中患者基本都带病灶肿瘤图像,不是判断患者是否患癌,而是要把组织图像切分成patch,判断每个小块中是否存在恶性病灶以及它的大小。 ## 最终目标 在本次项目中,**目标是超越论文《使用卷积神经网络自动检测病理图像中的浸润性导管癌》中呈现的结果**。在论文当中,哥伦比亚大学使用了F1分数与平衡后的准确率(Balanced Accuracy,简写为BAC)。 - 将论文中提供的最好结果作为benchmark | | 精确度
Pr | 召回率/敏感度
Rc/Sen | 特异度
Spc | F1分数 | BAC | | :----: | :----------: | :---------------------: | :-----------: | :----: | :----: | | ColUni | 0.6540 | 0.7960 | 0.8886 | 0.7180 | 0.8423 | 其中,两个核心评估指标的计算公式为: $$ F1 = \frac{2* Pr * Rc}{Pr + Rc} \\ BAC = \frac{Sen + Spc}{2} $$ - **特异度**(Specificity,也称为真阴性率)是指实际为阴性的样本中,判断为阴性的比例(例如真正未生病的人中,被医院判断为未生病者的比例),计算方式是真阴性除以真阴性+假阳性(实际为阴性,但判断为阳性)的比值 通常是向着某个损失最小化的方向训练卷积神经网络,因此PyTorch中默认提供的迭代目标基本都是损失函数。为保持与论文中评估指标一致,可以自定义损失及评估指标。 ## 基于OpenCV批量分片高像素影像 为了更加精确的诊断和治疗,医疗影像往往是大像素(1920x1080)或超大像素图像(4k图像4096x2160)。这类图像的尺寸与深度学习实验数据常见尺寸(227x227,或32x32)有巨大的差别,不仅对网络的深度要求更高,所需的算力、内存、运算时间等成本也会更高。 因此,在处理医疗图像或遥感图像这样的高像素图像时,往往都需要将其批量处理成小像素方片,并针对每一个方片进行识别或预测。 编写了批量读取文件图片的方法`load_images_from_folder(folder)`与对图像进行批量分片的方法`extract_images_from_folder(folder)`,确保对**同一个文件夹下所有分级下目录的图像进行读取**。 详细代码见` 01_医学影像识别_数据探索.ipynb ` ## 数据探索与可视化 - **探索数据量/数据结构**,包括图像的尺寸、数量、通道数以确认所需的**算力、架构深度以及验证策略** - **可视化图像**,确认图像中的具体内容,以确定所需要使用的**预处理方法** - **标签分布探索**,探索类别数量、样本均衡情况,以确定迭代用的**损失函数**,以及**是否进行均衡处理** 对于被分片的病理图像需要: - **查看完整数据的尺寸**,以判断切除的病灶大小,**切除病灶越小,说明患者的生存率越大** - **可视化完整数据**,对病理数据来说,特别的需要确定恶性病灶的占比 详细代码见` 01_医学影像识别_数据探索.ipynb ` ## 数据导入 利用sklearn中`train_test_split`方法进行数据集切分。 编写了读取自定义数据集的类` CustomDataset`,借助整理好的dataframe读取IDC医疗病理图像数据集的标签和图像格式。 详细代码见`02_医学影像识别_数据增强.ipynb` ## 病理图像数据增强的两个方向 在计算机视觉领域,**不同类型的图像需要使用不同的预处理/增强方式,这主要是因为不同图像成像过程存在的干扰因素是大不相同的**。医疗数据当中,病理图像、超声图像和核磁图像需要完全不同的处理方式。 通常来说,对一类图像最有效的数据增强方法必须经过实验得出。 病理图像是搭载标本的整体载玻片扫描而得,载玻片上的组织需要经过染色后才能够放到显微镜下进行观察。最经济实惠的染色方法是H&E染色,其中H是苏木素(haematoxylin,可以将细胞核染色),E是伊红(eosin,可以将细胞液染色),因此病理图像、组织图像往往呈现红色。在进行基础数据探索时发现,**恶性病灶的颜色往往比良性病灶颜色更深**,在病理图像识别应用中面临的一大挑战是:**如何排除不同实验室、不同专业人员、不同批次染色剂、不同扫描仪器、不同玻片原材料、不同组织对颜色的响应程度等等因素而引起的颜色差异,而实现正确的识别**。 在应用时主要从以下两个方向来提升病理模型的泛化能力: - **提升样本的多样性**(increase diversity):由于病理图像存在染色差异,因此模型可能需要面对色彩高度多样化的测试样本,为了能够应对这些样本应该让训练集覆盖尽量多的色彩情况,即完成色彩增强(Color Augmentation)。这是最常用的方法,只涉及到对训练集进行变化,可以帮助模型对抗过拟合。 - **降低样本的多样性**(decrease diversity):无论训练集、测试集上的染色有多大差异,只要将整个数据集(包括测试集和验证集)的图像进行色彩标准化(Color Normalization),让所有的图像尽可能在色彩上一致,就可以极大程度降低这种差异带来的影响。这种方法需要对训练集和测试集同时进行修改,也可以帮助模型提升泛化能力。 传统色彩标准化研究经典方法 > - **色彩匹配(Color Matching)**:例如Reinhard标准化,定义颜色-对立空间(LAB空间,其中L代表亮度lightness,A代表从绿色到红色的分量,B代表从蓝色到黄色的分量),再定义一张目标图像,对所有图像进行标准化处理。

> - **染色分离(stain separation)**:先使用反卷积手段将数据集上的染色去除,再使用从目标图像中提取的染色特征向量对去除染色的图像进行卷积,最终生成基于目标图像重新染色的图像。 这些方法简单而有效,但缺点也十分明显:即必须规定一张目标图像。如果该目标图像与需要被标准化的测试数据或验证数据差异太大,那可能会导致标准化后的图像被破坏,比如,变成全黑、全白、轮廓损失等)。 现代色彩标准化研究 > 使用深度学习中的生成模型来降低样本多样性,最典型的就是使用各类生成对抗网络(GANs)来完成色彩标准化。 > GAN的损失函数是判别网络输出的概率与“真假”这一标签的二分类交叉熵。在训练过程中,生成网络的目标是生成尽量真实的数据,让判别网络难以判断,所以**生成网络的学习目标是让损失函数越来越大**,以此逼迫判别网络的判别能力越来越强; 相反,判别网络的目标是尽量判别出真伪,因此**判别网络的学习目标是让损失函数越来越小**,以此逼迫生成网络生成的数据越来越真。**两个网络共享损失函数,此消彼长,是真正的零和博弈**。 其中,生成网络可能是基于已有的数据来生成新数据,也可能是基于噪音、甚至随机数来生成新数据。这些新数据就是我们渴望从GAN模型中获取的最终输出,因此**GAN是使用有监督方法实现无监督输出的模型。** 即便GAN是现在色彩标准化领域的SOTA模型,但基于深度学习的标准化过程不是最优先的选择,过于复杂的数据增强流程会极大增加模型的训练成本,比起使用对抗网络进行数据增强,会优先尝试更加简单的预处理方法。 > **使用第三方库imgaug和skimage实现大部分提升多样性(色彩增强)的选项,并使用三方库HistomicsTK以及PyTorch中的DCGAN实现降低多样性(色彩标准化)**最终在建模时只会挑选其中的部分手段作为最终手段。 详细代码见`02_医学影像识别_数据增强.ipynb` 第三方库imgaug实操代码详见`基于imgaug与skimage实现色彩增强.ipynb` ## 引入生成对抗网络 - 生成对抗网络 GAN - 对抗损失与对抗网络的数据流 - 深度卷积生成对抗网络 DCGAN - 条件生成对抗网络 CGAN - 信息最大化对抗网络 InfoGAN - 线性自动编码器 Encoder-Decoder - 深度卷积自动编码器 DCED - 降噪自动编码器 Denoising Autoencoder - 稀疏自动编码器 Sparse Autoencoder - 变分自动编码器 VAE ## UNet图像分割 UNet复现 UNet改进方向 - 基于ResNet的迁移学习 - 加入注意力机制的UNet - 医学影像分割nnU-Net Attention UNet与Vanilla UNet区别 - 相同之处 - 左半部分下采样(contraction)学习特征图,右半部分上采样(expansion)还原图像分割 - contraction包含一系列卷积、池化操作,expansion包含一系列Upsample、卷积操作 - 上下采样中通level得到的特征图通过skip connection进行合并 - 不同之处 - UNet处理2D图像,vanilla UNet处理3D图像,conv2d改为conv3d - 每一个skip connection处额外增加一个Attention Gate(AG)机制 ## 代码框架 ```python Data - 原始数据raw - 预处理processed Dataset - data loader - dataset preprocess - data augmentation Model/Networks - UNet - DeeplabV3+ Loss - Basic Losses - Custom losses Metrics评估指标 - Evaluation metrics Logging版本日志管理 - unet_v1.log - deeplabv3+.log Checkpoint 与Logging一一对应 - unet_v1.checkpoint - deeplabv3+.checkpoint Script - Notebooks 分析、后处理 - Training scripts - Bash commands 训练脚本 Utils - Logging_utils - Checkpoint_utils - GPU_utils - Visualization_utils 可视化函数 ```