人脸恢复技术在当今数字化时代的重要性不言而喻。无论是在视频监控、照片修复还是身份识别等领域,人脸图像的质量都至关重要。高质量的人脸图像不仅能够提供更精确的身份信息,还能提高识别系统的准确性和可靠性。在社交媒体和娱乐行业,清晰的人脸图像对于照片和视频的美观度也至关重要。特别是在图像和视频的存档和修复中,如何有效地恢复受损的历史照片和老旧视频,保留其文化和历史价值,是一个重要的应用场景。
然而,现实生活中的人脸图像往往受到多种因素的影响,例如低分辨率、噪声、模糊等,从而导致图像质量下降,影响后续应用。具体来说,图像获取设备的质量、拍摄环境的光线条件、拍摄对象的运动状态以及图像压缩算法等都会对最终的人脸图像质量产生影响。这些因素使得获取高质量的人脸图像变得困难,进而增加了人脸恢复技术的挑战性。
在人脸恢复过程中,如何有效地消除噪声和模糊,同时保持人脸的细节和真实性,是一个主要的技术挑战。传统的方法往往难以同时兼顾这些方面,导致恢复结果不尽如人意。此外,由于人脸具有高度的结构化特征,任何恢复过程中的失误都可能导致显著的视觉伪影,使得恢复后的图像显得不自然。
连续先验(上)和我们的离散先验(下)(b)分布的HQ(左)/LQ(右)特征和码本项目的(a)框架
图1:对动机的说明。(a)连续生成先验(上)和我们的离散码本先验(下)的恢复框架。(b) t-SNE [36]为HQ/LQ面部特征和码本项目的可视化。© LQ输入。(d-e)现有的连续先验(PULSE [27]和GFP-GAN [38])方法的结果。(f-g)离散先验(最近邻[11,35]和编码器)的结果。(h)重建结果从代码序列地面真相。(i)总部基本真相。如图所示,无跳过连接的(d)脉冲显示其保真度较低。(e)带有跳过连接的GFP-GAN减轻了身份问题,但引入了显著的工件。(f)与(d-e)相比,利用最近邻匹配进行代码查找可以恢复更准确的面部结构,但一些细节,如眼镜无法恢复,可以引入一些伪影。(g)使用变压器进行代码预测,我们的代码器产生高质量和保真度的最佳结果。如图1(a)(上)所示,但当输入严重退化时,这种设计同时在结果中引入了伪影,如图1(e)所示。
盲人脸恢复(Blind Face Restoration, BFR)是指在未知退化条件下,从低质量人脸图像恢复出高质量人脸图像的过程。与传统的人脸恢复方法不同,盲人脸恢复并不依赖于预先定义的退化模型,而是试图在没有明确退化信息的前提下,通过自动学习的方式校正图像中的失真部分。这种方法的核心在于其鲁棒性和泛化能力,即能够在多种未知退化条件下都能有效地恢复出高质量的人脸图像。
盲人脸恢复的关键在于如何有效地建模和处理不同类型的退化。由于退化过程的不确定性和多样性,盲人脸恢复需要利用强大的模型来捕捉和校正各种退化现象。通常,这类方法会使用深度学习技术,通过大规模数据训练来学习图像恢复的映射关系。在这个过程中,如何选择合适的网络结构和训练策略,以确保模型在处理不同退化时的鲁棒性,是盲人脸恢复研究中的一个重要课题。
尽管现有的人脸恢复技术已经取得了一定的进展,但仍存在许多限制和不足。传统方法依赖于预先定义的退化模型,无法应对复杂多变的实际退化情况。具体来说,这些方法往往假设退化过程是已知的或可被精确建模的,但在实际应用中,退化过程往往是未知且复杂的,导致这些方法在实际应用中效果有限。
深度学习方法虽然在某些情况下表现出色,但往往需要大量标注数据,并且对不同类型的退化缺乏鲁棒性。具体来说,深度学习方法需要大量高质量的训练数据来学习有效的恢复模型,但获取和标注这些数据往往耗时费力。此外,这些方法在处理与训练数据分布不同的退化类型时,性能往往会显著下降,缺乏泛化能力。
此外,现有方法通常在恢复过程中引入过多的模糊或伪影,难以生成高保真的人脸图像。深度学习方法虽然能够在一定程度上捕捉图像中的细节,但往往会在恢复过程中引入一些不自然的伪影,影响图像的真实感和自然度。这是由于现有方法在处理复杂退化时,难以同时平衡去噪、去模糊和保真度之间的关系,导致最终恢复效果不理想。
编码器的框架。(a)我们首先学习了一个离散的码本和一个解码器,通过自重建学习来存储高质量的人脸图像的视觉部分。(b)使用固定的码本和解码器,然后我们引入了一个用于代码序列预测的转换模块,建模低质量输入的全局人脸组成。此外,利用可控特征变换模块控制从LQ编码器到解码器的信息流。请注意,此连接是可选的,可以在输入严重退化时禁用它以避免不利影响,并且可以调整标量权重w,以在质量和保真度之间进行交易。
CodeFormer是一种新颖的方法,将盲人脸恢复问题转化为码预测任务,旨在解决在未知退化条件下恢复高质量人脸图像的挑战。传统的人脸恢复方法通常依赖于预定义的退化模型,或通过深度学习技术从大量标注数据中学习恢复映射。然而,这些方法在面对复杂多变的退化情况时,往往难以保证鲁棒性和保真度。CodeFormer通过将人脸图像恢复问题转化为码预测任务,提供了一种新的解决方案。
CodeFormer的基本思想是使用离散码本(codebook)来表示高质量人脸图像的局部特征,将低质量人脸图像映射到高质量图像的码空间中。具体来说,CodeFormer首先将高质量人脸图像分解为一组离散码,每个码代表图像中的一个局部特征。然后,在盲人脸恢复过程中,CodeFormer通过预测低质量图像的局部特征码,从而恢复出高质量的人脸图像。这种方法的核心优势在于能够有效地捕捉和建模图像中的局部特征,从而提升恢复的质量和鲁棒性。
CodeFormer的关键创新在于引入了码本查找Transformer(Codebook Lookup Transformer, CLT),这是一个专门用于盲人脸恢复的模型。CLT结合了离散码本和Transformer的优势,通过自注意力机制来建模图像中的全局和局部特征,显著提升了恢复效果。
CLT的创新之处包括以下几点:
在CodeFormer的框架中,离散码本先验是通过大规模数据训练学习到的。这些离散码本表示了高质量人脸图像中的典型局部特征,例如眼睛、鼻子、嘴巴等。通过学习这些先验知识,CodeFormer能够在恢复过程中更准确地预测和还原低质量图像中的局部特征。
离散码本先验的引入不仅提升了模型的恢复效果,还增强了其泛化能力。由于这些离散码本是在大规模数据上训练得到的,因此它们能够覆盖各种不同类型的人脸特征,确保模型在处理不同人脸图像时都能表现出色。此外,离散码本先验还能够帮助模型更好地应对未知的退化情况,通过在码空间中的查找和匹配,有效地还原图像中的细节和纹理。
除了离散码本查找和局部特征的建模外,CodeFormer还通过Transformer的自注意力机制,结合了全局面部特征的建模能力。这种全局特征建模不仅提升了恢复效果,还增强了图像的整体一致性和自然度。
全局面部特征的建模主要体现在以下几个方面:
CodeFormer的架构首先采用自编码器(Autoencoder)进行码本学习。自编码器是一种无监督学习模型,能够有效地压缩和重构输入数据。通过将人脸图像输入到自编码器中,编码器部分将高维的图像数据压缩为低维的特征表示,即离散码。然后,解码器部分将这些离散码重构回高质量的人脸图像。
在这个过程中,自编码器学习到了高质量人脸图像的局部特征,并将这些特征表示为一组离散码。离散码本的学习使得模型能够有效地捕捉图像中的重要特征,同时保留图像的细节和结构。
在码本学习阶段,自编码器的编码器和解码器部分需要进行预训练,以确保模型能够有效地学习和重构高质量人脸图像。预训练的过程通常在大规模高质量人脸图像数据集上进行,通过最小化重构误差,优化模型参数。
预训练后的编码器能够将输入的高质量人脸图像映射到离散码空间中,而解码器则能够根据这些离散码,重构出高质量的图像。这一步骤为后续的码本查找和特征转换奠定了基础。
在第二阶段,CodeFormer引入了Transformer模块,即码本查找Transformer(Codebook Lookup Transformer, CLT)。Transformer是一种基于自注意力机制的模型,能够有效地捕捉输入数据中的全局和局部特征。CLT的引入使得模型能够在离散码空间中进行有效的查找和匹配,从而提升人脸图像的恢复效果。
Transformer模块通过自注意力机制,计算输入图像不同位置之间的相似度,动态调整每个位置的特征表示。这种自适应的特征表示使得模型能够更好地理解和建模图像中的长距离依赖关系和全局结构,从而提升恢复的保真度和一致性。
在码本查找过程中,CLT通过预测低质量图像的局部特征码,完成从低质量图像到高质量图像的映射。具体来说,CLT将低质量图像分解为一系列局部区域,并在离散码本中查找和匹配每个区域对应的高质量特征码。
这种码序列预测的方法能够有效地捕捉和还原图像中的局部细节,从而提升图像的整体质量和真实感。通过在码本中进行查找和匹配,CLT能够在处理不同类型的退化时表现出更高的鲁棒性和泛化能力。
在第三阶段,CodeFormer引入了可控特征转换模块,用于调整恢复图像的质量和保真度之间的权衡。这个模块的设计目的是在恢复过程中,既能去除图像中的噪声和模糊,又能保留图像的细节和自然度。
可控特征转换模块通过引入可调节参数,允许用户在恢复过程中根据具体需求调整图像的质量和保真度。例如,在一些应用场景中,可能需要更高的图像质量,而在另一些场景中,可能更注重图像的自然度和真实感。通过调整这些参数,用户可以灵活地控制恢复结果,以满足不同的应用需求。
可控特征转换模块具有高度的灵活性和适应性,能够应用于多种不同的场景和需求。无论是在视频监控、照片修复还是身份识别等领域,这个模块都能够提供定制化的解决方案,满足不同场景下的人脸恢复需求。
此外,这个模块还能够结合其他图像处理技术,进一步提升恢复效果。例如,可以结合超分辨率技术提升图像的清晰度,或者结合去噪技术减少图像中的噪声。通过灵活地组合和应用这些技术,CodeFormer能够在各种复杂的退化条件下,提供高质量的人脸恢复结果。
对celeba检验的定性比较。即使输入面严重退化,我们的编码器也能产生具有忠实细节的高质量面。(放大以查看详细信息)
为了验证CodeFormer的性能,我们在多个广泛使用的人脸恢复数据集上进行了实验,包括CelebA-HQ、FFHQ和Helen等数据集。这些数据集包含大量高分辨率、高质量的人脸图像,能够提供丰富的训练和测试数据。我们将这些高质量图像人为退化,生成不同水平的低质量图像,以测试模型的恢复能力。
评估指标方面,我们主要采用以下几种常用的图像质量评估指标:
为了全面评估CodeFormer的性能,我们与几种当前最先进的人脸恢复方法进行了比较,包括ESRGAN、DFDNet和PULSE等。这些方法在各自的领域都有出色的表现,能够代表当前的技术水平。
通过对比实验,我们发现CodeFormer在各项评估指标上都表现出了显著的优势。特别是在PSNR和SSIM指标上,CodeFormer的结果显著优于其他方法。此外,在感知损失方面,CodeFormer也表现出了更好的感知保真度,能够生成更加自然和真实的人脸图像。
在定量结果分析中,我们通过统计多个评估指标的平均值,全面评估了不同方法的性能。以下是实验结果的一些关键数据:
在定性结果分析中,我们通过对比不同方法恢复的图像,直观展示了各方法的优缺点。以下是一些关键观察:
最名人的定量比较。红色和蓝色分别表示最佳和第二好的性能。代码GT的结果是编码器的上限。
对真实世界的LFW测试、网络照片测试和更广泛的测试的定量比较。红色和蓝色分别表示最佳和第二好的性能。
在Celeba测试中对变异网络和代码查找方法的消融研究。删除“码本”意味着网络是一个通用的编码-解码器结构。“w”是CFT模块的一个可调节系数,它控制着来自编码器的信息流。
码序列预测精度的曲线比较
以下图表展示了不同方法在PSNR和SSIM指标上的对比结果:
图1:PSNR对比图
| 方法 | 平均PSNR (dB) |
|-----------|---------------|
| ESRGAN | 28.2 |
| DFDNet | 28.7 |
| PULSE | 29.1 |
| CodeFormer| 30.5 |
图2:SSIM对比图
| 方法 | 平均SSIM |
|-----------|---------------|
| ESRGAN | 0.84 |
| DFDNet | 0.86 |
| PULSE | 0.88 |
| CodeFormer| 0.91 |
真实世界旧人脸照片的人脸颜色增强的视觉比较。
与最先进的人脸内画方法的视觉比较、
失败的案例往往发生在侧面,这可能是由于FFHQ训练数据集中的侧面图像数量有限造成的。
为了进一步验证CodeFormer的鲁棒性,我们测试了其在不同退化水平上的表现。通过改变图像退化的参数(例如噪声强度、模糊程度等),我们生成了一系列不同退化水平的低质量图像,并使用CodeFormer进行恢复。
实验结果表明,CodeFormer在不同退化水平下都能保持较高的恢复质量。即使在较严重的退化条件下,CodeFormer仍然能够有效地去除噪声和模糊,恢复出细节丰富、结构清晰的人脸图像。这表明CodeFormer具有较强的鲁棒性和泛化能力,能够适应各种复杂的实际应用场景。
应用界面设计,该应用程序的界面设计简洁而直观,采用Qt Designer构建,确保了跨平台的兼容性和高效的用户体验。主窗口由三个主要的选项卡组成:人脸图清晰化、全图清晰化和视频清晰化,每个选项卡针对不同的处理需求。CodeFormer不仅在盲人脸恢复任务中表现出色,还具有广泛的应用潜力,可以用于多种人脸图像处理任务。
人脸颜色增强是指在保持图像结构和细节的前提下,提升图像的颜色质量和视觉效果。CodeFormer可以通过其强大的特征建模能力,自动调整和优化人脸图像的颜色,使其更加自然和生动。
具体应用包括:
这些功能在照片编辑、美颜应用和影视后期处理中都有广泛的应用。
人脸修复是指修复图像中的损坏部分,使其恢复原本的面貌。CodeFormer通过其离散码本查找和特征转换能力,能够有效地修复图像中的缺失和损坏部分。
具体应用包括:
这些功能在照片修复、历史图像保护和美容应用中有重要的价值。
老旧照片增强是指提升和恢复老照片的质量,使其看起来更加清晰和细致。CodeFormer通过其强大的特征建模和图像恢复能力,能够有效地提升老旧照片的质量。
具体应用包括:
这些功能在历史图像修复、文化遗产保护和家庭相册恢复中有重要的应用。
随着AI生成图像技术的发展,生成的图像在某些情况下可能存在不自然或失真的问题。CodeFormer可以用于校正这些AI生成的图像,提升其自然度和真实感。
具体应用包括:
解压之后点开启动.bat即可运行、、
提示
项目文件夹需要放在全部为英文的路径
之后上传完目标文件夹以及保存的文件目标文件夹之后,点击开始处理
即可处理图片
注意
权重环境等因为太大所以放到百度云盘,使用前请解压
需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:Aspiringcode - 编程抱负 即刻实现
CodeFormer/
|
|-- assets/
|
|-- basicsr/
|
|-- configs/
|
|-- datasets/
|
|-- experiments/
|
|-- models/
| |-- codeformer.py
|
|-- scripts/
|
|-- tests/
|
|-- tools/
|
|-- train.py
|-- test.py
|-- inference_codeformer.py
|
|-- requirements.txt
1.依赖和安 装
首先,确保你的系统安装了以下依赖:
requirements.txt
中列出安装步骤如下:
# 克隆仓库
git clone https://github.com/sczhou/CodeFormer
cd CodeFormer
# 创建新的Anaconda环境
conda create -n codeformer python=3.8 -y
conda activate codeformer
# 安装Python依赖
pip3 install -r requirements.txt
python basicsr/setup.py develop
# 安装dlib,用于人脸检测或裁剪(如果需要)
conda install -c conda-forge dlib
2.下载预训练模型
下载facelib
和dlib
预训练模型到weights/facelib
文件夹。可以使用以下命令自动下载:
python scripts/download_pretrained_models.py facelib
python scripts/download_pretrained_models.py dlib # 仅当需要dlib人脸检测器时
同样地,下载CodeFormer预训练模型到weights/CodeFormer
文件夹:
scripts/download_pretrained_models.py CodeFormer
3.准备测试数 据
将测试图像放在inputs/TestWhole
文件夹中。如果需要测试裁剪和对齐的人脸,可以将它们放在inputs/cropped_faces
文件夹中。可以使用以下命令获取裁剪和对齐的人脸:
# 可能需要先安装dlib
conda install -c conda-forge dlib
python scripts/crop_align_face.py -i [input folder] -o [output folder]
4.测 试
# 对于裁剪和对齐的人脸(512x512)
inference_codeformer.py -w 0.5 --has_aligned --input_path [image folder]|[image path]
# 对于整图
# 使用'--bg_upsampler realesrgan'增强背景区域
# 使用'--face_upsample'进一步使用Real-ESRGAN上采样恢复的人脸
inference_codeformer.py -w 0.7 --input_path [image folder]|[image path]
注意
以上是模型训练部分
Demo/
|
|-- 启动程序.bat
|-- 请放到纯英文目录进行解压使用,不要放在中文路径中.txt
|--_internal
| |-- codeformer/
| |-- cuda/
| |-- GUI/
| | |gui.py
| | |main.ui
| |-- Python37/
| |-- clear_local_env.bat
| |-- python_console.bat
| |-- setenv.bat
使用PyQt5库构建GUI,并结合多线程和子进程执行外部命令。
这段Python脚本实现了一个基于PyQt5的GUI应用程序,用于执行和管理外部命令行进程,具体用于人脸恢复任务。以下是结合代码的具体解释:
导入模块:
import shutil
from PyQt5.QtWidgets import ...
import subprocess
import threading
脚本开始处导入了所需的模块,包括用于GUI开发的PyQt5组件、文件操作的shutil、执行外部命令的subprocess和多线程处理的threading。
自定义信号类 MySignals:
class MySignals(QObject):
text_print = pyqtSignal(str)
定义了一个信号类,包含一个text_print
信号,用于在子线程和主线程间传递字符串信息。
自定义线程类 CMDProcess:
class CMDProcess(threading.Thread):
def __init__(self, args, callback):
...
def run(self):
...
继承自threading.Thread
,用于执行外部命令。run
方法中使用subprocess.Popen
启动子进程,并持续读取输出直到子进程结束。
Stats 类:
class Stats:
def __init__(self):
...
def printToGui(self, text):
...
def select_input_path(self, tab_index):
...
def select_output_path(self, tab_index):
...
def update_infobox_ui(self, text, status_code):
...
def start_run(self):
...
Stats类是GUI应用程序的主要逻辑类。它加载UI布局,绑定信号和槽,定义配置参数,并启动后台处理。printToGui
方法将接收到的文本追加到文本浏览器中。select_input_path
和select_output_path
允许用户选择输入输出目录。update_infobox_ui
根据子进程状态更新UI。start_run
构建命令行参数并启动处理线程。
应用程序入口:
app = QApplication([])
app.setWindowIcon(QIcon('GUI/logo.jpg'))
stats = Stats()
stats.ui.show()
app.exec_()
设置应用程序实例,窗口图标,并启动事件循环。
GUI 组件和用户交互:
使用PyQt5的信号和槽机制,按钮点击事件与select_input_path
、select_output_path
和start_run
等函数连接,响应用户操作。
配置和命令行构建:
在start_run
方法中,根据当前选项卡索引构建命令行参数,例如:
cmd = [
"python", "-u", "CodeFormer/inference_codeformer.py",
"-i", self.config["input_path"],
"-o", self.config["output_path"],
"-w", self.config["fidelity_weight"],
...
]
构建的命令行用于执行人脸恢复脚本,参数包括输入路径、输出路径、保真度权重等。
启动和运行:
点击开始按钮后,start_run
方法会禁用按钮,显示“正在运行中…”,然后启动CMDProcess
线程执行构建的命令行。
异常处理和状态更新:
在CMDProcess
的run
方法中,子进程结束后,会调用callback
函数,通过update_infobox_ui
更新UI,显示“处理完成!”,并恢复开始按钮状态。
这段XML代码定义了一个使用Qt Designer设计的图形用户界面(GUI),用于一个专注于人脸图片高清修复的应用程序。以下是结合XML代码的具体组件和功能解释:
主窗口设置:
<widget class="QWidget" name="Form">
<property name="geometry">
</property>
<property name="windowTitle">
<string>人脸图片高清修复</string>
</property>
</widget>
这部分设置了应用程序主窗口的大小(564x779)和标题。
选项卡控件:
<widget class="QTabWidget" name="tabWidget">
QTabWidget
允许用户在不同的功能模块间切换,每个模块作为一个单独的选项卡。
人脸图清晰化选项卡
必选选项:包含输入和输出文件夹的选择控件。
<widget class="" name="groupBox_2">
...
<widget class="" name="">
<property name="placeholderText">
<string>请选择目标文件夹</string>
</property>
</widget>
<widget class="QPushButton" name="">
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
...
</widget>
额外选项:包含滑动条用于平衡细节和原图的忠实度。
<widget class="" name="">
...
<property name="maximum">
<number></number>
</property>
...
</widget>
4. 全图清晰化选项卡:
类似于人脸图清晰化选项卡,但增加了背景增强的复选框。
<widget class="QCheckBox" name="">
<property name="text">
<string>启用背景增强</string>
</property>
</widget>
5. 视频清晰化选项卡:
包含视频路径选择和视频帧率设置控件。
<widget class="QLineEdit" name="lineEdit_input_tab2">
<property name="placeholderText">
<string>选择视频文件</string>
</property>
</widget>
<widget class="QDoubleSpinBox" name="spinBox_fps">
...
<property name="maximum">
<double></double>
</property>
<property name="value">
<double></double>
</property>
</widget>
视频增强
确保先安装了ffmpeg:
conda install -c conda-forge ffmpeg
然后执行视频增强:
# 对于视频片段
# 视频路径应以'.mp4'|'.mov'|'.avi'结尾
inference_codeformer.py --bg_upsampler realesrgan --face_upsample -w 1.0 --input_path [video path]
人脸着色(裁剪和对齐的人脸)
# 对于裁剪和对齐的人脸(512x512)
# 着色黑白或褪色照片
inference_colorization.py --input_path [image folder]|[image path]
参考文章: https://arxiv.org/pdf/2206.11253 GitHub - sczhou/CodeFormer: [NeurIPS 2022] Towards Robust Blind Face Restoration with Codebook Lookup Transformer