【深度学习】图像修复的一些模型

Mask-Aware Transformer 大空洞修复。

1、图像修复 Introduction

定义

图像修复(Image inpainting、Image completion、image hole-filling)指的是合成图像中缺失区域的过程,可以帮助恢复被遮挡或降质的部分。
在下图中,左图是原图,左图蓝色区域是mask区域(原图的mask区域是不传给模型的),右图是模型输出图。
[图片]
一般输入的是Image图(扣掉后)+Mask图(单通道),如下图。
[图片]
用途

  1. 移除物体 remove objects
    举例,如上图。
    这个任务常用的数据集是Places,包含约400个场景的图像。

  2. 生成物体 generate novel objects
    举例如下图,生成人脸面部的眼镜、鼻子。
    这个任务常用的数据集是CelebA-HQ人脸数据集。
    [图片]

[图片]
Tips
GAN模型对于mask区域是进行“移除物体”还是“生成物体”,如果不外加干预(比如一些模型会加入人为互动绘制sketch),那么GAN模型的效果是取决于模型的。下图中,从Places数据集中训练出来的模型和从CelebA-HQ数据集中训练出来的模型对黑色mask区域的填充效果可见,效果取决于模型对数据的学习。
[图片]

  1. 图像超分 image super resolution
    试想将原图每个像素之间都插入一个空像素,所有空像素构成mask区域,然后让模型对其进行图像补全。
    举例如下图:
    [图片]
  2. 其他。
    可以扩展用于图像压缩、隐私保护、照片修复、图像编辑、旧照片修复等场景。

难点

图像修复任务的难点大抵有如下:

  1. 语义和结构一致性。修复的图像区域应与周围环境保持一致的语义和结构,这需要算法能够理解图像内容并生成合理的修复结果。比如陆地上不能出现鱼。
  2. 细节保留和重建。修复区域可能包含复杂的纹理和细节,如面部特征、纹理等。算法需要能够精确地恢复这些细节,以生成逼真的修复图像。
  3. 多样性和创造性。不同的修复情况需要生成多样性的结果,以应对各种不同的损坏情况和修复需求。
  4. 遮挡和变形处理。修复区域可能被遮挡、变形或者包含不规则的形状,这需要算法能够适应不同的情况来填补缺失部分。下图是一个mask的发展过程,最初研究图中央区域规则的方形mask,后来mask逐渐往着任意形状、遮盖区域比例越来越大发展。
    [图片]
  5. 光照和阴影一致性。修复结果需要与周围环境的光照和阴影保持一致,以确保生成的图像看起来自然。
  6. 生成稳定性和模式崩溃:某些情况下,生成的修复结果可能不稳定,导致图像质量下降或出现异常。此外,一些算法可能会受到“模式崩溃”问题影响,即生成过于重复的图像内容。

方法

  1. 早期的方法:纹理合成、Patch之类,用图像其他区域填充的办法
  2. GAN
  3. diffusion
  4. GAN结合傅里叶变换、小波变换之类的特征提取

关键点
要想把图像修复做好,需要着重关注两点:

  1. 远距离上下文的图像内容推理。
  2. 大缺失区域或者任意形状区域的细粒度纹理合成。
    基本所有论文都是围绕这两点做工作。

2、Related Work
Globally and Locally Consistent Image Completion
在关心全局语义的情况下,也注重局部细节。全局判别器网络将整个图像作为输入,而局部判别器网络仅将完成区域周围的小区域作为输入。训练两个判别器网络来确定图像是真实的还是由补全网络完成的,而训练补全网络来欺骗两个判别器网络。
缺点:色彩缺失,需要额外的后处理(快速行军和泊松图像混合)。
[图片]

[图片]

