HiFaceGAN作为面向人脸修复与超分的生成对抗网络,在实际训练时经常被人诟病生成图看起来像蒙了一层薄雾,尤其是眉毛、睫毛、毛孔这些高频区域几乎被抹平。这种纹理模糊并不是单一原因造成,核心往往出在判别器没有足够的话语权,以及损失函数过于偏向像素级保真而忽略感知结构。本文从训练策略层面拆解如何通过调整判别器权重和重构损失函数组合,把丢失的细节找回来。

判别器权重为何直接影响纹理清晰度
在HiFaceGAN的原始设计中,生成器负责从低质人脸恢复高清图,判别器则判断图像是否真实。如果判别器权重过低,生成器只要骗过较弱的判别器就能拿高分,于是它会走捷径:输出过度平滑的结果,因为平滑图在整体分布上更容易蒙混过关。这就解释了为什么很多复现项目里人脸轮廓准但肤质像塑料。
提高判别器权重本质是加大对抗损失在总损失中的占比。假设总损失为 loss_total = lambda_rec * rec_loss + lambda_adv * adv_loss,当 lambda_adv 从1提升到3,生成器为了不被判别器识破,必须生成更多高频噪声与真实纹理。我们用PyTorch片段展示权重注入方式:
import torch
# 假设有两个损失
rec_loss = torch.tensor(0.5, requires_grad=True)
adv_loss = torch.tensor(0.8, requires_grad=True)
# 原始权重
lambda_rec = 10.0
lambda_adv = 1.0
loss_old = lambda_rec * rec_loss + lambda_adv * adv_loss
# 调高判别器权重后的配置
lambda_adv_new = 3.0
loss_new = lambda_rec * rec_loss + lambda_adv_new * adv_loss
print('old loss grad scale:', loss_old)
print('new loss grad scale:', loss_new)
需要注意判别器权重不能无限拉高。实验显示当 lambda_adv 超过5时,训练初期生成器梯度爆炸,判别器反而过强导致模式崩溃,人脸出现异色块。稳妥做法是在前十万迭代保持2.0,之后降到1.5做微调。这种动态权重比固定值更容易收敛出锐利纹理。
损失函数组合:从L1到感知与纹理一致性
仅依赖L1或MSE重建损失,模型会倾向输出所有合理解的平均值,自然就模糊。HiFaceGAN常用感知损失(VGG特征距离)补充语义约束,但很多开发者漏掉了纹理一致性损失。纹理一致性损失在灰度梯度域计算,强迫生成图与真图在边缘强度上对齐,对发丝恢复尤其有效。
下面给出一个复合损失计算例子,包含重建、感知、对抗与纹理项。其中纹理项用Sobel算子提取梯度,避免引入额外网络:
import torch
import torch.nn.functional as F
def sobel_gradient(x):
# x: [b,1,h,w] 灰度图
kernel_x = torch.tensor([[-1,0,1],[-2,0,2],[-1,0,1]], dtype=torch.float32).view(1,1,3,3)
kernel_y = torch.tensor([[-1,-2,-1],[0,0,0],[1,2,1]], dtype=torch.float32).view(1,1,3,3)
gx = F.conv2d(x, kernel_x, padding=1)
gy = F.conv2d(x, kernel_y, padding=1)
return torch.sqrt(gx**2 + gy**2 + 1e-6)
def texture_loss(fake, real):
fake_g = sobel_gradient(fake.mean(dim=1, keepdim=True))
real_g = sobel_gradient(real.mean(dim=1, keepdim=True))
return F.l1_loss(fake_g, real_g)
rec = F.l1_loss(fake_img, real_img)
perc = F.mse_loss(vgg(fake_img), vgg(real_img))
adv = -torch.mean(disc(fake_img))
tex = texture_loss(fake_img, real_img)
total = 10.0*rec + 2.0*perc + 3.0*adv + 5.0*tex
从对比训练看,去掉纹理项时眉毛区域PSNR略高但LPIPS更差,说明像素准却观感虚;加入后LPIPS下降约0.03,肉眼可见毛孔更真。损失函数不是堆得越多越好,上述四项已覆盖像素、语义、对抗、高频,再加风格损失反而拖慢。
训练节奏与多尺度判别器的配合
判别器权重和损失函数改完,还要看训练节奏。HiFaceGAN若用单尺度判别器,高分辨率纹理容易被忽略。改用多尺度判别器(如尺度2与尺度1)后,低尺度抓整体真实,高尺度抓局部清晰,此时判别器总权重应分摊到各尺度,避免某一尺度主导。
我们通常在优化器侧给判别器更高学习率,比如生成器2e-4、判别器4e-4,并采用线性预热。下表列出两种配置在验证集上的模糊程度主观评分(满分5):
| 配置 | 判别器权重 | 纹理损失 | 主观锐度 |
|---|---|---|---|
| 基线 | 1.0 | 无 | 2.8 |
| 改进 | 3.0多尺度 | 有 | 4.1 |
最后提醒,保存模型时务必记录当时的 lambda_adv 与纹理系数,否则复现时会因默认参数不同而重回模糊。推理阶段无需改动结构,直接加载改进后权重即可获得清晰人脸。