卷积“换脸”

图像风格转换[1][2][3]在效果上的成功,使得研究者们开始拓展它的应用范围,换脸就是其中之一。在图像风格转换算法框架下,如果将风格图像换做目标人脸,那么就有可能将图像中的人脸换掉。

由于图像风格转换的算法框架下是语义级别的图像内容操作,因而,在图像风格转换框架下的换脸可以达到原图的表情、肤色、光照不变。

在这里插入图片描述

上图中,a是原图,b是由本文描述的算法得到的结果,c是直接使用图像编辑软件得到的结果。

本文的算法来源于参考文献[4].下面将对算法细节进行进行描述。

算法细节

图像预处理

在这里插入图片描述

想要进行换脸操作,首先要将脸的位置对齐,这个步骤使用两种技术,人脸对齐和背景切分。对齐使用如下步骤:

  • 获取原图和目标图中人脸的68个关键点
  • 通过对这68个关键点进行线性变换,将原图中的人脸摆正。
  • 通过对这68个关键点进行匹配,将目标图中的人脸映射到原图中人脸的位置。
  • 将原图中的人脸与背景切分,以方便后续只对人脸区域进行操作。

网络结构

在这里插入图片描述

延循之前的算法框架,本算法采用一种多尺寸结构,小尺寸的图像经过卷积后自动上采样为2倍大小,然后再和大尺寸的图像进行通道连接。

没去看之前的算法框架为何要采用这样的方式,但个人推测是为了保证分辨率,因为在低分辨率的图像上容易训练。

损失函数

内容损失

同[1][2][3]类似,图像的损失函数是基于一个已经训练好的神经网络里的feature_map。类似的,内容损失函数为:

在这里插入图片描述

风格损失

针对人脸问题,风格损失函数做了一些修改,因为Gram Matrix不能够捕捉到图像中的结构信息,因而在人脸问题上不能应用,所以,本文使用[3]中的最近邻方法,即原图中的某个位置的图像用目标图中最相似的片段进行替换。

但同[3]不同的是,[3]中对于原图中的某个patch,搜索域是全局域,即在全局域去寻找相似patch,而本文算法则根据从人脸中提取的关键点来对搜索域进行限制。即对输入图像的人脸的某个部分,只在目标图中的某个部分附近进行相似patch搜索。

本算法还有一个要求:需要目标人脸的多张图像,即多张风格图像。在相似patch搜索时,损失在图像区域上有所限制,但是可以在多张图像提取的patch上进行搜索,这样,可以保证能够复现多种多样的表情。

所以,风格损失函数为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

光照损失

上述两种损失函数都是依赖于从训练好的VGG网络中提取的特征图,而VGG网络是针对分类训练的网络,并不能特定的提取光照特征。

为了保持换脸过程中光照保持不变,那么需要对光照上的变换进行惩罚。而为了提取光照变化,算法针对光照训练了一个CNN分类器,针对两张除了光照外其他都不变的图像,分类器判断这一对图像是否发生了光照变换。

使用从这个网络中得到的feature map进行光照损失的计算

在这里插入图片描述

平滑损失

与其他类似,

在这里插入图片描述

损失函数

综上所述,损失函数为

在这里插入图片描述

效果

在本算法框架下,针对每一个目标人脸,都需要一个网络。训练了两个网络,一个是Nicolas Cage,另一个是Taylor Swift。

在这里插入图片描述

正脸的作用

对比了各种角度人脸的替换结果

在这里插入图片描述

越是正脸,就越像Cage,原因可能是数据的不均衡性导致的,因为目标图像中侧脸比较少。

光照损失的作用

在这里插入图片描述

左中右分别为,原图,带光照损失的换脸和不带光照损失的换脸。

风格损失权重的作用

在这里插入图片描述

左中右分别为,原图,风格损失权重=80,风格损失权重=120。

错误示例

在这里插入图片描述

左中,遮挡物被去掉了,说明算法不支持遮挡物
右,效果差,因为不是正脸,且pose比较少见。

总结

可提升之处:

  • 生成图像的质量来源于目标图像的丰富性。侧脸的差效果可能是因为目标图像中侧脸的图像少的缘故。增加目标图像的丰富程度可以提升效果
  • 一些图像看起来被过度平滑了,添加GAN损失可能能解决这个问题。
  • 修改损失函数使遮挡物可以保存下来。
  • 增强人脸关键点检测算法。
  • 使用VGG-Face网络来进行内容损失和风格损失的计算。

参考文献

更多内容欢迎关注微信公众号【雨石记】。

### AI技术的Python实现 AI技术涉及多个复杂的计算机视觉和机器学习过程,包括但不限于面部检测、对齐、提取以及最终的部交。下面提供一种基于深度神经网络的方法来完成这一任务。 #### 面向初学者的基础概念介绍 为了更好地理解整个流程,在深入探讨具体代码之前,先简要介绍一下几个核心组件: - **面部识别**:通过训练好的模型找到并定位图像中的人位置[^1]。 - **特征点标记**:确定每张人的关键部位坐标,比如眼睛、鼻子等位置信息,这有助于后续处理阶段保持自然外观[^2]。 - **生成对抗网络(GANs)**:利用两个相互竞争的学习机制——生成器试图创建逼真的伪造品;判别器则努力区分真实样本与假造物之间的差异。经过多轮迭代优化后,生成器能够产出高质量的目标对象替效果。 #### 实现步骤概览 以下是使用Python编程语言执行AI操作的一个简化版本概述: 1. 安装必要的库文件,如`dlib`, `face_recognition` 和 `tensorflow`. 2. 加载源图片(即想要被替成其他人的那部分),目标图片(用来替代原图上某个人的新面孔)。这两者都需要事先准备好,并确保它们都含有清晰可辨识的人像。 3. 应用预训练模型对面孔进行定位及关键点标注。 4. 使用卷积神经网络(CNN)或其他先进的算法从目标照片里抽取特定个体的身份特征。 5. 将这些特性映射到原始影像对应区域之上,调整大小使之匹配最佳比例尺关系。 6. 利用循环一致性损失函数指导下的条件GAN架构合成新的混合画面。 7. 对结果做最后润饰工作,消除可能存在的瑕疵或不连续之处,使整体看起来更加和谐统一。 下面是具体的Python代码片段用于展示上述某些环节的操作方式: ```python import cv2 from deepface import DeepFace import numpy as np def load_image(image_path): img = cv2.imread(image_path) rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) return rgb_img source_face = DeepFace.analyze(load_image('path_to_source.jpg'), actions=['gender', 'age']) target_faces = DeepFace.find(img_path='path_to_target.jpg', db_path='./database') for target_face in target_faces: swapped_image = swap_faces(source_face['region'], target_face['facial_area']['coordinates'], source=load_image('path_to_source.jpg')) output_file_name = f'swapped_{target_face["identity"].split("/")[-1]}' cv2.imwrite(output_file_name, cv2.cvtColor(swapped_image, cv2.COLOR_RGB2BGR)) ``` 这段脚本展示了如何加载两张图片并将其中一张上的部特征转移到另一张上去的过程。需要注意的是这里使用的`deepface`库已经包含了内置的支持多种功能的任务接口,使得开发者无需手动编写过多底层逻辑就能快速搭建起原型系统.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值