市面上有多款AI换脸的方法,笔者这里节选了Github那年很火的开源项目FaceSwap:

(很早就实践了,但是忘记记录啦hhh,请勿用于不正当用途哦)

做了一篇详细教学,包括配置,参数设置,换脸效果经验之谈。感兴趣的学友可以留言一起交流。

先上成果展示下吧(垃圾显卡跑了2天,有条件好的显卡跑个1周估计效果会好一些):

配置部分

ok,为了实现换脸,我们先从安装到配置工具开始(配置好的请直接跳到第一步),以下请按步骤操作:

首先需要下载该项目,这里建议直接下载GUI版软件:https://faceswap.dev/download/

然后是安装:

第一页选择安装地址,根据自己喜好。

第二页需要选择GPU或者CPU版。 有支持的GPU进行训练当然是最好的,如果没有的话只能CPU了(提取,训练过程很慢)

{ PS: 如何查询是否支持呢,

GPU版需要保证三个包是匹配的:

tensorflow-GPU, cuda,cudnn

首先,更新显卡驱动:https://www.nvidia.com/Download/index.aspx?lang=en-us

其次,下载与GPU匹配的cuda:https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64

最后,下载与GPU匹配的cudnn:   https://developer.nvidia.com/zh-cn/cudnn

最最后下载tensorflow-GPU

}

安装好以后启动,界面如下:

(landmark是68个点,提取生成的带landmark和遮罩的文件格式是fsa,不是fsd,懒得重写了,hh)

操作部分

第一步:

好的,我们开始第一步,  extract的目的是:从视频中的每一帧提取人脸,生成图片集和一个fsa文件(带landmark和mask的数据集),用于模型训练的输入。

什么是landmark?如下图,是指算法识别出的每张图片人脸边界的68个点。

什么是mask?如下图,是指算法识别出的每张脸的脸区,摒弃遮挡/背景/头发等信息。

简单来说,提取包括三个阶段:检测、对齐和遮罩生成:

  • 检测- 在框架内查找人脸的过程。检测器扫描图像并选择图像中它认为是人脸的区域。
  • 对齐- 找到面部内的“landmark”并一致地定向面部。这会将候选者从检测器中取出,并尝试找出潜在面部的关键特征(眼睛、鼻子等)在哪里。然后它会尝试使用此信息来对齐面部。
  • 遮罩生成- 识别包含面部的对齐面部部分,并屏蔽那些包含背景/障碍物的区域。

1.1 Data模块:

  • Input Dir:首先我们需要一个源文件。此处设置为视频文件(视频图标)或包含一系列图像的文件夹(图片图标)。

  • Output Dir:接下来我们需要告诉进程将提取的人脸图片集保存到哪里。单击旁边的文件夹图标以选择输出位置

  • Alignments:此选项用于为对齐文件指定不同的名称/位置。建议留空,则生成的fsa文件会保存到默认位置,与源视频名字相同(与源视频/源图位于同一位置)

1.2 plugins对应的设置如下图:

1.2.1 遮罩

plugins模块用于首先检测图像中的人脸、读取人脸标志以对齐图像并使用各种遮罩方法创建遮罩。

  • Detector, Aligner:检测和对齐的算法,推荐使用S3FD作为检测算法, FAN作为对齐算法 。(二者效果好,对显卡要求高)

  • Masker:遮罩的算法。除了基于人脸landmark的遮罩之外,此处是另一种针对人脸区域的特殊遮罩(可不选,也可多选,好的遮罩算法有助于过滤掉遮挡物)。遮罩都使用 GPU,因此添加的遮罩越多,提取速度就越慢。

    每个面具/遮罩都有不同的优点和缺点。(后面训练和转换的过程中若是基于神经网络的遮罩进行训练或转换源文件时,建议此处选一个遮罩算法)

    ps: 遮罩此处可不选,在步骤二中对fsa数据集优化后,在Tools里同样可以补充再搞这个步骤。