Generative Image Inpainting with Contextual Attention
使用上下文注意力层关注遥远空间位置的特征块。
双阶段图像生成,在Coarse Result之后再次精修。
全局判别器+局部判别器。
[图片]
Image Inpainting for Irregular Holes Using Partial Convolutions
Partial Convolutional Layer,包括一个masked和re-normalized的卷积操作,然后是一个mask-update step。
第一个证明在不规则形状的孔上训练图像绘制模型的有效性的人。
Free-Form Image Inpainting with Gated Convolution
引入门控卷积,为所有层中每个空间位置的每个通道学习动态特征选择机制,显著提高了自由形式掩模和输入的颜色一致性和修复质量。
提出了一种更实用的基于补丁的GAN鉴别器SN-PatchGAN,用于自由形式的图像修复。它简单、快速,并产生高质量的修复结果。
[图片]
Aggregated Contextual Transformations for High-Resolution Image Inpainting
建议学习高分辨率图像在绘画中的aggregated contextual transformations,这允许捕获信息 informative distant contexts 和rich patterns of interest for context reasoning进行上下文推理。
设计了一种新的掩模预测任务来训练适合图像绘制的discriminator。这样的设计迫使discriminator区分真实斑块和合成斑块的详细外观,这反过来又有利于生成器合成细粒度纹理。
[图片]
LaMa: Resolution-robust Large Mask Inpainting with Fourier Convolutions
使用具有图像宽的感受野的快速傅里叶卷积fast Fourier convolutions (FFCs);
高感受野感知损失 (a high receptive field perceptual loss);
大面积mask训练。
[图片]
Co-ModGAN:Large Scale Image Completion via Co-Modulated Generative Adversarial Networks
提出Co-ModGAN,弥合了图像条件生成结构和最近的无条件调制生成结构之间的差距;
提出了新的P-IDS/U-IDS,用于对GAN的感知保真度进行稳健评估;

3、MAT:Mask-Aware Transformer
CVPR 2022 Best Paper Finalist, Oral
创新点

  1. 开发了一种新颖的修复框架 MAT,是第一个能够直接处理高分辨率图像的基于 transformer 的修复系统。
  2. 提出了一种新的多头自注意力 (MSA) 变体,称为多头上下文注意力 (MCA),只使用有效的token来计算注意力。
  3. 设计了一个风格操作模块,使模型能够通过调节卷积的权重来提供不同的预测结果。
    模型结构
    网络分为粗修复与细修复两个阶段。粗修复主要由一个卷积头,五个transformer模块和一个卷积尾构成;细修复采用一个 Conv-U-Net 来细化高频细节。
    下图是粗修复的网络:
    [图片]
    细修复的网络是U-Net构型的,论文没有绘制此图。下图是整体的Generator网络。
    [图片]
    下图是整体的Discriminator网络,是VGG19网络构型。
    [图片]
    Convolutional Head
    卷积头主要由四个卷积层构成,将3512512的图像转换成1806464的特征图,用来提取token。

Transformer Body
本文对transformer模块进行了改进,一是删除了层归一化,二是采用融合学习(使用特征拼接)代替残差学习。

删除层归一化的原因:在大面积区域缺失的情况下,大部分的token是无效的,而层归一化会放大这些无效的token,从而导致训练不稳定;

替换残差连接的原因:残差连接鼓励模型学习高频内容,然而在刚开始大多数的token是无效的,在训练过程中没有适当的低频基础,很难直接学习高频细节,如果使用残差连接就会使优化变得困难。采用融合学习(使用特征拼接)代替残差学习,如下面的T图。
[图片]

[图片]
[图片]
Multi-Head Contextual Attention
为了处理大量的标记(对于512×512的图像,最多有4096个标记)和给定标记的低保真度(最多90%的标记是无用的),我们的注意力模块采用了位移窗口[36]和动态遮罩,能够利用少量可行的标记进行非局部交互。
注意力模块利用移位窗口和动态掩码,只使用有效的token进行加权求和。MCA输出是有效标记的加权和,如下图:
[图片]
Mask Updating Strategy
更新规则:只要当前窗口有一个token是有效的,经过注意力后,该窗口中的所有token都会更新为有效的。如果一个窗口中的所有token都是无效的,经过注意力后,它们仍然无效。
[图片]
Style Manipulation Module
设计了一个风格操作模块,使MAT具有多元化的生成。它通过在重建生成过程中使用额外的噪声输入改变卷积层的权值归一化来操纵输出。为了增强噪声输入的表示能力,我们强制图像条件样式sc从图像特征X和噪声无条件样式su中学习。
B是随机给的mask,由su和sc得到风格表达的s。
s将会改变权重W,从而让模型可以使用随机噪声作为输入,让模型可以有多元化生成。
[图片]
成绩
[图片]
4、图像修复 损失函数
重建损失 Reconstruction Loss
GAN(生成对抗网络)中的重建损失通常用于度量生成器生成的图像与真实图像之间的差异,帮助生成器学习生成更逼真的图像。在 GAN 中,生成器试图生成与真实图像相似的样本,而判别器则评估生成器生成的样本是否足够逼真。重建损失通常使用生成器生成的图像与对应的真实图像之间的差异来衡量。在实际应用中,可以根据任务和需求选择适当的损失函数,如 L1 损失、结构相似性损失(SSIM)等,下面用均方误差(MSE)作为重建损失举例。此外还有一些难以解释理解的重建损失:https://www.zhihu.com/question/521284760/answer/2384076383
import torch
import torch.nn as nn

