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

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 = False

def forward(self, x, y):
    x_features = self.get_features(x)
    y_features = self.get_features(y)
    loss = 0
    for layer_name in self.layers:
        loss += nn.functional.mse_loss(x_features[layer_name], y_features[layer_name])
    return loss

def get_features(self, x):
    features = {}
    prev_x = x
    for name, layer in self.vgg._modules.items():
        x = layer(x)
        if name in self.layers:
            features[self.layers[name]] = x
        if name == '26':
            break
    return 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 = False

def forward(self, x, y):
    x_features = self.get_features(x)
    y_features = self.get_features(y)
    loss = 0
    for 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 loss

def 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 gram

def get_features(self, x):
    features = {}
    prev_x = x
    for name, layer in self.vgg._modules.items():
        x = layer(x)
        if name in self.layers:
            features[self.layers[name]] = x
        if name == '26':
            break
    return 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.mfbz.cn/a/569700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring SpringBoot(详解)

1. Spring简介 1.1 Spring 核心设计思想 1.1.1 Spring 是什么? Spring 是包含了众多⼯具⽅法的 IoC 容器。Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,Spring ⽀持⼴泛的应⽤场景,它…

Spring Cloud学习笔记(Ribbon):Ribbon的应用样例

这是本人学习的总结,主要学习资料如下 - 马士兵教育 1、Ribbon简介1.1、架构图1.2、简单实现负载均衡 2、配置负载均衡策略2.1、IRule2.2、使用IRule简单示例2.2.1、Overview2.2.1、注入IRule2.2.2、关联IRule和服务 1、Ribbon简介 我们都知道Ribbon是用于负载均衡…

5-内核开发-/proc File System 学习

5-内核开发-/proc File System 学习 课程简介: Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。…

Nacos采坑:非集群Nacos不要使用同一个MySQL数据库

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Nacos 致力于帮助您…

第27章 筹集资金

< 回到目录 第六部分 流程 在各关键职能安排好了关键人员之后&#xff0c;公司有效运作&#xff0c;数据系统正常运行&#xff0c;经理和团队成员之间的双向信息交流顺畅。现在&#xff0c;剩下的就是你与外部世界的交流&#xff0c;包括与投资者、招聘者和客户的互动。这些…

银行买的黄金怎么卖出去?了解黄金交易的步骤和注意事项

黄金一直以来都是备受投资者关注的贵金属之一。银行提供了购买黄金的机会&#xff0c;但投资者也需要了解如何卖出银行买的黄金。 选择适合的购买方式 投资者可以通过多种途径购买黄金&#xff0c;其中包括银行提供的黄金交易服务。银行买黄金的方式可以是通过黄金交易账户、黄…

力扣HOT100 - 114. 二叉树展开为链表

解题思路&#xff1a; class Solution {List<TreeNode> list new ArrayList<>();public void flatten(TreeNode root) {recur(root);for (int i 1; i < list.size(); i) {TreeNode pre list.get(i - 1);TreeNode cur list.get(i);pre.left null;pre.right…

SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)

一、配置Java环境变量 在启动Kafka之前,你需要先正确配置好你的Java环境变量。可以在终端输入java -version检查java环境变量是否配置正确,在Mac上如何配置java环境变量,请读者自行网上搜索操作之,此处不赘叙。 二、下载安装Kafka 1、下载Kafka:Apache Kafka,这两个版本…

python简易小时钟

import time import turtledef getTime():tt time.localtime() # 结构化的时间ss time.strftime(%Y年%m月%d日 %H:%M:%S, tt)return sspen turtle.Turtle()pen.backward(100) pen.speed(0)while True:time.sleep(1)times getTime()pen.clear()pen.write(times, font("…

中颖51芯片学习10. Touch Key触摸按键功能

