本文链接: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. c# 计算目录的大小

  2. Linux之nginx负载均衡

    Nginx负载均衡概述 Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现 ...

  3. WampServer详解

    php能做什么,它是运行在服务器端的,web网站大部分数据都是存储在服务器上的,PHP就是用来处理这些存储在服务器的数据.跨平台,服务器可以是多种平台上的服务器,脚本语言,免费. wampserver ...

  4. java对象json序列化时忽略值为null的属性

    环境: jdk: openjdk11 操作系统: windows 10教育版1903 目的: 如题,当一个对象里有些属性值为null 的不想参与json序列化时,可以添加如下注解 import com ...

  5. 【HICP Gauss】数据库 数据库高级语法(数据类型函数)-3

    SQL高级语法:整型:   integer 2(-31) ~2(31)-1 4字节 intger unsigned 2(0)~2(32)-1 4字节 bigint 2(-63)~2(63)-1 8字节 ...

  6. zabbix-web切换为nginx及https

    目录 zabbix-web切换为nginx及https 1.背景和环境 2.安装nginx 2.1.编译参数 2.2.修改配置文件并配置https 2.3.配置nginx为系统服务 3.安装php 3 ...

  7. 剑指Offer(二十三):二叉搜索树的后序遍历序列

    剑指Offer(二十三):二叉搜索树的后序遍历序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  8. mysql-proxy读写分离笔记

    1.MySQL的安装与配置 --省略 版本:Server version: 5.6.35 1.1 系统版本: [root@centos7-67 package]# lsb_release -a LSB ...

  9. Tensorflow细节-P170-图像数据预处理

    由于6.5中提出的TFRecord非常复杂,可扩展性差,所以本节换一种方式 import tensorflow as tf from tensorflow.examples.tutorials.mni ...

  10. YAML_01 YAML语法和playbook写法

    ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述.yaml之于json就像markdown之于html一样,极度简化了json的书写.在学习ansible pla ...