本文链接: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)的一些思考的更多相关文章

  1. 【工作代码】复杂 JSON 值替换处理

    总结下最近的工作遇到的点:入参复杂 JSON 层层嵌套,Java 怎么优雅的处理. 一.关于 JSON JSON 是类似 XML 用于存储和交互文本信息.但优于 XML ,其更小,更快,更易懂和解析. ...

  2. 让视障者的网络之路少一些障碍——微软为 Edge 浏览器开发自动图像描述功能并呼吁网页作者补充图片的替换说明

    网页是互联网的组成部分,浏览器是开启互联网大门的钥匙.对于生活在信息时代下的我们而言,每一个人都很难离开网络而生活,其中也包括盲人这一残障群体. 本文的引子是如下一条新闻: IT之家3月18日消息,微 ...

  3. Shell之sed用法 转滴

    通过例子学习sed的用法 1,sed介绍    sed可删除(delete).改变(change).添加(append).插入(insert).合.交换文件中的资料行,或读入其它档的资料到 文> ...

  4. 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]

    參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...

  5. python 全栈开发,Day67(Django简介)

    昨日内容回顾 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2 协议 请求头 key:value 请求体 a=1&b=2(只有p ...

  6. OpenFaceswap 入门教程(2):软件使用篇!

    安装完OpenFaceswap之后,是不是就迫不及待的想要“见证奇迹”了呢? 都说磨刀不误砍柴工.开始之前请先做一个准备.然后大致了解一下换脸的过程 换脸基本步骤是: 把视频切成很多图片 把图片中的人 ...

  7. DeepFaceLab小白入门(3):软件使用!

    换脸程序执行步骤,大部分程序都是类似.DeepFaceLab 虽然没有可视化界面,但是将整个过程分成了8个步骤,每个步骤只需点击BAT文件即可执行.只要看着序号,一个个点过去就可以了,这样的操作应该不 ...

  8. DeepFaceLab小白入门(2):软件安装!

    严格上来说这个软件本身并不需要安装,他唯一需要的就是对应版本的显卡驱动,CUDA和CuDNN都非必须.下面我说一下如何安装正确的驱动版本.我尽量写得简洁清晰,希望大家都能看懂,但是,如果你连基本的电脑 ...

  9. 【部分原创】python实现视频内的face swap(换脸)

    1.准备工作,按博主的环境为准 Python 3.5 Opencv 3 Tensorflow 1.3.1 Keras 2 cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装 那就先 ...

随机推荐

  1. 3D中OBJ文件格式详解

    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...

  2. mysql数据库备份,主从复制及半同步复制

    1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-dat ...

  3. [堆栈]Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    转自:https://blog.csdn.net/yangkuanqaz85988/article/details/52403726 问题1:不同线程/进程拥有着不同的栈,那系统所有的中断用的是同一个 ...

  4. HTML&CSS基础-样式的继承

    HTML&CSS基础-样式的继承 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> & ...

  5. React系列,jsx

    <script type="text/babel"> var name = "kimoo"; var fn = ()=> "kimo ...

  6. elementUI 控制 DatePicker组件 不能选择 设定的日期

    <el-date-picker v-model="date" type="daterange" range-separator="至" ...

  7. 瀑布流(基于Django)

    # 后端 from django.shortcuts import render, HttpResponse from django.http import JsonResponse from app ...

  8. drf框架 - 过滤组件 | 分页组件 | 过滤器插件

    drf框架 接口过滤条件 群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16 ...

  9. VC中文件路径问题

    环境:xp+vs2010 1.如果出现这样的路径,input.txt表示在解决方案目录(前提是项目包在解决方案目录下的一个包)下,也就是与你的解决方案XXX.sln平行. ifstream in(&q ...

  10. vue中url带有#号键,去除方法

    在写vue项目中,发现路由跳转总是带有#,在获取数据中带来不必要的麻烦,如果我们不希望 路由中出现 # ,那怎么办呢? 解决办法: 在router ---->index 中 添加代码   mod ...