遮罩算法对比:

  • BiSeNet-FP,从面具中排除头发和耳朵(默认设置):
  • BiSeNet-FP,面罩中包含头发和耳朵的(全头训练所需的头发),可在界面上方的setting中找到对应的遮罩设置:
  • Unet-DFL - 一种神经网络掩码,旨在提供大部分正面的智能分割。面具模型已经过社区成员的培训。
  • VGG-Clear - 一种神经网络掩码,旨在对大部分正面没有障碍物的人脸进行智能分
  • VGG-Obstructed - 旨在提供大部分正面的智能分割。面具模型经过专门训练,可以识别一些面部障碍物(手和眼镜)。
  • landmark 68个点遮罩(不选也会有,真正的默认遮罩,有时候因为脸的不全原因,所以还是要加上上面的某1个或几种遮罩):
  • PS: 默认landmark遮罩的其中一个主要大问题是这个算法仅会囊括检测的脸眉毛上方,有可能会造成最终换脸两重眉毛的效果,这也是以上这些自选算法遮罩的目的,能够让识别到眉毛上方的地方,避免这个问题。

1.2.2 归一化

Normalization, 顾名思义,数据集的归一化:归一化可以在光照不理想的情况下更好地找到人脸。不同的归一化方法适用于不同的数据集,实测的话推荐“hist”归一化。选正则选项的话会稍微减慢提取速度,但对齐效果更好。

1.2.3 二次对准

Re Feed:此选项会将稍微调整过的检测到的人脸重新送回对准器,然后平均最终结果。这有助于减少“微抖动”。 如果是用于训练数据集,即第三步Training用,设置其为0,如果是为了转换,设在0-8,反复提取可以实现精益求精用,但是会慢很多),效果也截一个。

下图显示了 re-feed 设置为 8(左)与 re-feed 设置为 0:

1.2.3  旋转图像

Rotate Images:针对 CV2-DNN !,可能会无法识别旋转后的人脸。其他对齐算法选这个会降低速度,毫无收益。

1.3 人脸处理

Min Size:设置一个高于零但比较低的值,用以过滤掉明显太小而不能成为脸的东西。(取决于源视频中人脸的大小,比如都很小,那这个值确保比源视频中的常见脸的尺寸要低,比如一个电影片段,镜头里除了需要提取的主人公的脸,旁边还放有一本书上,书有人脸,这个值就是卡掉书上的这个大小的人脸,确保不算在内)

Filter/nFilter, Ref Threshold:这俩选项用于过滤掉不需要的脸。什么意思呢,就是针对性的要谁的脸(Filter选一张照片),或者针对性的不要谁(Nfilter上传N张你不想要检测到人脸的照片,记住是每个照片必须只有一个人脸,可以传多张,用以屏蔽多个人)。Ref Threshold用于取决于判断的严格度,就是拉到1的话就很松,越低就越严,相当于你想要的监考老师的分数,严的就很难受,分数就低。

PS: Filter/nFilter, Ref Threshold这部分可以不上传图,靠第二步的tools相关功能去筛选不想要的脸,根据官方FAQ的说法,用TOOLS在第二步中处理效率更高,因为如果使用了这个过滤器明显的会降低提取速率。

1.4 输出设置

Size: 提取图像的大小,通常 512px 对于大多数模型来说都可以(全头提取图像的大小),这个就是神经网络的输入图片像素,不同算法可能仅支持固定格式的输入图片大小。比如对于“面部”居中,模型可用的图像大小将为 384 像素。使用“传统”居中进行训练时,可用的图像大小为 308 像素。

Extract Every N: 这个选项意思是,多少帧提取一个脸,我举个例子,一般的25fps的视频,有可能25帧每一帧的变化很小,那么就是提取了一堆相似的废物数据集,实际上每12-25提取一次就行(大约是半秒到1秒,也就是你换个表情和表情变化怎么也得半秒,不信的话你自己试试。。。)