中颖51芯片学习10. Touch Key触摸按键功能 一、SH79F9476 资源介绍1. 特性2. 系统框图&#xff1a;3.准备环境 二、准备工具三、开发步骤1. 新建项目流程&#xff08;1&#xff09;新建工程&#xff08;2&#xff09;选择芯片和封装&#xff08;3&#xff09;触摸配置按键&…

Tomcat架构设计精髓分析-Connector高内聚低耦合设计

优秀的模块化设计通常都会采用高内聚、低耦合 高内聚是指相关度比较高的功能要尽可能集中&#xff0c;不要分散。低耦合是指两个相关的模块要尽可能减少依赖的部分和降低依赖的程序&#xff0c;不要让两个模块产中强依赖。 Tomca连接器需要实现的功能: 监听网络端口 接受网络…

MATLAB将多张小图整合到一张大图形成模板图

MATLAB将多张小图整合到一张大图形成模板图 代码如下: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;foldername字符模板; [datacell,filenamecell,filenameAllcell]readfun_1n(foldername); K2length(filenamecell);% …

用友 GRP-U8 fastjson远程代码执行漏洞复现(XVE-2024-8863)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友 GRP-U8 R10系列版本 VerifyToken 接口存在低版本fastjson反序列化漏洞,未经…

ESP32环境下基于SD卡与FTP实现温湿度数据采集与存储

本篇文章将介绍如何利用ESP32开发板结合SD卡与FTP服务器功能&#xff0c;实现温湿度数据的实时采集、存储与远程访问。项目代码基于Arduino IDE平台编写&#xff0c;主要依赖于以下库&#xff1a; SPIDHTWiFitime.hESP-FTP-Server-LibSDSPIFFSFS 1. 硬件连接与配置 1.1 所需…

Python | Leetcode Python题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution:def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first 0):# 所有数都填完了if first n: res.append(nums[:])for i in range(first, n):# 动…

漫谈AI 时代的信息模型

模型化- 数字化转型的重要基石 在各行各业推行数字化转型过程中&#xff0c;构建信息化模型十分重要&#xff0c;它是数字化转型的基石。事实上&#xff0c;数字化转型的核心是“万物皆模型”&#xff0c;在工业领域&#xff0c;以德国为主导的工业4.0 发展进程中&#xff0c;…

超越5G:迈向6G网络传感前沿的革命性飞跃

6G推动的传感技术发展有望将人类感官拓展到目前的极限。从精确测绘到活动识别&#xff0c;联网传感揭示了看不见的事物&#xff0c;使我们能够理解和预测以前未知的周围环境。高精度定位、增强人类感官和手势/活动识别的无缝集成预示着未来机器将以前所未有的自主性运行... 在飞…

安全AI未来 | C3安全大会 · 2024,数据驱动 AI原生

数字为时代变革注入动力&#xff0c;AI为重塑社会文明带来原力。数智浪潮中&#xff0c;我们见证着时代跃迁的巨变&#xff0c;面临着适变、应变、驭变的挑战。 数字驱动、AI原生。数字的流动不仅承载着信息&#xff0c;更将激活未来的无限价值&#xff1b;AI&#xff0c;不…

为什么要写技术方案?

技术方案是为研究解决各类技术问题&#xff0c;有针对性&#xff0c;系统性的提出的方法、应对措施及相关对策。技术方案设计是一个技术开发者必备的能力&#xff0c;特别是对于高级、资深、架构师等角色。技术方案设计不仅能够帮助我们明确需求&#xff0c;规划架构&#xff0…

【数据库】三、数据库SQL语言命令(基础从入门到入土)

【全文两万多字&#xff0c;涵盖大部分常见情况&#xff0c;建议点赞收藏】 目录 文章目录 目录安装SQL语言1.使用2.DATABASE查看所有库新建数据库修改数据库删除数据库连接数据库 3.TABLE创建表查看库所有表删除表查看表信息重命名表修改表字段&#xff08;列&#xff09;表中…
最新文章