人脸替换(FaceSwap)的一些思考
本文链接:https://blog.csdn.net/cy1070779077/article/details/85224347
人脸替换(FaceSwap)的一些思考

最一开始,我使用了openCV(一个机器学习视觉库)的一个比较专业的tutorial(之前人脸检测也是使用了这个)中提供的一种人脸替换的方式。主要思路是,假设脸A要替换为脸B,先检测出脸A和脸B的脸部标记(facial landmarks,包括眼睛、鼻子、嘴巴等等诸多特征点的位置),针对脸B所有特征点构造一个凸包,凸包(外边界)上的点两两连接,可以划分出很多小的三角形,然后利用微分的思想将这些每个小三角形替换(仿射等变换)到脸A对应的位置,最后openCV提供了让结果图显得看起来自然一些的处理函数(泊松克隆,Seamless cloning)。
其实以上这种处理方式对图片上的人脸替换应用需求已经比较足够了,比如图output.jpg,它原本是特朗普的脸,替换为了泰德·科鲁兹的脸(虽然乍一看有些不自然,但感觉总体还是不错的)
接下来我使用Premiere自制了一段简单的小视频,本质上就是特朗普图片的缩放和移动。然后我们进行视频中人脸的替换实验,得到输出视频。我们很容易发现存在的问题,就是视频中脸部的抖动问题。
(以上这个方法和我之前在处理的模块化的应用一样,实现步骤比较简易,但是由于预期目标的不同,所以可能给人的满意度会大有不同。像人脸检测的话,我们的bounding box有一定抖动其实影响不大,但是人脸替换则不然。)
关于脸部抖动的原因,我思考了一下,主要应该是因为人脸检测的时候每一帧得到的每个脸部标记点的相对位置变动性导致的。通俗地讲,第1帧的鼻子和嘴巴的标记点之间可能距离20个像素点,但是第2帧的鼻子和嘴巴的标记点之间可能距离25个像素点,因为我们送入到人脸检测模型里的是一帧对应的一整张图片,人脸的大小以及人脸在这整张图片上的位置都会影响最后脸部每个标记点的位置以及标记点之间的相对位置。所以导致了从第1帧到第2帧可能发生的脸部抖动的问题。
所以我也查阅了一下其他的人脸替换方法。
第一个是DeepFakes,它是使用深度神经网络做图像生成。我大致看了一下它的基本思想,通俗地讲,假设要把脸A替换为脸B,那么我们自行将脸B的图片进行各种方式的扭曲化(扭曲方式应该是有讲究的),得到大量扭曲化图片的集合S_B,我们训练一个深度神经网络模型M能将S_B里每张扭曲化的脸还原为脸B,之后我们把脸A送入模型M,这样我们就能较好的实现把脸A替换为脸B。
第二个是DeepFaceLab,也只是大致看了一下,需要使用tensorflow机器学习框架。
这两种方法和一开始第一种方法不同。一开始第一种方法只是在人脸检测的过程中运用了机器学习的思想,用的是pretrained的预测模型,而真正到替换的时候只是简单的做仿射变换而已;但是后两种的话就比较彻底、完整地在使用机器学习方法做人脸替换,效果个人感觉应该会好不少。但是后两种方法如果想要较好地利用起来可能还得花不少时间配置环境、看懂技术细节。
————————————————
版权声明:本文为CSDN博主「RoyChen97」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cy1070779077/article/details/85224347
人脸替换(FaceSwap)的一些思考的更多相关文章
- 【工作代码】复杂 JSON 值替换处理
总结下最近的工作遇到的点:入参复杂 JSON 层层嵌套,Java 怎么优雅的处理. 一.关于 JSON JSON 是类似 XML 用于存储和交互文本信息.但优于 XML ,其更小,更快,更易懂和解析. ...
- 让视障者的网络之路少一些障碍——微软为 Edge 浏览器开发自动图像描述功能并呼吁网页作者补充图片的替换说明
网页是互联网的组成部分,浏览器是开启互联网大门的钥匙.对于生活在信息时代下的我们而言,每一个人都很难离开网络而生活,其中也包括盲人这一残障群体. 本文的引子是如下一条新闻: IT之家3月18日消息,微 ...
- Shell之sed用法 转滴
通过例子学习sed的用法 1,sed介绍 sed可删除(delete).改变(change).添加(append).插入(insert).合.交换文件中的资料行,或读入其它档的资料到 文> ...
- 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]
參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...
- python 全栈开发,Day67(Django简介)
昨日内容回顾 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2 协议 请求头 key:value 请求体 a=1&b=2(只有p ...
- OpenFaceswap 入门教程(2):软件使用篇!
安装完OpenFaceswap之后,是不是就迫不及待的想要“见证奇迹”了呢? 都说磨刀不误砍柴工.开始之前请先做一个准备.然后大致了解一下换脸的过程 换脸基本步骤是: 把视频切成很多图片 把图片中的人 ...
- DeepFaceLab小白入门(3):软件使用!
换脸程序执行步骤,大部分程序都是类似.DeepFaceLab 虽然没有可视化界面,但是将整个过程分成了8个步骤,每个步骤只需点击BAT文件即可执行.只要看着序号,一个个点过去就可以了,这样的操作应该不 ...
- DeepFaceLab小白入门(2):软件安装!
严格上来说这个软件本身并不需要安装,他唯一需要的就是对应版本的显卡驱动,CUDA和CuDNN都非必须.下面我说一下如何安装正确的驱动版本.我尽量写得简洁清晰,希望大家都能看懂,但是,如果你连基本的电脑 ...
- 【部分原创】python实现视频内的face swap(换脸)
1.准备工作,按博主的环境为准 Python 3.5 Opencv 3 Tensorflow 1.3.1 Keras 2 cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装 那就先 ...
随机推荐
- java8 lamb表达式对List排序
场景一:List<Long> 或其他泛型,非对象 List<Long> ids = new ArrayList(); ids.add(100000001L); ids.add( ...
- 手写一个简易版Tomcat
前言 Tomcat Write MyTomcat Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器.那么想一想,Tomcat和我们的Web应用是什么关系? 从感性上 ...
- ISCC之msc1(签到题)
V2VsbCBkb25lIQoKIEZsYWc6IElTQ0N7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K Flag: ISCC{N0_0ne_can_st0p_y0u} 签到题 八进制 ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- P1341 无序字母对[欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...
- redis都有哪些数据类型?分别在哪些场景下使用比较合适?
(1)string 这是最基本的类型了,没啥可说的,就是普通的set和get,做简单的kv缓存 (2)hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象 ...
- “只有DBA才能导入由其他DBA导出的文件”各种解决办法
“只有DBA才能导入由其他DBA导出的文件”各种解决办法 当oracle导入的时候出现“只有 DBA 才能导入由其他 DBA 导出的文件”的时候通常有以下几种解决办法! 1:常见的是直接grant ...
- python 类 双下划线解析
__getattr__用法:说明:这是python里的一个内建函数,当调用的属性或者方法不存在时,该方法会被调用调用不存在的属性调用不存在的方法
- 织梦DedeCMS会员空间内的文章列表无法分页的解决方法
DedeCMS 5.7会员空间的文章列表分页显示不正常,总是显示0页0条记录错误.下面告诉大家如何解决这个问题: 找到并打开include/arc.memberlistview.class.php文件 ...
- spring mvc 坑之PUT,DELETE方法接收不到请求参数
https://www.cnblogs.com/roobtyan/p/9576685.html 原因: Tomcat处理参数的问题: 1.将请求体中的数据,封装成一个map 2.request. ...