2023-3 无监督/弱监督/区域监督变化检测:生成对抗网络全卷积变化检测框架

作者:Chen Wu

摘要:

大多数端到端网络都被提出用于监督变更检测,而非监督变更检测模型依赖于传统的预检测方法。因此,我们提出了一个带有生成对抗网络的全卷积变化检测框架,将无监督、弱监督、区域监督和全监督的变化检测任务统一到一个端到端框架中。利用基本的Unet分割器获取变化检测图,利用图像-图像生成器对多时段图像之间的光谱变化和空间变化进行建模,利用变化和不变判别器对弱监督和区域监督变化检测任务中的语义变化进行建模。分段器和生成器的迭代优化可以构建一个端到端的无监督变化检测网络,分段器和鉴别器之间的对抗过程可以为弱监督和区域监督变化检测提供解决方案,分段器本身可以训练为全监督任务。实验结果表明,该框架在无监督、弱监督和区域监督的变化检测中都是有效的。本文提出的框架为无监督、弱监督和区域监督的变化检测任务提供了新的理论定义,在探索端到端遥感变化检测网络方面具有巨大潜力。

1 简介

变化检测的目的:利用同一研究地点在不同时间的多时相遥感影像观测景观变化。

最开始,深度学习作为一个特征提取模块嵌入到传统变化检测过程中。将确保不变区块的特征差异最小作为学习的准则。

基于深度学习的无监督变化检测的另一种方法:通过预检测认定特定变化和未变化区域,并用相应的区域作为训练样本来建立深度网络模型进而获取更优的特征和区分语义标签。然而,这种方法深度依赖预检测的效果并且无法建立一个先进的端到到模型来充分利用深度学习。

随着有标注的变化检测数据集的公开,有监督的语义分割被引入到变化检测领域中来进行高分辨率图像上全卷积网络的二元变化或目标变化识别。虽然性能很好但是依赖高度耗费人力物力的数据标注。

利用固定的全卷积分割网络来处理多时相高分辨遥感图像时,变化检测任务可以被定义为:获取满足预定约束的一张合适的分割地图。全监督变化检测(FSCD)任务可以看作是对映射地图的完全约束,然而实际应用中难以提供充足的FSCD训练数据集。因为变化检测是一项复杂的任务,需要同时解释多时相图像对。

在无监督变化检测中(USCD),即使没有预先给定的样本和规则,仍然有先验知识:不变景观的表征可以从一张图像预测到另一张图像,而变化的景观则不能。

进一步,我们可以进一步定义弱监督变化检测(WSCD)任务,只给出一组多时相图像的变化或不变化标签,我们要在此基础上准确提取出变化区域。

最后,定义一种新的变化检测任务:仅需要绘制一个可能发生景观变化的区域(如矩形),并准确地标记出确切的变化像素。约束条件是,模型标注了一个变化区域,这样分割图掩码的图像对就可以像预定义区域掩码的图像对一样被判定为不变。叫做区域监督变化检测(RSCD)

贡献:1)提出FCD-GAN包含上述变化检测 2)首个用全卷积端到端网络实现无监督变化检测 3)

提出一种用GAN的单阶段弱监督分割的新方法 4)提出了一种新的区域监督变化检测任务。

2 方法论

提出的框架总图:

由三个基础部分组成:segmentor(分割器)、generator(生成器)和discriminator(辨别器)

2.1 基础模块

分割器:(基础的U-net结构)用简单的级联融合进行多时相高分辨图像在编码中的融合。Sigmoid作为激活函数。编码器的两个分支是暹罗式。上采样方法是双线性插值。

U-net介绍:从零开始的U-net入门

生成器:可以认为,在地形不变的情况下,可以从一个图像预测到另一个图像。因此,我们从SRGAN[48]实现了一个类似的生成器。不同的是,最后一层没有使用sigmoid或tanh等激活函数,因为输入的多时相图像将通过标准归一化进行预处理。

