deepfacelab中文网

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

训练中,预览图周围产生模糊五彩光圈

[复制链接]

26

主题

173

帖子

1201

积分

初级丹圣

Rank: 8Rank: 8

积分
1201
 楼主| 发表于 昨天 21:26 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
本帖最后由 day270010678 于 2026-2-14 21:36 编辑

0.png


训练中产生这种光圈,很大程度上是高斯模糊导致的,假如过度训练会导致学习这些高斯模糊光圈。

解决方法,直接在训练中解决,先腐蚀在小范围高斯模糊

  1. # 替换 Model.py:437-442
复制代码
  1. # 先腐蚀遮罩边缘,消除训练时的模糊边缘
  2.                     mask_erode_size = max(1, resolution // 128)
  3.                     gpu_target_srcm_eroded = nn.max_pool(gpu_target_srcm, kernel_size=mask_erode_size * 2 + 1,
  4.                                                          strides=1)
  5.                     gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm_eroded, max(1, resolution // 64))
  6.                     gpu_target_srcm_blur = tf.clip_by_value(gpu_target_srcm_blur, 0, 0.5) * 2
  7.                     gpu_target_srcm_anti_blur = 1.0 - gpu_target_srcm_blur

  8.                     mask_erode_size = max(1, resolution // 128)
  9.                     gpu_target_dstm_eroded = nn.max_pool(gpu_target_dstm, kernel_size=mask_erode_size * 2 + 1,
  10.                                                          strides=1)
  11.                     gpu_target_dstm_blur = nn.gaussian_blur(gpu_target_dstm_eroded, max(1, resolution // 64))
  12.                     gpu_target_dstm_blur = tf.clip_by_value(gpu_target_dstm_blur, 0, 0.5) * 2
复制代码



屏幕截图 2026-02-14 211906.png


就是根据分辨率
resolution // 128 = 根据分辨率计算腐蚀强度
max(1, ...) = 确保最小值为1(至少腐蚀1像素)

理由就是原代码的模糊半径是 resolution // 32:

分辨率        原模糊半径        我的腐蚀半径        效果
128        4        1        腐蚀掉模糊边缘的1/4
256        8        2        腐蚀掉模糊边缘的1/4
512        16        4        腐蚀掉模糊边缘的1/4


原理:训练时的模糊会在边缘产生约 resolution // 32 像素宽的过渡带,通过腐蚀掉这个区域的一部分(约1/4),然后再用更小的模糊(resolution // 64),可以消除光圈但保持边缘平滑。

嫌上面复杂 可以考虑就是减少高斯模糊范围

  1. # 原代码
  2. gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, max(1, resolution // 32))

  3. # 改为
  4. gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, max(1, resolution // 64))
复制代码


也可以使用Sigmoid 边缘过渡替换高斯模糊

  1. # 替换 Model.py:437-442 的代码
  2. # 不使用高斯模糊,改用 sigmoid 平滑边缘
  3. # 先找到遮罩边缘区域
  4. edge_width = max(1, resolution // 64)
  5. gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, edge_width)
  6. # 使用 sigmoid 创建更锐利的边缘过渡
  7. sharpness = 10.0  # 越大边缘越锐利
  8. gpu_target_srcm_blur = tf.sigmoid(sharpness * (gpu_target_srcm_blur - 0.5))
  9. gpu_target_srcm_anti_blur = 1.0 - gpu_target_srcm_blur

  10. gpu_target_dstm_blur = nn.gaussian_blur(gpu_target_dstm, edge_width)
  11. gpu_target_dstm_blur = tf.sigmoid(sharpness * (gpu_target_dstm_blur - 0.5))
复制代码
我推荐用 腐蚀加高斯模糊 就是第一中方法, 对性能有影响(max_pool很快),但是可以忽略不计, 主要是效果最好。 其他两种方法虽然不影响性能,但是效果没有这种好。
回复

使用道具 举报

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

GMT+8, 2026-2-15 06:22 , Processed in 0.098104 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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