换脸效果媲美GAN!一文解析OpenAI最新流生成模型「Glow」

640

640?


在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考。


在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果。


点击本文底部的「阅读原文」即刻加入社区,查看更多最新论文推荐。

这是 PaperDaily 的第 90 篇文章

本期推荐的论文笔记来自 PaperWeekly 社区用户 @TwistedW基于流的生成模型在 2014 年已经被提出,但是一直被忽视。由 OpenAI 带来的 Glow 展示了流生成模型强大的图像生成能力。文章使用可逆 1 x 1 卷积在已有的流模型 NICE 和 RealNVP 基础上进行扩展,精确的潜变量推断在人脸属性上展示了惊艳的实验效果。

如果你对本文工作感兴趣,点击底部阅读原文即可查看原论文。

关于作者:武广,合肥工业大学硕士生,研究方向为图像生成。

■ 论文 | Glow: Generative Flow with Invertible 1x1 Convolutions

■ 链接 | https://www.paperweekly.site/papers/2101

■ 源码 | https://github.com/openai/glow


图像生成在 GAN 和 VAE 诞生后得到了很快的发展,现在围绕 GAN 的论文十分火热。生成模型只能受限于 GAN 和 VAE 吗?OpenAI 给出了否定的答案,OpenAI 带来了 Glow,一种基于流的生成模型


虽然基于流的生成模型在 2014 年就已经提出来了,但是一直没有得到重视。Glow 的作者在之前已经在基于流的生成模型上提出了 NICE [1]RealNVP [2],Glow 正是在这两个模型基础加入可逆 1 x 1 卷积进行扩展,精确的潜在变量推断在人脸属性上展示了惊艳的实验效果,具体效果可在 OpenAI 放出的 Demo [3] 下查看。


论文引入


随着深度神经网络的发展,生成模型也得到了巨大的飞跃。目前已有的生成模型除了 Glow 外包括三大类,GAN、VAE 和 Autoregressive Model(自回归模型)。 其中自回归模型和 VAE 是基于似然的方法,GAN 则是通过缩小样本和生成之间的分布实现数据的生成。文中对这些已有的生成模型也做了一个小结:


1. 自回归模型(Autoregressive Model):自回归模型在 PixelCNN 和 PixelRNN 上展示了很不错的实验效果,但是由于是按照像素点去生成图像导致计算成本高, 在可并行性上受限,在处理大型数据如大型图像或视频是具有一定麻烦的。 


2. 变分自编码器(VAE):VAE 是在 Autoencoder 的基础上让图像编码的潜在向量服从高斯分布从而实现图像的生成,优化了数据对数似然的下界,VAE 在图像生成上是可并行的, 但是 VAE 存在着生成图像模糊的问题,Glow 文中称之为优化相对具有挑战性。 


3. 生成对抗网络(GAN):GAN 的思想就是利用博弈不断的优化生成器和判别器从而使得生成的图像与真实图像在分布上越来越相近。GAN 生成的图像比较清晰, 在很多 GAN 的拓展工作中也取得了很大的提高。但是 GAN 生成中的多样性不足以及训练过程不稳定是 GAN 一直以来的问题,同时 GAN 没有潜在空间编码器,从而缺乏对数据的全面支持。 


基于流的生成模型,首先在 NICE 中得到提出并在 RealNVP 中延伸。可以说流的生成模型被 GAN 的光芒掩盖了,但是是金子总会发光。Glow 一文算是将流生成模型推到了学术的前沿,已经有很多学者在讨论 Glow 的价值,甚至有说 Glow 将超越 GAN


具体还要看学术圈的进一步发展,不过 Glow 确实在图像的生成,尤其是在图像编码得到的潜在向量精确推断上展示了很好的效果。在 OpenAI 放出的 Demo 上展示了很惊艳的实验效果,就人脸合成和属性变化上可以看出 Glow 确实可以媲美 GAN。