辨别器:对SRGAN[48]中的判别网络进行了简化。在研究中,我们发现复杂网络在区分变化或不变的图像场景时会过于强大,以至于对抗进展中的平衡太容易被打破。编码器的分支是连体的。

GAN网络入门:GAN(生成对抗网络)的系统全面介绍(醍醐灌顶)

2.2 无监督变化检测

无监督变化检测的基本假设是:对于时空图像中的不变景观,它们在光谱、空间或语义方面具有一定的一致性;而对于变化的景观,它们可以是任何时间的变化

该模型想要找到一个变化区域,以便在剩余的区域中,一个图像可以准确地预测为另一个多时相图像。

然而,值得注意的是,有一种方法可以很容易地满足这个目标,那就是将所有像素标记为1。显然,这是一个错误的解决方案。为了避免这种无意义的解决方案,我们需要添加一个约束,即分割应该是0/1并且是稀疏的。最直接的方法是在损失函数中增加一个0-1的损失,而ℓ0范数很难优化。因此,我们释放这个约束到ℓ1范数。因此,将目标改写为:

该模型希望找到一个最小的变化区域,以便在剩余的区域内将一幅图像准确地预测为另一幅多时相图像。

是用来测量预测性能的损失函数,由重构损失和内容损失组成

2.3 弱监督变化检测

仅标记变化的图像对为(1) 未变化的图像对为(0)

对于弱监督的变化检测,解释器标记大量的多时相图像对被改变或不变。我们想用弱监督信息训练一个分割模型,以检测这些变化图像对中精确的变化像素。

解决这一问题的基本假设是,如果改变的像素都被标记和屏蔽,相应的改变的图像对将被识别为与未改变的图像对相同。(对抗过程)随着分割器的发展,发展中的鉴别器越来越难以区分被掩盖的变化对和不变对。

该模型希望找到一个最小的变化区域,这样在没有变化区域的情况下,就可以将变化的图像对与真实的不变图像对区分开来。

生成器只能用真实不变的图像对进行训练,生成损失可以帮助找到变化图像对中的变化区域。但值得注意的是,当给出弱监督信息时,可能并非所有的不可预测区域都是目标变化区域,例如物候变化。因此,必须用权重来调整代损。此外,当分割器应用于真实的不变图像对时,整个图像的分割结果应该绝对为零。

利用变化掩模计算了不变图像对的识别损失。否则,鉴别器会迅速收敛到零,容易破坏对抗过程中的平衡。这是因为,鉴别器倾向于了解是否有掩码覆盖图像对,而不是它们是否是变化的图像对。一个不变的多时相图像对对于任何掩模都是不变的。因此,改变后的掩码也会同时应用在改变后的图像对和真实不变的图像对上。

2.4 区域监督变化检测

在实际应用中,尽管标记所有更改的像素是费时费力的,但仅为弱监督的更改检测提供图像级标签也太粗糙了。所以提出了区域监督变化检测(RSCD)

在区域监督变化检测中,解释器只绘制一个可能的区域,如矩形,覆盖景观变化。这个任务中的模型需要找到在标记区域内提取变化的像素。

与弱监督对比的不同之处在于未改变的对样本是通过遮蔽给定参考区域而得到的模拟样本,而不是真实样本。

该模型希望找到一个最小的变化区域,在没有变化区域的情况下,通过替换给定参考区域内的内容,可以将变化后的图像对与模拟的图像对区分为不变。

小结:

无监督:

该模型希望找到一个最小的变化区域,以便在剩余的区域内将一幅图像准确地预测为另一幅多时相图像。

理解:

训练分割器分割生成mask map,并确保分割器生成了正常的Mask Map(l1范数项),训练生成器用去除Mask剩余部分的图像生成另一时相的图像。(基于假设:未变化的区域存在固有联系可以互相生成而变化的区域不存在)

过程:首先用整幅图像预训练生成器,然后用用预训练的生成器训练分割器,最后再同时训练分割器和生成器。

弱监督:

