查看全课大纲(第 79 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

病理切片分析任务及数据集

小象实战讲义 · 基于深度学习的计算机视觉

在医学影像分析领域,除了我们之前学习的CT、MRI等三维影像分割,还有一个至关重要的方向——病理切片分析。它是肿瘤等疾病诊断的“金标准”。本节我们将走进这个微观世界,了解病理切片分析的任务、挑战,以及深度学习研究者们如何利用公开数据集(如Camelyon竞赛数据)来攻克这些难题。学完本节,你将理解病理分析的核心任务,并知道如何获取和初步处理这类特殊的超大规模图像数据。

💡 核心导读

  • 病理切片分析:包含定性(判断良恶性)和定量(计算有丝分裂数等指标)分析,是肿瘤确诊的关键。
  • 数据特点与挑战:图像为超大的TIF格式(可达10万倍于普通图片),标注信息以XML形式存储,分析难点在于细胞的模糊、重叠和形态异质性。
  • 公开数据集:以Camelyon16/17竞赛数据集为代表,提供了苏木精-伊红(H&E)染色的全切片图像及XML格式标注。
  • 传统与深度学习方案:传统方法依赖手工提取形态、纹理等特征;深度学习方法则能端到端地学习这些复杂特征。

什么是病理切片分析?

病理切片分析,简而言之,是医生在显微镜下观察经过特殊处理的病变组织切片,从而对疾病(尤其是肿瘤)做出诊断的过程。这个过程可以分为两个层面:

  1. 定性分析:对切片呈现出的性质特点进行概括性判断。例如:

    • 判断细胞的良性与恶性。
    • 观察腺体的形态是否正常。
  2. 定量分析:依据可视化的细胞和组织数据,建立数学模型,计算出与病变相关的各项量化指标。例如:

    • 计算单位面积内的有丝分裂数目(细胞增殖活跃度的指标)。
    • 计算肿瘤实质(癌细胞团)与间质(周围支持组织)的比例。
    • 根据这些定量指标,最终给出更为客观的病理诊断报告。

对于肿瘤患者而言,病理诊断是最可靠的确诊方式。它不像血液指标或影像学检查那样是间接证据,而是通过手术获取病变组织,制成切片并在显微镜下直接观察细胞的“真面目”。正如一句业内俗语所说:“良性的细胞都一样,恶性的细胞各有各的样”。恶性细胞通常具备一些典型的形态学特征:

  • 核大:细胞核体积异常增大。
  • 深染:经过染色后,细胞核颜色异常深染。
  • 异形:细胞形态不规则,大小不一,排列紊乱。

恶性细胞与正常细胞的差异越大,通常意味着肿瘤的恶变程度越高,预后可能更差。

病理切片分析的难点与解决方案

在病理切片中分离并识别出关键的细胞和结构对于诊断至关重要,但这一过程面临三大主要难点:

  1. 模糊:由于切片制备或成像原因,细胞边界可能不清晰。
  2. 重叠:切片具有一定的厚度,不同层面的细胞可能在二维图像上发生重叠。
  3. 异质:恶性细胞形态多变,没有统一的标准形态,即“各有各的样”。

传统的解决方案依赖于数字图像处理和模式识别技术:人工设计算法来提取细胞核的形态学特征(如面积、周长)、几何学特征(如圆形度)、纹理特征(如灰度共生矩阵)和形状特征等,然后利用这些特征训练分类器(如SVM)来区分良恶性。

深度学习的解决方案则提供了更强大的范式:通过卷积神经网络(CNN),模型能够从海量的病理图像数据中,自动学习到比手工特征更复杂、更有效的特征表示,从而端到端地完成分类、检测或分割任务。这极大地简化了流程并提升了性能。

病理切片数据集:Camelyon竞赛

与医学影像分析一样,获取带标注的病理切片数据非常困难。因此,研究社区通常依赖于公开的竞赛数据集。其中,Camelyon(Cancer Metastases in Lymph Nodes)挑战赛系列是最著名和广泛使用的之一。

该竞赛旨在评估算法在数字化病理切片中检测淋巴结转移癌的性能。数据集主要特点如下:

  • 图像格式:特殊的TIF格式。这不是普通的图片,而是全切片图像(Whole Slide Image, WSI)。其尺寸极其巨大,可能超过普通图片的10万倍。因为它支持多级缩放,可以从低倍率的组织全景,一直放大到高倍率下看清单个细胞的细节。
  • 标注格式:病变区域的标注信息以XML文件提供。XML中描述了病灶的轮廓坐标等信息,而非直接画在图片上的掩膜。因此,我们需要使用专门的 WSI 标注工具(如 ASAP)将 XML 标注映射回原图,生成可用于训练的掩膜标签。
  • 染色方式:
    • 苏木精-伊红染色(H&E):最基础的染色方法,细胞核被染成蓝色,细胞质被染成粉红色。课件中提到的“H and E”即指此法。
    • 免疫组化染色:为了更清晰地观察特定目标,会使用特殊的化学试剂进行染色,使病变组织呈现特定的显色(如棕黄、绿色等),从而与背景形成更强对比。需要说明的是,Camelyon竞赛公开发布的切片均为H&E染色;免疫组化主要用于病理专家建立参考标注时辅助确认病灶范围,并不属于该数据集发布的图像内容。

以下是Camelyon16数据集的简要信息,我们可以通过代码模拟一下读取超大TIFF元数据的概念(实际处理需要使用openslide等专用库)。

import numpy as np

# 模拟一个超大WSI的元数据信息(实际中从openslide读取)
# 注意:此处仅为概念演示,无法真实加载GB级别的WSI
wsi_metadata = {
    "format": "TIFF (WSI)",
    "size_levels": 5,  # 金字塔层级数,例如从40倍到2.5倍
    "dimensions": [
        (100000, 50000),   # 层级0 (最高分辨率)
        (50000, 25000),    # 层级1
        (25000, 12500),    # 层级2
        (12500, 6250),     # 层级3
        (6250, 3125)       # 层级4 (最低分辨率)
    ],
    "mpp": 0.25,  # 微米每像素 (Microns Per Pixel),层级0的物理分辨率
    "vendor": "模拟扫描仪"
}

print("全切片图像(WSI)模拟元数据:")
for key, value in wsi_metadata.items():
    if key == "dimensions":
        print(f"  {key}:")
        for i, dim in enumerate(value):
            print(f"    层级{i}: {dim[0]} x {dim[1]} 像素")
    else:
        print(f"  {key}: {value}")

# 模拟从XML标注中解析出的一个病灶区域坐标(简化版)
# 实际XML包含多边形顶点列表
xml_annotation = """
<Annotations>
    <Annotation>
        <Coordinates>
            <Coordinate X="12000" Y="8500"/>
            <Coordinate X="12500" Y="8500"/>
            <Coordinate X="12500" Y="9000"/>
            <Coordinate X="12000" Y="9000"/>
        </Coordinates>
    </Annotation>
</Annotations>
"""
print("\n模拟XML标注片段(描述一个矩形病灶区域):")
print(xml_annotation)
全切片图像(WSI)模拟元数据:
  format: TIFF (WSI)
  size_levels: 5
  dimensions:
    层级0: 100000 x 50000 像素
    层级1: 50000 x 25000 像素
    层级2: 25000 x 12500 像素
    层级3: 12500 x 6250 像素
    层级4: 6250 x 3125 像素
  mpp: 0.25
  vendor: 模拟扫描仪

模拟XML标注片段(描述一个矩形病灶区域):

<Annotations>
    <Annotation>
        <Coordinates>
            <Coordinate X="12000" Y="8500"/>
            <Coordinate X="12500" Y="8500"/>
            <Coordinate X="12500" Y="9000"/>
            <Coordinate X="12000" Y="9000"/>
        </Coordinates>
    </Annotation>
</Annotations>

由于无法直接操作真实WSI,我们用一个极简化的例子来演示如何将一个小型“组织区域”从背景中提取出来,这模拟了病理切片分析中常用的感兴趣区域(ROI)提取步骤。这里使用大津法(Otsu’s Method)进行阈值分割。

import cv2
import numpy as np

# 1. 模拟生成一张小的灰度病理切片图像 (8x8)
# 假设背景较亮(值较高),组织区域较暗(值较低),并加入一些噪声
np.random.seed(42)  # 固定随机种子,确保结果可复现
background = np.random.randint(200, 230, (8, 8), dtype=np.uint8)

# 在中间创建一个暗色的“组织”区域
tissue_patch = np.array([
    [50, 55, 60, 65],
    [60, 65, 70, 75],
    [70, 75, 80, 85],
    [80, 85, 90, 95]
], dtype=np.uint8)

# 将组织区域嵌入背景中
simulated_slice = background.copy()
simulated_slice[2:6, 2:6] = tissue_patch

print("模拟的病理切片灰度图像 (8x8):")
print(simulated_slice)

# 2. 使用大津法自动计算分割阈值
# 大津法的原理是寻找一个阈值,使得前景(组织)和背景的类间方差最大。
ret, thresh = cv2.threshold(simulated_slice, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(f"\n大津法自动计算的最佳阈值: {ret}")

# 3. 应用阈值进行分割
# 像素值 > 阈值 -> 背景 (255), 像素值 <= 阈值 -> 组织 (0)
binary_mask = (simulated_slice > ret).astype(np.uint8) * 255
print("\n二值化分割结果 (255为背景,0为组织):")
print(binary_mask)

# 4. 可视化逻辑:将组织区域标记为1(前景)
roi_mask = (binary_mask == 0).astype(np.uint8)
print("\n感兴趣区域(ROI)掩膜 (1为组织,0为背景):")
print(roi_mask)
模拟的病理切片灰度图像 (8x8):
[[206 228 201 219 229 210 211 228]
 [203 202 219 214 221 221 214 210]
 [220 203  50  55  60  65 207 228]
 [214 201  60  65  70  75 224 206]
 [222 216  70  75  80  85 218 218]
 [201 215  80  85  90  95 225 210]
 [217 214 210 221 217 221 223 224]
 [229 229 220 213 213 221 203 212]]

大津法自动计算的最佳阈值: 95.0

二值化分割结果 (255为背景,0为组织):
[[255 255 255 255 255 255 255 255]
 [255 255 255 255 255 255 255 255]
 [255 255   0   0   0   0 255 255]
 [255 255   0   0   0   0 255 255]
 [255 255   0   0   0   0 255 255]
 [255 255   0   0   0   0 255 255]
 [255 255 255 255 255 255 255 255]
 [255 255 255 255 255 255 255 255]]

感兴趣区域(ROI)掩膜 (1为组织,0为背景):
[[0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 1 1 1 1 0 0]
 [0 0 1 1 1 1 0 0]
 [0 0 1 1 1 1 0 0]
 [0 0 1 1 1 1 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]]

上面演示的只是ROI提取的最小化概念验证。真正把Camelyon数据送进深度网络,还要按“整图 → 组织ROI → 固定尺寸patch → 按标注打标签 → 训练分类/分割模型”这条流水线走;其中的patch尺寸、步幅、肿瘤像素占比阈值、ResNet分类器等具体做法,是下一节《病理切片分析》的主体内容,这里不展开。

其他病理切片数据集与工具

除了Camelyon系列,还有其他公开的病理切片数据集,用于不同的任务,如细胞核分割、有丝分裂检测等。

处理这些数据通常需要专门的工具:

  • OpenSlide:一个用于读取和分析全切片图像的C库,提供了Python绑定(openslide-python),是处理WSI的基石。
  • ASAP (Automated Slide Analysis Platform):一个开源软件,用于查看WSI,并且可以将XML标注文件转换为覆盖在图像上的掩膜图片,这对于准备训练数据至关重要。

📝 动手练一练

  1. 概念辨析:病理切片分析中的“定性分析”和“定量分析”主要区别是什么?请各举一个例子说明。
  2. 代码实践:在上面的ROI提取示例代码中,大津法计算出的阈值是95。请你手动验证一下:如果将阈值手动设置为150,那么生成的二值化掩膜中,被标记为组织(值为0)的像素个数会变多、变少还是不变?为什么?(提示:回顾阈值分割的规则)
👉 点击查看参考答案
  1. 概念辨析:

    • 定性分析:侧重于对切片性质的概括和描述性判断,不涉及具体数值。例如,病理医生观察细胞形态后,给出“细胞核深染、异型性明显,考虑为恶性肿瘤”的描述性诊断。
    • 定量分析:侧重于依据图像数据计算出具体的数值指标。例如,通过图像分析算法,统计出每平方毫米组织内的有丝分裂细胞数为15个,这个数字可以作为评估肿瘤增殖活性的定量依据。
  2. 代码实践:

    • 不变。
    • 原因:本例中组织像素值为 50–95,背景像素值为 201–229。二值化规则是 像素值 > 阈值 -> 背景(255)、像素值 <= 阈值 -> 组织(0)。阈值从 95 提高到 150 后,组织像素仍全部满足 <=150(仍为 0),背景像素仍全部 >150(仍为 255),因此组织像素数不变。
    • 一般规律:提高阈值会让更多偏暗的像素被归为前景;如果背景中存在 96–150 的像素,它们就会被误分为组织,使前景变多。

本章小结

本节我们将视野从宏观的医学影像延伸至微观的病理世界。病理切片分析是疾病诊断的基石,其核心任务是通过定性观察和定量计算,对细胞和组织的异常做出判断。我们深入探讨了其面临的模糊、重叠、异质三大挑战,并对比了传统特征工程与深度学习端到端学习两种解决方案。重点介绍了该领域的关键资源——Camelyon等公开竞赛数据集,了解了其全切片图像(WSI)的超大尺寸、特殊TIF格式以及XML标注的特点。最后,通过简化的代码演示,模拟了病理切片分析中提取感兴趣区域(ROI)的基本步骤。

今天,病理 WSI 分析已大量采用多示例学习(MIL)、TransMIL、CLAM 等弱监督方法,以及 UNI、CONCH 等病理基础模型;但 Camelyon 仍是 WSI 分类与转移灶检测的经典基准。

📋 行动清单

  • 理解病理切片定性分析与定量分析的区别,并能举例说明。
  • 访问Camelyon16竞赛官网(https://camelyon16.grand-challenge.org ),查看其数据介绍和任务描述,建立直观认识。
  • 在脑海中复现利用大津法从图像中分割出目标区域的基本流程和代码逻辑。

—— 小象教研组