社区计算机视觉课程文档

使用 DCGAN 生成合成数据

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

使用 DCGAN 生成合成数据

我们在单元 5 中了解到,GAN 是机器学习中的一种框架,其中两个神经网络,生成器和判别器,处于持续的对抗之中。生成器创建合成图像,判别器尝试区分真实图像和虚假图像。它们通过这种对抗过程不断改进,生成器越来越擅长创建逼真的图像,判别器越来越擅长区分虚假图像和真实图像。

现在我们将看看如何使用 GAN 生成医学图像,这是一个面临小数据集、隐私问题和有限数量的带注释样本的领域。研究人员已经使用 GAN 生成合成图像,例如肺部 X 射线图像、视网膜图像、脑部扫描和肝脏图像。在 GAN-based synthetic brain PET image generation 中,作者创建了阿尔茨海默病三个不同阶段的脑部 PET 图像。GAN-based Synthetic Medical Image Augmentation for increased CNN Performance in Liver Lesion Classification 生成了合成肝脏图像。BrainGAN: Brain MRI Image Generation and Classification Framework Using GAN Architectures and CNN Models 开发了一个使用多种 GAN 架构生成脑部 MRI 图像的框架,A Novel COVID-19 Detection Model Based on DCGAN and Deep Transfer Learning 使用 DCGAN 生成合成肺部 X 射线图像,以帮助 COVID-19 检测。

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

DCGAN 由 Radford 等人在 Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks 中提出,是许多研究人员用于生成合成医学图像的模型。我们将使用它来生成合成肺部图像。在使用 DCGAN 训练模型之前,我们将简要回顾其架构。生成器网络将随机噪声作为输入并生成合成肺部图像,而判别器网络尝试区分真实图像和合成图像。它在生成器和判别器中都使用卷积层来有效地捕获空间特征。DCGAN 还用步幅卷积代替最大池化来下采样空间维度。

生成器具有以下模型架构

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

判别器具有以下模型架构

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

数据收集

首先,我们需要获取真实肺部图像的数据集。我们将从 Hugging Face Hub 下载 Chest X-Ray Images (Pneumonia) 数据集。

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

  • 来自 Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning

  • 该数据集被组织成 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 个 epoch。

让我们可视化进度

trainig-gif

我们做得怎么样?

这里有 64 张“好的”合成图像,定义为从判别器接收到“真实”标签且概率为 70% 的图像。

lung-images

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

鉴于使用 GAN 训练高质量医学图像相关的已知挑战,一些研究人员已经探索使用扩散模型来生成肺部图像。Medfusion,一种用于医学图像的条件潜在 DDPM,在 Diffusion Probabilistic Models Beat GAN On Medical 2D Images 中被提出。Synthetically Enhanced: Unveiling Synthetic Data’s Potential In Medical Imaging Research,Khosravi 等人发现,使用真实图像和使用扩散过程合成生成的肺部图像的混合可以提高模型性能。

资源和拓展阅读

< > Update on GitHub