随着人工智能技术的飞速发展,机器学习领域迎来了新的突破。机器不仅能够从经验中学习,还能适应新的输入,并执行类似人类的任务。在社交媒体上,AI应用的流行趋势之一是能够对人脸应用酷炫滤镜、编辑视频和创造有趣的深度伪造视频。本文将探讨一种特定的神经网络架构,它能够将老旧、模糊、扭曲的人脸照片恢复成接近完美的真实图像。将特别关注两种神经网络架构——GFP-GAN和DFDNet。
模糊图像恢复技术可以将具有怀旧或情感价值的老旧、扭曲照片恢复为高质量的清晰图像。还可以修复因照片质量问题或相机移动导致的模糊或扭曲的近期照片,将其恢复为去模糊、高质量的图像。此外,使用质量较差的CCTV摄像头拍摄的视频可能难以识别视频中的人脸,GFP-GAN可以用来从CCTV视频捕获的静态图像中恢复人脸。
GFP-GAN由预训练在人脸数据集上的生成对抗网络(GAN)和用于去除退化的U-Net模块组成。通过潜在代码映射和多层CS-SFT(通道分割空间特征变换)将这两部分连接起来。退化去除模块从损坏/模糊照片中提取潜在特征并去除退化。预训练的StyleGAN2模型(生成前体)使用多层感知器生成风格向量,用于产生中间卷积特征以进一步调制最终输出。然后使用通道分割预测变换,用于缩放和位移特征图。最后,计算损失并用于改进训练,直到获得最佳质量结果。
让逐步查看代码,并尝试对一些随机模糊/扭曲的图像进行去模糊处理。首先,克隆GFP-GAN的git仓库并安装并导入必要的库。
# 克隆GFP-GAN仓库
!git clone https://github.com/TencentARC/GFPGAN.git
# 安装BasicSR和facexlib库
!pip install basicsr facexlib
# 安装其他依赖
!pip install -r requirements.txt
# 下载预训练模型
!wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P experiments/pretrained_models
接下来,上传输入图像到会话存储,并使用下载的预训练模型生成去模糊图像。
# 上传图像
import os
from google.colab import files
import shutil
upload_folder = 'inputs/upload'
if os.path.isdir(upload_folder):
shutil.rmtree(upload_folder)
os.mkdir(upload_folder)
uploaded = files.upload()
for filename in uploaded.keys():
dst_path = os.path.join(upload_folder, filename)
print(f'move {filename} to {dst_path}')
shutil.move(filename, dst_path)
# 生成去模糊图像
!python inference_gfpgan.py -i inputs/upload -o results -v 1.3 -s 2 --bg_upsampler realesrgan
最后,使用OpenCV可视化去模糊恢复的图像。在Colab中,图像将与原始输入图像和恢复后的图像并排显示。
import cv2
import matplotlib.pyplot as plt
def display(img1, img2):
fig = plt.figure(figsize=(25, 10))
ax1 = fig.add_subplot(1, 2, 1)
plt.title('输入图像', fontsize=16)
ax1.axis('off')
ax2 = fig.add_subplot(1, 2, 2)
plt.title('GFP-GAN输出', fontsize=16)
ax2.axis('off')
ax1.imshow(img1)
ax2.imshow(img2)
def imread(img_path):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
return img
input_folder = 'inputs/upload'
result_folder = 'results/restored_imgs'
input_list = sorted(glob.glob(os.path.join(input_folder, '*')))
output_list = sorted(glob.glob(os.path.join(result_folder, '*')))
for input_path, output_path in zip(input_list, output_list):
img_input = imread(input_path)
img_output = imread(output_path)
display(img_input, img_output)
DFDNet可以分为两个部分——分解模块和恢复模块。分解模块在不同面部轮廓、形状和姿势的高质量图像上进行训练。K-means算法用于对面部的每个部分(眼睛、耳朵等)进行聚类。恢复模块使用字典特征变换块来指导恢复过程并生成结果。
!git clone https://github.com/csxmli2016/DFDNet.git
!mkdir /content/DFDNet/checkpoints/
!mkdir /content/DFDNet/checkpoints/facefh_dictionary
!mkdir /content/DFDNet/weights/
!mkdir /content/DFDNet/DictionaryCenter512/
from google.colab import drive
drive.mount('/gdrive')
!cp '/gdrive/My Drive/DFDNet/checkpoints/facefh_dictionary/latest_net_G.pth' '/content/DFDNet/checkpoints/facefh_dictionary'
!cp '/gdrive/My Drive/DFDNet/weights/vgg19.pth' '/content/DFDNet/weights/'
!cp -r '/gdrive/My Drive/DFDNet/DictionaryCenter512/' '/content/DFDNet/'
!pip install dominate
!python setup.py install
import os
os.chdir('/content/DFDNet/FaceLandmarkDetection/')
!python test_FaceDict.py