仅标记变化的图像对为(1) 未变化的图像对为(0)

该模型希望找到一个最小的变化区域,这样在没有变化区域的情况下,就可以将变化的图像对与真实的不变图像对区分开来。

理解:

仅有图像级的标签,分割器掩盖变化区域让鉴别器鉴别剩下的部分是否是变化的多时相图。训练分割器尽量掩盖所有变化区域,训练鉴别器尽量识别变化的图片,形成对抗。

区域监督:

该模型希望找到一个最小的变化区域,在没有变化区域的情况下,通过替换给定参考区域内的内容,可以将变化后的图像对与模拟的图像对区分为不变。

理解:

将弱监督中的真实未变化图像对替换为:用区域覆盖多时相图生成的模拟未变化图像对。

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成对抗网络(GAN)是一种深度学习模型,其目的是生成与真实数据相似的合成数据。PyTorch是一个非常受欢迎的深度学习框架,它提供了方便易用的API来实现GAN。 以下是使用PyTorch实现GAN的基本步骤: 1. 定义生成器(Generator)和判别器(Discriminator)的架构,可以使用卷积神经网络(CNN)或连接神经网络(FCN)。 2. 定义损失函数。GAN使用对抗损失函数(Adversarial Loss)来最小化生成器和判别器之间的差异。可以使用二元交叉熵(Binary Cross Entropy)损失函数来计算判别器和生成器的损失。 3. 训练GAN。在训练期间,生成器和判别器交替进行更新,以使生成器生成更逼真的样本,并使判别器更准确地区分生成的样本和真实样本之间的差异。 下面是一个简单的PyTorch实现GAN的示例代码: ``` import torch import torch.nn as nn import torch.optim as optim import torchvision.datasets as datasets import torchvision.transforms as transforms from torch.utils.data import DataLoader # 定义生成器和判别器的架构 class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.fc1 = nn.Linear(100, 256) self.fc2 = nn.Linear(256, 784) self.relu = nn.ReLU() self.tanh = nn.Tanh() def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.tanh(x) return x class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.fc1 = nn.Linear(784, 256) self.fc2 = nn.Linear(256, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.sigmoid(x) return x # 定义损失函数和优化器 criterion = nn.BCELoss() generator_optimizer = optim.Adam(generator.parameters(), lr=0.001) discriminator_optimizer = optim.Adam(discriminator.parameters(), lr=0.001) # 训练GAN for epoch in range(num_epochs): for i, (real_images, _) in enumerate(data_loader): batch_size = real_images.size(0) real_labels = torch.ones(batch_size, 1) fake_labels = torch.zeros(batch_size, 1) # 训练判别器 discriminator_optimizer.zero_grad() real_output = discriminator(real_images.view(batch_size, -1)) real_loss = criterion(real_output, real_labels) z = torch.randn(batch_size, 100) fake_images = generator(z) fake_output = discriminator(fake_images.detach()) fake_loss = criterion(fake_output, fake_labels) discriminator_loss = real_loss + fake_loss discriminator_loss.backward() discriminator_optimizer.step() # 训练生成器 generator_optimizer.zero_grad() z = torch.randn(batch_size, 100) fake_images = generator(z) fake_output = discriminator(fake_images) generator_loss = criterion(fake_output, real_labels) generator_loss.backward() generator_optimizer.step() ``` 在上面的代码中,我们首先定义了Generator和Discriminator的架构。Generator接收一个随机噪声向量作为输入,并生成一个大小为28x28的图像。Discriminator接收一个大小为28x28的图像作为输入,并输出一个0到1之间的概率值,表示输入图像是真实的还是生成的。 接下来,我们定义了损失函数和优化器。在训练期间,我们使用二元交叉熵损失函数来计算判别器和生成器的损失,并使用Adam优化器来更新模型参数。 最后,我们在数据集上迭代多个epoch,每次迭代都训练判别器和生成器。在每个epoch中,我们首先训练判别器,然后训练生成器,以最小化判别器和生成器之间的差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值