生成器生成的图像

generated_image = torch.rand((16, 3, 64, 64)) # 16张3通道64x64的随机生成图像

真实图像

real_image = torch.rand((16, 3, 64, 64)) # 16张3通道64x64的随机真实图像

计算重建损失

reconstruction_loss = nn.MSELoss() # 使用均方误差损失
loss_value = reconstruction_loss(generated_image, real_image)

print(“重建损失值:”, loss_value.item())
对抗性损失 Adversarial Loss
在生成对抗网络(GAN)中,对抗性损失是用来训练判别器(Discriminator)和生成器(Generator)之间竞争的损失函数。它鼓励生成器生成逼真的样本,同时使判别器能够区分生成的样本和真实样本。对抗性损失通常是使用交叉熵损失函数来衡量生成样本被正确分类为真实样本的程度。
import torch
import torch.nn as nn

判别器的预测

discriminator_predictions = torch.rand((16, 1)) # 判别器对16个样本的预测结果

生成样本的标签(0表示生成样本)

generated_labels = torch.zeros((16, 1))

计算对抗性损失

adversarial_loss = nn.BCEWithLogitsLoss() # 使用二进制交叉熵损失
loss_value = adversarial_loss(discriminator_predictions, generated_labels)

print(“对抗性损失值:”, loss_value.item())
在上述示例中,我们使用了带有 logits 的二进制交叉熵损失(BCEWithLogitsLoss),将判别器的预测与生成样本的标签进行比较。对抗性损失的目标是使判别器能够正确区分生成样本和真实样本,同时促使生成器生成逼真的样本,从而使两者之间形成平衡竞争关系。
感知损失 Perceived Loss
在图像修复中,感知损失是一种用于训练生成对抗网络(GAN)的损失函数,它帮助网络学习更好地合成逼真的修复图像。感知损失通过比较生成图像和真实图像之间的特征表示来量化生成图像的质量。
下面是一个用PyTorch演示感知损失在图像修复中的示例代码片段:
import torch
import torch.nn as nn
import torchvision.models as models

class PerceptualLoss(nn.Module):
def init(self):
super(PerceptualLoss, self).init()
self.vgg = models.vgg19(pretrained=True).features
self.layers = {
‘3’: ‘relu1_2’, # Conv3_2 -> ReLU1_2
‘8’: ‘relu2_2’, # Conv8_2 -> ReLU2_2
‘17’: ‘relu3_3’, # Conv17_3 -> ReLU3_3
‘26’: ‘relu4_3’ # Conv26_3 -> ReLU4_3
}

    for param in self.vgg.parameters():param.requires_grad = Falsedef forward(self, x, y):x_features = self.get_features(x)y_features = self.get_features(y)loss = 0for layer_name in self.layers:loss += nn.functional.mse_loss(x_features[layer_name], y_features[layer_name])return lossdef get_features(self, x):features = {}prev_x = xfor name, layer in self.vgg._modules.items():x = layer(x)if name in self.layers:features[self.layers[name]] = xif name == '26':breakreturn features

使用示例

criterion = PerceptualLoss()
fake_image = torch.randn(1, 3, 256, 256) # 生成的修复图像
real_image = torch.randn(1, 3, 256, 256) # 真实图像

loss = criterion(fake_image, real_image)
print(“Perceptual Loss:”, loss.item())
在这个示例中,PerceptualLoss 类从预训练的VGG19模型中提取了不同层的特征,并计算修复图像和真实图像之间的感知损失。这有助于生成对抗网络学习将合成图像的特征与真实图像的特征匹配,从而提高修复图像的质量。
风格损失 Style Loss
风格损失是一种用于训练生成对抗网络(GAN)的损失函数,它有助于确保修复图像在视觉上与原始图像在风格上保持一致。风格损失通过比较生成图像与原始图像之间的特定风格特征,如纹理、颜色和形状等,来量化生成图像的风格相似性。
以下是一个使用PyTorch编写的示例程序,演示如何计算图像修复中的风格损失:
import torch
import torch.nn as nn
import torchvision.models as models

