deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)
查看: 205|回复: 0

关于一些DFL模型架构的思考

[复制链接]

6

主题

54

帖子

4896

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
4896
 楼主| 发表于 2025-2-8 20:34:54 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
本帖最后由 lispmox 于 2025-2-8 20:45 编辑

断断续续玩DFL已经有好几年了,期间也探索过其他一些换脸模型的架构,从效果上来看各有千秋,但总体上如果是视频换脸,DFL的模型更加稳定和流畅。这个帖子只是我对一些常见模型架构的思考,用形而上的方式表达出来。我不是相关领域的专业人士,可能会有一些不准确的地方,请各位大佬轻喷。

两类常见的换脸AI模型架构:
1. 自编码架构
这应该是最古老的换脸模型架构了,优点是简单、直观、稳定,缺点是需要大量的人脸数据进行训练,对面部细节的生成能力不够强(模糊)。最早的DeepFake以及后来的faceswap、DeepFaceLab都采用了这类模型架构。以DFL的df架构为例,模型包含一个编码器(encoder)、一个中间层(inter)和两个解码器(decoder_src、decoder_dst)。编码器和解码器都是纯卷积网络,它们的作用是对人脸的局部位置信息进行编码或解码(压缩或生成)。中间层inter的作用是对局部信息进行一次融合压缩,进一步得到ae_dims长度的向量。中间层inter非常关键,如果去掉这个融合层,模型就会倾向于只学习局部特征,最后得到的将是一个恒等映射网络,输入什么就输出什么,而不是参考dst来生成src。

2. 风格迁移架构
考虑到不同的人都有两只眼睛、一个鼻子和一张嘴,五官大体一致,我们可以在保留这些主要结构的前提下只修改局部细节特征来实现换脸。一种最常用的思想是将人脸特征看作一种风格,我们要做的就是把src的人脸风格迁移到dst上。图像风格化迁移已经是一个相对成熟的研究了,其基本思路是在卷积过程中调整通道的均值和方差来改变风格,同时保留图像的空间结构。目前采用这种模型架构的模型,通常都追求单图换脸,如simswap、rope、facefusion等。整个架构大致分为编码器、解码器、人脸身份识别模块、人脸特征注入模块。给定dst脸,先通过编码器获得压缩后的特征通道,再通过人脸身份识别模块(例如arcface)或表示人脸身份的向量,然后将身份向量转换成一种风格特征注入给编码器压缩的特征通道,最后通过解码器获得src脸。这类模型具有更强的泛化性,缺点是定制性较差,不容易训练,大多时候只能使用作者提供的预训练模型。目前公开的大多数模型,可能受限于数据集和人脸身份识别,对大角度的人脸替换效果不够理想。

理解DFL的中间层
DFL的两个主流架构DF和LIAE都包含中间层inter。具体来说,DF架构有一个中间层inter,LIAE结构有两个(inter_AB和inter_B)。前文提到中间层会对编码器的输出进行一次融合,把整个人脸压缩到ae_dims个元素,然后再展开回原始图像。从信息瓶颈角度来看,人脸压缩到ae_dims个元素中显然是不现实的。因此,inter层必然只保留了人脸的一些必要信息,而更多的细节则由后续的解码器补充,即通过训练将大量的src人脸细节注入到解码器中。此时,对于DF和LIAE两个架构,学习的inter也有所不同。

DF架构有两个解码器,分别是decoder_src和decoder_dst。其中decoder_src负责生成src脸,decoder_dst负责生成dst脸。它们共享一个encoder和inter,这意味着如果两个解码器能很好地生成src和dst脸时,中间层inter应该只保留人脸角度、表情、神态等信息,而不包含具体的细节。当我们训练DF版本的万能模型时,会增加一个true face的优化目标,在代码里是对inter的输出(decoder的输入,不是那ae_dims个元素)进行GAN训练,使得src的编码分布接近dst的编码分布,分布一致则相同编码表示的人脸也大概一致,这样可以保证训练过程中inter不会为src和dst分别生成两份不太相似的表征方式,有利于src的面部细节迁移到dst的面部结构上。这里我有一点疑惑的是,这个true face是否真的有必要,而且GAN本身也会有模式塌陷等问题,导致训练的网络多样性降低,这也是很多人发现开了true face后眼神表情变得僵硬的原因。

LIAE架构有两个中间层,分别是inter_AB和inter_B。这个架构只有一个编码器和解码器。在生成src脸的时候,编码器的结果只输入给inter_AB,然后把中间层结果复制拼接一次得到[z_AB, z_AB]后输入给解码器decoder。在生成dst脸的时候,编码器结果会同时输入给inter_AB和inter_B,然后把结果拼接得到[z_B, z_AB]后输入给解码器decoder。这种架构意味着唯一的解码器decoder要同时负责生成src脸和dst脸,此时src和dst的细节特征会同时融合在decoder中互相干扰,降低了换脸后的src相似度,但也增加了人脸的融合程度。此时的inter_B,相较于DF的inter,不仅保留了人脸角度、表情、神态等信息,还保留了一个身份信息,用来告诉decoder此时是在生成dst脸,否则就是生成src脸。目前我暂不清楚这种身份信息是记录在ae_dims个元素里,还是记录在z_AB和z_B的差值里,不过可以明确的是在训练过程中由于解码器要同时识别inter_AB和inter_B的输出,此时inter_AB和inter_B在某种程度上需要趋同,即inter_AB会被inter_B带偏,导致换出来的src像dst。不过也因为这种性质,LIAE不需要true face也能训练万能模型。

一些想法:
在训练DF架构的万能模型时,是否可以关闭true face,替换成将src脸给inter的梯度置为0来避免inter分化成两套表征。假设dst数据集的人脸数据足够丰富,仅通过dst数据集就已经能训练一个足够好的encoder+inter了。
在训练LIAE架构的万能模型时,喂入的src和dst数据比例是否可以调整,从1:1增加到4:1,增加src混入decoder中的比例,增加和src的相似度。特别是在一个预训练模型上,模型的基本生成能力已经足够好,应该通过进一步训练将其中和src相关的部分激活。
不过这些都是我一时的想法,不一定对,等有空再试试看吧,也请大佬们指教。目前在尝试训练几个低参的大头预训练模型,从tensorboard上能看到一些有意思的现象,小模型在更长的训练迭代后并不一定比更大的模型差,大模型个小模型生成同质量人脸需要的总计算量可能是差不多的。同时也在尝试用rectified flow实现人脸分布的迁移,等验证成功了会继续分享。
回复

使用道具 举报

QQ|Archiver|手机版|deepfacelab中文网 |网站地图

GMT+8, 2025-3-12 12:19 , Processed in 0.127858 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表