deepfacelab中文网

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

融合合成的时候遮罩模式的full

[复制链接]

41

主题

260

帖子

2008

积分

初级丹圣

Rank: 8Rank: 8

积分
2008
 楼主| 发表于 2026-7-13 10:47:27 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
在最后合成的时候,假如用遮罩模式的full,会导致人脸周围有矩形框及光圈,而实际上full参数大多数下是最贴合换脸后的真实脸的

QQ浏览器截图20260713103545.png    

这个光圈可以通过调高羽化值去减少,但是就算把值调高到最大,也必然会有一侧的光圈遮罩,所以是无法彻底消除这个光圈的。
这个光圈的存在的逻辑是:
在 mask_mode == 0(full)时:
wrk_face_mask_a_0 = np.ones_like(...) — 全 1,整个正方形都是 Mask
prd_face_bgr 是模型输出的正方形图像,人脸周围自带光圈色差
第 239 行 out_img = img_bgr*(1-mask) + out_img*mask — 整个正方形直接替换,光圈像素原样贴上去
光圈是模型输出像素自带的,不是 Mask 的问题。 其他模式之所以没有光圈,是因为 learned mask/XSeg mask 恰好把光圈区域遮掉了(Mask 值为 0 或过渡区)。


解决思路
在 full 模式下,利用模型自己预测的 prd_face_dst_mask_a_0(learned-dst mask)做边界色彩过渡——在光圈区域把 prd_face_bgr 向 dst_face_bgr 渐变混合,而不是直接用全 1 Mask:

逻辑说明:

prd_face_dst_mask_a_0 — 模型预测的 dst mask,标记了人脸区域(值≈1)和背景区域(值≈0)
halo_zone = 1.0 - blur(mask) — 取 Mask 边界过渡带,这就是光圈所在的位置
prd_face_bgr = prd * (1-halo_zone) + dst * halo_zone — 在光圈区域,把生成脸的颜色向原始图渐变混合
这样 full 模式下:

人脸内部(mask≈1):完全使用生成脸,不受影响
光圈区域(mask 边界):颜色向 dst 渐变过渡,消除色差
背景区域(mask≈0):完全使用 dst 原图

修改代码:
  1.     if cfg.mask_mode == 0: #full
  2.         wrk_face_mask_a_0 = np.ones_like(dst_face_mask_a_0)
  3.     elif cfg.mask_mode == 1: #dst
复制代码