class StyleLoss(nn.Module):
def init(self):
super(StyleLoss, self).init()
self.vgg = models.vgg19(pretrained=True).features
self.layers = {
‘3’: ‘relu1_2’, # Conv3_2 -> ReLU1_2
‘8’: ‘relu2_2’, # Conv8_2 -> ReLU2_2
‘17’: ‘relu3_3’, # Conv17_3 -> ReLU3_3
‘26’: ‘relu4_3’ # Conv26_3 -> ReLU4_3
}

    for param in self.vgg.parameters():param.requires_grad = Falsedef forward(self, x, y):x_features = self.get_features(x)y_features = self.get_features(y)loss = 0for layer_name in self.layers:loss += nn.functional.mse_loss(self.gram_matrix(x_features[layer_name]),self.gram_matrix(y_features[layer_name]))return lossdef gram_matrix(self, input):b, c, h, w = input.size()features = input.view(b, c, h * w)gram = torch.bmm(features, features.transpose(1, 2))gram = gram / (c * h * w)return gramdef get_features(self, x):features = {}prev_x = xfor name, layer in self.vgg._modules.items():x = layer(x)if name in self.layers:features[self.layers[name]] = xif name == '26':breakreturn features

使用示例

criterion = StyleLoss()
fake_image = torch.randn(1, 3, 256, 256) # 生成的修复图像
original_image = torch.randn(1, 3, 256, 256) # 原始图像

loss = criterion(fake_image, original_image)
print(“Style Loss:”, loss.item())

在这个示例中,StyleLoss 类从预训练的VGG19模型中提取了不同层的特征,并计算修复图像与原始图像之间的风格损失。风格损失有助于生成对抗网络学习将修复图像的风格与原始图像的风格保持一致,从而提高修复图像的视觉品质。

感知损失和风格损失都是用于训练生成模型的损失函数,但它们分别强调了内容和风格两个不同的方面。

