社区计算机视觉课程文档

使用 DCGAN 生成合成数据

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

使用 DCGAN 生成合成数据

我们在单元 5 中了解到,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),并包含每个图像类别的子文件夹(Pneumonia/Normal)。有 5,863 张 X 光图像(JPEG)和 2 个类别(Pneumonia/Normal)。

  • 胸部 X 光图像(前后位)是从广州妇女儿童医疗中心的 1 至 5 岁的儿童患者的回顾性队列中选择的。所有胸部 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 个 epochs。

让我们可视化进度

trainig-gif

我们做得怎么样?

这里有 64 张“良好”的合成图像,定义为从判别器那里获得“真实”标签,概率为 70%。

lung-images

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

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

资源和进一步阅读

< > 更新 在 GitHub 上