基于流的生成模型总结一下具有以下优点:


  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现AI换脸,我们可以使用Python和一些深度学习库,例如PyTorch和OpenCV。下面是一个简单的AI换脸模型,供参考: 首先,我们需要下载一个预训练的人脸识别模型和一个预训练的图像生成模型。这里我们可以使用OpenFace和StyleGAN2。 ```python # 下载预训练的人脸识别模型 !wget https://storage.cmusatyalab.org/openface-models/nn4.small2.v1.t7 # 下载预训练的StyleGAN2模型 !wget https://github.com/NVlabs/stylegan2-ada-pytorch/releases/download/pretrained/ffhq.pkl ``` 接下来,我们可以编写一个函数,使用OpenCV和人脸识别模型来检测图像中的人脸。 ```python import cv2 import dlib import torch import numpy as np # 加载人脸识别模型 face_detector = dlib.get_frontal_face_detector() face_encoder = dlib.face_recognition_model_v1("nn4.small2.v1.t7") def detect_faces(img): # 将图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_detector(gray, 1) # 提取每个人脸的编码 encodings = [] for face in faces: # 获取人脸区域的边界框 (x, y, w, h) = face_utils.rect_to_bb(face) # 提取人脸区域的编码 face_img = img[y:y+h, x:x+w] face_img = cv2.resize(face_img, (96, 96)) face_img = np.transpose(face_img, (2, 0, 1)) face_tensor = torch.from_numpy(face_img).float().unsqueeze(0) encoding = face_encoder(torch.autograd.Variable(face_tensor)) encodings.append(encoding.data.numpy()[0]) return faces, encodings ``` 然后,我们可以编写一个函数,使用预训练的StyleGAN2模型生成一个具有指定编码的图像。 ```python import io import PIL.Image import torch import torchvision import torchvision.transforms.functional as F # 加载StyleGAN2模型 generator = torch.load("ffhq.pkl")["G_ema"].cuda() def generate_image_from_encoding(encoding): # 将编码转换为Tensor encoding = torch.from_numpy(encoding).cuda() # 使用StyleGAN2生成图像 with torch.no_grad(): image = generator([encoding], truncation=0.7, truncation_latent=None)[0] image = (image + 1) / 2.0 image = F.to_pil_image(image.cpu()) # 将图像转换为NumPy数组 buf = io.BytesIO() image.save(buf, format='JPEG') buf.seek(0) img_array = np.asarray(bytearray(buf.read()), dtype=np.uint8) img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) return img ``` 最后,我们可以编写一个函数,将一个人的脸替换为另一个人的脸。 ```python def swap_faces(img1, img2): # 检测第一个图像中的人脸 faces1, encodings1 = detect_faces(img1) # 检测第二个图像中的人脸 faces2, encodings2 = detect_faces(img2) # 如果没有检测到人脸,返回原始图像 if len(faces1) == 0 or len(faces2) == 0: return img1 # 选择第一个图像中的第一个人脸 face1 = faces1[0] encoding1 = encodings1[0] # 选择第二个图像中的第一个人脸 face2 = faces2[0] encoding2 = encodings2[0] # 生成第一个图像中的人脸的新图像 new_img1 = generate_image_from_encoding(encoding2) # 将第二个图像中的人脸替换为第一个图像中的人脸 (x1, y1, w1, h1) = face1_utils.rect_to_bb(face1) (x2, y2, w2, h2) = face_utils.rect_to_bb(face2) new_img2 = img2.copy() new_img2[y2:y2+h2, x2:x2+w2] = cv2.resize(new_img1[y1:y1+h1, x1:x1+w1], (w2, h2)) return new_img2 ``` 使用这个函数,我们可以将一个人的脸替换为另一个人的脸。 ```python # 加载两个图像 img1 = cv2.imread("img1.jpg") img2 = cv2.imread("img2.jpg") # 将第二个图像中的人脸替换为第一个图像中的人脸 new_img = swap_faces(img1, img2) # 显示结果图像 cv2.imshow("Result", new_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这是一个简单的AI换脸模型,可以根据需要进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值