5、评价指标 Evaluation Metrics

  1. L1↓
  2. L2↓
  3. PSNR↑
    [图片]
  4. SSIM↑
    [图片]
  5. FID ↓
    Heusel, M., Ramsauer, H., Unterthiner, T., Nessler, B., Hochreiter, S.: Gans trained by a two time-scale update rule converge to a local nash equilibrium. In: Advances in Neural Information Processing Systems. pp. 6626{6637 (2017) 5, 9, 12
    [图片]
  6. LPIPS↓
    Zhang, R., Isola, P., Efros, A.A., Shechtman, E., Wang, O.: The unreasonable effectiveness of deep features as a perceptual metric. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. pp. 586{595 (2018) 9, 12
    [图片]
  7. U-IDS↑ 和 P-IDS↑
    Zhao, S., Cui, J., Sheng, Y., Dong, Y., Liang, X., Chang, E.I., Xu, Y.: Large scale image completion via co-modulated generative adversarial networks. arXiv preprint arXiv:2103.10428 (2021) 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 26, 27
    [图片]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【重磅开源】MapleBoot项目开发规范

基于SpringBootVue3开发的轻量级快速开发脚手架 🍁项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒,终有春日&#xff…

身份证实名认证接口的三种方式、C#实名认证接口

第一种是身份证号实名认证,主要针对证件的二要素信息进行核验,判断姓名和身份证号是否一致;第二种是身份证实名认证,在身份证号实名认证的基础上,增加了身份证头像真伪查验的功能;第三种是身份实名认证&…

macOS - 处理系统更新红点

文章目录 AttentionPrefBundleIDs 是一个字典 <key>AttentionPrefBundleIDs</key><dict><key>com.apple.preferences.softwareupdate</key><integer>1</integer></dict>首先在系统偏好设置中将软件更新中“自动保持我的Mac运行…

计算机网络-IS-IS基础配置实验

前面我们了解了IS-IS的一些基础理论&#xff0c;从建立邻接、链路状态数据库同步以及路由计算&#xff0c;现在开始学习下配置操作。 一、IS-IS配置 网络拓扑图&#xff1a; 拓扑图 IS-IS有Level级别的区分&#xff0c;Level-1可以是性能较低的设备只维护区域内的LSDB&#xff…

设置Mac上Git的多账户配置,用于同时访问GitLab和Gitee

在 Mac 上配置 Git 多账户&#xff08;比如 GitLab 和 Gitee&#xff09;的步骤如下&#xff1a; 1. 生成 SSH 密钥 首先&#xff0c;你需要为每个 Git 服务生成一个 SSH 密钥。在终端中运行以下命令&#xff0c;然后按照提示操作&#xff1a; ssh-keygen -t rsa -C "y…

vue - 路由守卫

Vue路由守卫是一种机制&#xff0c;用于在导航过程中对路由进行监控和控制。Vue Router提供了三种类型的路由守卫&#xff1a; 1. 全局前置守卫&#xff1a;router.beforeEach 2. 全局解析守卫&#xff1a;router.beforeResolve 3. 全局后置守卫&#xff1a;router.afterEac…

远程仓库.github/workflow的 yml如何配置

git 远程仓库.github/workflow的 yml如何配置 关于远程仓库 GitHub 的协作开发方法取决于将本地存储库中的提交发布到 GitHub 以便其他人查看、获取和更新。 远程 URL 是 Git 表达“代码存储位置”的奇特方式。该 URL 可以是您在 GitHub 上的存储库&#xff0c;也可以是其他用…

深入探索CSS3多列布局:重构文本流与网页排版的艺术

在网页设计领域&#xff0c;CSS3的多列布局&#xff08;Multicolumn Layout&#xff09;是一项革命性的改进&#xff0c;它赋予了设计师们创作类似报纸或杂志般的多栏布局的能力。本文将全面解析CSS3中与多列布局相关的属性&#xff0c;深入探讨其工作原理&#xff0c;并结合实…

Mybatis入门,day2,动态SQL

Mybatis入门&#xff0c;day2&#xff0c;动态SQL 文章目录 Mybatis入门&#xff0c;day2&#xff0c;动态SQL前言一、为什么要实现动态SQL二、使用步骤1.where和if2.set和if3.foreach方法 前言 动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中&#xff0c;开…

《R语言与农业数据统计分析及建模》学习——描述性统计分析

一、描述性统计概念和方法 1、概念和作用 描述性统计是对数据进行概括和描述&#xff0c;便于理解数据的特征、趋势和分布&#xff0c;帮助我们了解数据基本情况和总体特征&#xff0c;为后续更深入的数据分析和建模提供基础。 2、基础方法 &#xff08;1&#xff09;中心趋…

npm、yarn与pnpm详解

&#x1f525; npm、yarn与pnpm详解 &#x1f516; 一、npm &#x1f50d; 简介&#xff1a; npm是随Node.js一起安装的官方包管理工具&#xff0c;它为开发者搭建了一个庞大的资源库&#xff0c;允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

CountDownLatch源码分析

1.创建 CountDownLatch latch new CountDownLatch(5); 2.latch.countDown(); 将count执行减一操作&#xff0c;当count为0时&#xff0c;等待中的线程会被唤醒 SIGNAL (值为-1)&#xff1a; 表示后继节点需要被唤醒。当一个节点释放锁的时候&#xff0c;会唤醒它的后继节点…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法 —— 2024-04-21 杭州 文章目录 C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法1.C++ 使用 std::thread 和 std::promise/std::future2.C++ 使用 std::async3.C/POSIX 使用 pthread在 C++ 和 C 语言…

2010-2023年“国家级大数据综合试验区”试点城市DID匹配数据

2010-2023年国家级大数据综合试验区试点城市DID匹配数据 1、时间&#xff1a;2010-2023年 2、来源&#xff1a;国家发展改革委、工业和信息化部、ZY网信办发函批复的试验区 3、指标&#xff1a;行政区划代码、年份、所属省份、地区、国家级大数据综合试验区、最早设立年份 …

Python基础:【习题系列】判断题(二)

Python中单行注释以#符号开始。 答案&#xff1a;对 Python中可以使用操作符来增加变量的值。 答案&#xff1a;对 在Python中&#xff0c;元组一旦创建就不能被修改。 答案&#xff1a;对 Python中的函数可以没有参数。 答案&#xff1a;对 在Python中&#xff0c;可以用{…

ELK创建仪表盘

创建仪表盘步骤&#xff1a; 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search&#xff0c;可以添加想要的字段&#xff0c;并保存这个search方便下次直接打开该search&#xff0c;并方便在可视化和仪表盘中使用该search. 二、生成饼图…

c++中的函数

一、函数概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个程序块实现特定功能。 二、函数的定义 函数定义主要有5个步骤&#xff1a; 返回值类型函数名参数列表函数体语句ret…

Node.js安装与配置:从零开始构建高效的开发环境

在当今互联网时代&#xff0c;Node.js已经成为了许多开发者心目中的首选技术栈之一。它的轻量级、高效性以及广泛的生态系统&#xff0c;使得它在构建Web应用、后端服务以及大规模数据处理等方面表现出色。然而&#xff0c;要充分利用Node.js的潜力&#xff0c;首先需要正确地安…

上海计算机学会 2024年4月月赛 丙组T1 最大公约数

第一题&#xff1a;T1最大公约数 标签&#xff1a; g c d gcd gcd题意&#xff1a;求 a a a和 b b b的最大公约数&#xff08; 1 ≤ a , b ≤ 1 , 000 , 000 , 000 1≤a,b≤1,000,000,000 1≤a,b≤1,000,000,000&#xff09;题解&#xff1a;辗转相除法 g c d ( a , b ) g c …