Save Interval: 保存间隔,随缘吧,多少帧保存一次。默认就行,默认就是全搞完了一次性存下来。

Debug Landmarks: 在提取的脸上调整landmarks(做事真就这么细?,正常不勾选)

1.5 设置,全局设置

Settings: 不解释了,跳过已有的(指当前fsa文件中),跳过已有的脸(指当前fsa文件中),跳过已保存过的脸

Exclude Gpus: 哪个CPU你不想在跑的时候使用, 你如果全勾选了(说明你不想用任何GPU),会变成CPU模式

Configfile:载入一个配置(就是刚刚设置的这些玩意可以保存,下次直接载入就行)

Loglevel: 日志类型,默认就行。选debug会有报告(你愿意看的话),选TRACE会有一大堆数据生成

Logfile:log存放地址路径,留空默认生成在faceswap的目录下。

以上选好的话,

第一步,完成。

下一章教大家如何利用tools模块里的各种工具。

{

Alignments:排序,删脸,提取,重命名

Effmpeg: 视频组装合成

Restore:恢复训练的模型

Mask: 添加遮罩

Sort:排序

Preview:交换效果预览

)

第二章Tools部分月内更新吧,反正也是自己看的。。

最后,操作流程的任何问题都可以在官方FAQ中找到,贴个地址,真有问题,去社区发帖问或者留言探讨~

https://forum.faceswap.dev/app.php/faqpage

AI换脸实战教学(FaceSwap的使用)---------第一步Extration:提取人脸。的更多相关文章

  1. 程序员体验AI换脸就不要用ZAO了,详解Github周冠军项目Faceswap的变脸攻略

    本文链接:https://blog.csdn.net/BEYONDMA/article/details/100594136       上个月笔者曾在<银行家杂志>发文传统银行如何引领开放 ...

  2. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  3. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  4. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

  5. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...

  6. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  7. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  8. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  9. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

随机推荐

  1. 【九度OJ】题目1201:二叉排序树 解题报告

    [九度OJ]题目1201:二叉排序树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1201 题目描述: 输入一系列整数,建立二叉排序 ...

  2. 【LeetCode】557. Reverse Words in a String III 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  3. 带你熟悉鸿蒙轻内核Kconfig使用指南

    摘要:本文介绍了Kconfig的基础知识,和鸿蒙轻内核的图形化配置及进阶的使用方法. 本文分享自华为云社区<鸿蒙轻内核Kconfig使用笔记>,作者: zhushy. 1. Kconfig ...

  4. Codeforces 450E:Jzzhu and Apples(构造,数学)

    E. Jzzhu and Apples time limit per test: 1 seconds memory limit per test: 256 megabytes input: stand ...

  5. webSocket 与HTTP

    WebSocket 协议在2008年诞生,2011年成为国际标准.现在所有浏览器都已经支持了.WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真 ...

  6. 使用.NET 6开发TodoList应用(12)——实现ActionFilter

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Filter在.NET Web API项目开发中也是很重要的一个概念,它运行在执行MVC响应的Pipeline中执行,允许我们 ...

  7. JSP中的九大内置对象

    JSP九大内置对象 pageContext 存东西 Request 存东西 Response Session 存东西 Application(servletContext) 存东西 config(se ...

  8. Java的发展简史

    Java是由Sun Microsystems公司(简称Sun公司)于1995 年 5 月推出的 Java程序设计语言和Java平台的总称.Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语 ...

  9. Java初学者作业——编写Java程序,输入一个学生的5门课程的成绩,求其平均分。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个学生的5门课程的成绩,求其平均分.计算平均成绩,需要将每一门课程的成绩逐步累加到总成绩中,使用 for 循环实现,然后求出平均分. 实现 ...

  10. Browser Events 常用浏览器事件

    事件 说明 click 鼠标点击时触发此事件 dblclick 鼠标双击时触发此事件 mousedown 按下鼠标时触发此事件 mouseup 鼠标按下后松开鼠标时触发此事件 mouseover 当鼠 ...