|
|
星级打分
平均分:NAN 参与人数:0 我的评分:未评
本帖最后由 day270010678 于 2026-2-14 21:36 编辑
训练中产生这种光圈,很大程度上是高斯模糊导致的,假如过度训练会导致学习这些高斯模糊光圈。
解决方法,直接在训练中解决,先腐蚀在小范围高斯模糊
- # 先腐蚀遮罩边缘,消除训练时的模糊边缘
- mask_erode_size = max(1, resolution // 128)
- gpu_target_srcm_eroded = nn.max_pool(gpu_target_srcm, kernel_size=mask_erode_size * 2 + 1,
- strides=1)
- gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm_eroded, max(1, resolution // 64))
- gpu_target_srcm_blur = tf.clip_by_value(gpu_target_srcm_blur, 0, 0.5) * 2
- gpu_target_srcm_anti_blur = 1.0 - gpu_target_srcm_blur
- mask_erode_size = max(1, resolution // 128)
- gpu_target_dstm_eroded = nn.max_pool(gpu_target_dstm, kernel_size=mask_erode_size * 2 + 1,
- strides=1)
- gpu_target_dstm_blur = nn.gaussian_blur(gpu_target_dstm_eroded, max(1, resolution // 64))
- gpu_target_dstm_blur = tf.clip_by_value(gpu_target_dstm_blur, 0, 0.5) * 2
复制代码
就是根据分辨率
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),可以消除光圈但保持边缘平滑。
嫌上面复杂 可以考虑就是减少高斯模糊范围
- # 原代码
- gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, max(1, resolution // 32))
- # 改为
- gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, max(1, resolution // 64))
复制代码
也可以使用Sigmoid 边缘过渡替换高斯模糊
- # 替换 Model.py:437-442 的代码
- # 不使用高斯模糊,改用 sigmoid 平滑边缘
- # 先找到遮罩边缘区域
- edge_width = max(1, resolution // 64)
- gpu_target_srcm_blur = nn.gaussian_blur(gpu_target_srcm, edge_width)
- # 使用 sigmoid 创建更锐利的边缘过渡
- sharpness = 10.0 # 越大边缘越锐利
- gpu_target_srcm_blur = tf.sigmoid(sharpness * (gpu_target_srcm_blur - 0.5))
- gpu_target_srcm_anti_blur = 1.0 - gpu_target_srcm_blur
- gpu_target_dstm_blur = nn.gaussian_blur(gpu_target_dstm, edge_width)
- gpu_target_dstm_blur = tf.sigmoid(sharpness * (gpu_target_dstm_blur - 0.5))
复制代码 我推荐用 腐蚀加高斯模糊 就是第一中方法, 对性能有影响(max_pool很快),但是可以忽略不计, 主要是效果最好。 其他两种方法虽然不影响性能,但是效果没有这种好。
|
|