社区计算机视觉课程文档

使用 DCGAN 生成合成数据

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

使用 DCGAN 生成合成数据

我们在第五单元了解到,GAN 是一种机器学习框架,其中生成器和判别器这两个神经网络不断进行对抗。生成器创建合成图像,判别器则尝试区分真实图像和虚假图像。它们通过这种对抗过程不断改进,生成器在创建逼真图像方面变得更好,判别器在区分虚假图像和真实图像方面变得更好。

现在,我们将探讨如何使用 GAN 生成医学图像。医学图像领域面临着数据集小、隐私问题和带注释样本数量有限的挑战。研究人员已使用 GAN 生成合成图像,例如肺部 X 射线图像、视网膜图像、脑部扫描图像和肝脏图像。在 基于 GAN 的合成脑部 PET 图像生成 中,作者为阿尔茨海默病的三种不同阶段创建了脑部 PET 图像。基于 GAN 的合成医学图像增强,以提高肝脏病变分类中的 CNN 性能 生成了合成肝脏图像。BrainGAN:使用 GAN 架构和 CNN 模型生成和分类脑部 MRI 图像的框架 开发了一个使用多种 GAN 架构生成脑部 MRI 图像的框架,而 一种基于 DCGAN 和深度迁移学习的新型 COVID-19 检测模型 则使用 DCGAN 生成合成肺部 X 射线图像,以协助 COVID-19 检测。

DCGAN(深度卷积生成对抗网络)

DCGAN 是 Radford 等人 在 使用深度卷积生成对抗网络的无监督表征学习 中提出的,是许多研究人员用来生成合成医学图像的模型。我们将使用它来生成合成肺部图像。在使用 DCGAN 训练模型之前,我们将简要回顾其架构。生成器网络接收随机噪声作为输入并生成合成肺部图像,而判别器网络则尝试区分真实图像和合成图像。它在生成器和判别器中都使用卷积层来有效地捕获空间特征。DCGAN 还用带步长的卷积代替最大池化来对空间维度进行下采样。

生成器具有以下模型架构

  • 输入是一个包含 100 个随机数的向量,输出是一个大小为 128*128*3 的图像。
  • 该模型有 4 个卷积层
    • Conv2D 层
    • 批量归一化层
    • ReLU 激活函数
  • 带有 Tanh 激活函数的 Conv2D 层。

判别器具有以下模型架构

  • 输入是一个图像,输出是一个概率,表示该图像是虚假的还是真实的。
  • 该模型有一个卷积层
    • Conv2D 层
    • Leaky ReLU 激活函数
  • 三个卷积层,带有
    • Conv2D 层
    • 批量归一化层
    • Leaky ReLU 激活函数
  • 带有 Sigmoid 的 Conv2D 层。

数据收集

首先,我们需要获取一个真实肺部图像的 数据集。我们将从 Hugging Face Hub 下载 胸部 X 光图像(肺炎) 数据集。

以下是关于数据集的一些信息

  • 摘自 通过基于图像的深度学习识别医学诊断和可治疗疾病

  • 该数据集分为 3 个文件夹(train、test、val),并包含每个图像类别(肺炎/正常)的子文件夹。有 5,863 张 X 射线图像(JPEG)和 2 个类别(肺炎/正常)。

  • 胸部 X 射线图像(前后位)选自广州市妇女儿童医疗中心一到五岁儿科患者的回顾性队列。所有胸部 X 射线成像均作为患者常规临床护理的一部分进行。

  • 为了分析胸部 X 射线图像,所有胸部放射照片最初都经过质量控制筛选,移除了所有低质量或无法读取的扫描。然后,图像的诊断结果由两名专家医师进行分级,然后才被批准用于训练 AI 系统。为了弥补任何分级错误,评估集也由第三位专家进行了检查。

我们将从登录 Hugging Face hub 开始。

from huggingface_hub import notebook_login

notebook_login()

接下来,我们将加载数据集。

from datasets import load_dataset

dataset = load_dataset("hf-vision/chest-xray-pneumonia")

我们将通过调整大小和标准化像素值来预处理肺部图像。

import torchvision.transforms as transforms
from torchvision.transforms import CenterCrop, Compose, Normalize, Resize, ToTensor

transform = Compose(
    [
        transforms.Resize(image_size),
        transforms.CenterCrop(image_size),
        transforms.ToTensor(),
    ]
)

在训练过程中,生成器旨在生成与真实图像无法区分的合成肺部图像,而判别器则学习正确地将图像分类为真实或合成。我们首先使用随机噪声初始化生成器,并将训练 100 个 epoch。

让我们可视化进度

trainig-gif

我们做得怎么样?

以下是 64 张“好的”合成图像,它们被判别器以 70% 的概率标记为“真实”。

lung-images

我们可以看到一些合成的肺部图像看起来不错,但另一些则比较模糊。有几点重要的事情需要提及。首先,生成合成医学图像的研究人员通常会采用“中间人”——在本例中是专业的放射科医生——来评估合成图像。然后,只有那些能骗过专家的图像才会被包含在真实数据中用于训练模型。其次,那些看起来还算正常(至少对业余人士而言)的生成图像看起来非常相似。这是 GAN 的另一个已知问题——它们可能会遭受“模式崩溃”。本质上,当生成器开始产生相同类型的输出时,就会发生这种情况。可以将其想象成一个因制作巧克力曲奇饼干而受到很多赞扬的人,因此他变得非常非常擅长制作这种曲奇饼干,但却无法制作任何其他类型的曲奇饼干。

鉴于使用 GAN 训练高质量医学图像所面临的已知挑战,一些研究人员探索了使用扩散模型生成肺部图像。Medfusion 是一种用于医学图像的条件潜在 DDPM,在 扩散概率模型在医学 2D 图像上击败 GAN 中被提出。Khosravi 等人 在 合成增强:揭示合成数据在医学图像研究中的潜力 中发现,使用真实图像和通过扩散过程生成的合成肺部图像的混合物可以提高模型性能。

资源和进一步阅读

< > 在 GitHub 上更新