把这个按照逻辑修改:
  1.     if cfg.mask_mode == 0: #full
  2.         wrk_face_mask_a_0 = np.ones_like(dst_face_mask_a_0)
  3.         halo_fix_mask = cv2.GaussianBlur(prd_face_dst_mask_a_0, (0,0), max(1, output_size//32))
  4.         halo_fix_mask = np.clip(halo_fix_mask, 0, 1)
  5.         halo_zone = 1.0 - halo_fix_mask
  6.         halo_zone[halo_zone < 1.0/255.0] = 0.0
  7.         halo_zone = halo_zone[...,None]
  8.         if halo_zone.max() > 0:
  9.             prd_face_bgr = prd_face_bgr * (1.0 - halo_zone) + dst_face_bgr * halo_zone
  10.     elif cfg.mask_mode == 1: #dst
复制代码


这样以后合成的时候用full模式就会消除这些光圈,至于这个黑色正方形线框是人脸替换的边界,我特意保存了,只是为了让人观察替换的包含部分,像去掉的话,只要羽化值随便调高几个值就消失了,
QQ浏览器截图20260713103304.png


QQ浏览器截图20260713103633.png
回复

使用道具 举报

9

主题

166

帖子

6919

积分

高级丹圣

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

积分
6919
发表于 2026-7-17 03:37:09 | 显示全部楼层
本帖最后由 jaysfing 于 2026-7-17 03:42 编辑
day270010678 发表于 2026-7-16 01:35
你的这种,你有没有考虑过羽化参数?我留的正方形是打算让人观察整个替换范围,最后可以小幅度羽化彻底消 ...

我以前也观察到full模式能够非常大面积的换脸,而且非常贴近于SRC,比真脸模式真实,但是这正方形框肯定不能作为最终输出的成品,就作罢了。你的帖子提供了一个非常好启发和思路:利用SAEHD训练学习到的dst预测遮罩,相比xseg严格切割脸部或遮挡物边缘来说,这个思路肯定是能获得更好的换脸效果,毕竟换脸覆盖率大了,能换更多的src进去效果肯定会越好,当然理论上最好的是换整个头(可惜废了),但这个方向绝对没错。

但是这个方案中有个问题  这个渐变融合就一定会产生模糊地带(光圈) ,并且由于是预测遮罩 不像xseg是静态的 prd_face_dst_mask_a_0 这个值在帧间浮动导致遮罩区域跟着跳,最终在合成视频时序上会产生抖动

针对这两个问题我的思路是
1.模型预测的遮罩  高斯模糊后膨胀,覆盖范围接近正方形遮罩,达到 full 模式的覆盖率,然后靠prd_face_dst_mask_a_0  人脸区域值接近 1的部分进行换脸  比如发际线、耳朵边缘、下巴外侧都会变成换脸目标区域 ,不产生光圈。
2.在MergeMasked.py 里加文件读写逻辑,每帧处理完后把遮罩写入临时文件,下一帧读取上一帧的遮罩做加权平均。每帧先读文件拿到上一帧的遮罩,加权平均后更新自己的遮罩,再把结果写入文件供下一帧读,这样保障平滑性不抖动。或者更简单粗暴,直接使用xseg遮罩膨胀来确保时序平滑。


回复 支持 1 反对 0

使用道具 举报

9

主题

166

帖子

6919

积分

高级丹圣

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

积分
6919
发表于 2026-7-16 01:15:49 | 显示全部楼层
本帖最后由 jaysfing 于 2026-7-16 01:31 编辑
day270010678 发表于 2026-7-15 22:59
脸颜色变白,这是肯定的,因为用的是原图的形态,但是脸部颜色是训练的时候或者说被替换脸的颜色,这个应 ...

您的方案是正方形遮罩,覆盖范围是 100%    在边缘做颜色混合,SRC 肤色向 DST 靠拢。肤色差异小的时候还行 肤色差异大时会产生分界线,特别是额头顶部肤色不对  我试了怎么调halo_zone 阈值都难以消除 有点弊端。
我这个方案是切割的  是靠SAEHD模型去预测和计算边缘  进行切割  形成固定遮罩  弊端更大  不能体现full的优势
后来想了个两全其美的办法:
使用halo_fix_mask膨胀系数   不会削掉脸部边缘:
  1.         expanded_mask = cv2.dilate(halo_fix_mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (output_size//3, output_size//8)))
复制代码

宽度膨胀到三分之一覆盖横向脸部边缘,高度只膨胀八分之一避免底部光晕。这个比例是基于人脸的一般比例
这样的效果虽然比不上正方形遮罩的完整覆盖,但遮罩覆盖范围足够大,保留了完整的脸部边缘,同时底部不溢出光晕  边缘过渡甚至更自然


总结就是用您的原创颜色混合逻辑,去处理遮罩边缘。
用模型轮廓膨胀后的遮罩,这个遮罩本身就已经贴合人脸,边缘光圈比正方形小得多。在这个基础上,颜色混合方法只作用于遮罩最边缘的极小范围,完成最后的肤色过渡。
遮罩形状解决了覆盖率问题,颜色混合解决了边缘融合问题。两者结合就同时具备了 full 的较完整覆盖和自然过渡。







回复 支持 0 反对 1

使用道具 举报

9

主题

166

帖子

6919

积分

高级丹圣

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

积分
6919
发表于 2026-7-15 22:22:49 | 显示全部楼层
july 发表于 2026-7-14 09:12
这个融合后,脖子会有色差吗?
还有,大佬的pytorch版做好了吗,等了好久了,希望能早日体验到 ...

我测试了 会有色差 full 模式下换的脸颜色变白,是因为 halo 修正代码里 prd_face_bgr = prd_face_bgr * (1.0 - halo_zone) + dst_face_bgr * halo_zone 这行,把生成脸向 DST 原图做了渐变混合。 DST 肤色比 SRC 有色差 混合后就会有  代码可以优化一下:

        if cfg.mask_mode == 0:
            top_extend = output_size // 6
            wrk_face_mask_a_0 = np.pad(wrk_face_mask_a_0, ((top_extend, 0), (0, 0)), mode='edge')
            wrk_face_mask_a_0 = wrk_face_mask_a_0[:mask_subres_size, :]
            wrk_face_mask_a_0[:top_extend+10, :] = cv2.GaussianBlur(wrk_face_mask_a_0[:top_extend+10, :], (0, 0), 5)

        wrk_face_mask_a_0 = np.clip(wrk_face_mask_a_0, 0, 1)
回复 支持 1 反对 0

使用道具 举报

7

主题

181

帖子

3158

积分

高级丹圣

平时喜欢练丹与分享的小丹师

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

积分
3158

万事如意节日勋章开心娱乐节日勋章

发表于 2026-7-15 21:35:11 | 显示全部楼层
修改哪个文件中的代码呀?
回复 支持 1 反对 0

使用道具 举报

51

主题

933

帖子

7929

积分

高级丹圣

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

积分
7929

万事如意节日勋章开心娱乐节日勋章

发表于 2026-7-14 21:05:49 | 显示全部楼层
day270010678 发表于 2026-7-14 17:30
很久没做了,源码都忘记扔哪里了。我就是兴趣来了,突然搞一下,东一下,西一下。我现在是突然来兴趣,在 ...

厉害!!
按照你的看法,
seedance2.0、comfyUI、Qwen换人脸、换身体,
逻辑是不是跟DFL一样的啊,
都是用landmark标记好,然后替换的?

如果是的话,那DFL的作者就太厉害了
回复 支持 1 反对 0

使用道具 举报

0

主题

138

帖子

3094

积分

高级丹圣

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

积分
3094

万事如意节日勋章

发表于 2026-7-14 09:12:18 | 显示全部楼层
这个融合后,脖子会有色差吗?
还有,大佬的pytorch版做好了吗,等了好久了,希望能早日体验到
回复 支持 1 反对 0

使用道具 举报

41

主题

260

帖子

2008

积分

初级丹圣

Rank: 8Rank: 8

积分
2008
 楼主| 发表于 2026-7-14 17:30:41 | 显示全部楼层
july 发表于 2026-7-14 09:12
这个融合后,脖子会有色差吗?
还有,大佬的pytorch版做好了吗,等了好久了,希望能早日体验到 ...

很久没做了,源码都忘记扔哪里了。我就是兴趣来了,突然搞一下,东一下,西一下。我现在是突然来兴趣,在dfl基础上,修改源码,让dfl具备所有ai的功能,比方说不仅仅是局限于换脸,具备换服装,同时具备人体整个替换的功能。  主要是dfl的逻辑适合所有ai的从零开始构建一切随心所欲的替换。
回复 支持 反对

使用道具 举报

1

主题

76

帖子

3532

积分

高级丹圣

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

积分
3532

万事如意节日勋章

发表于 2026-7-15 03:11:24 | 显示全部楼层
WaveBedo 发表于 2026-7-14 21:05
厉害!!
按照你的看法,
seedance2.0、comfyUI、Qwen换人脸、换身体,

不一样~你说的那些是生成式的,严格来说,不完全是替换
回复 支持 反对

使用道具 举报

41

主题

260

帖子

2008

积分

初级丹圣

Rank: 8Rank: 8

积分
2008
 楼主| 发表于 2026-7-15 21:51:18 | 显示全部楼层
1541235112 发表于 2026-7-15 21:35
修改哪个文件中的代码呀?

MergeMasked.py
回复 支持 反对

使用道具 举报

41

主题

260

帖子

2008

积分

初级丹圣

Rank: 8Rank: 8

积分
2008
 楼主| 发表于 2026-7-15 21:56:33 | 显示全部楼层
WaveBedo 发表于 2026-7-14 21:05
厉害!!
按照你的看法,
seedance2.0、comfyUI、Qwen换人脸、换身体,

comfyUI相当于载体,所有的模型只是可以利用他添加工作流去运行而已。你说的那些ai肯定跟dfl不一样,我说dfl逻辑牛是指他的原理,可以从0开始训练一个换脸,我们可以利用这个逻辑,去实现任何人物,服饰等等一切的替换

评分

参与人数 1贡献 +1 收起 理由
WaveBedo + 1 好的

查看全部评分

回复 支持 反对

使用道具 举报

9

主题

166

帖子

6919

积分

高级丹圣

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

积分
6919
发表于 2026-7-15 22:44:51 | 显示全部楼层
本帖最后由 jaysfing 于 2026-7-15 22:46 编辑

我的优化思路是:直接用 SAEHD 模型自带的 prd_face_dst_mask_a_0 做遮罩,高斯模糊后替换 full 模式的正方形遮罩  直接把方框“削掉”,不留缝隙
回复 支持 反对

使用道具 举报

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

GMT+8, 2026-8-28 13:37 , Processed in 0.100489 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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