- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
本文聚焦 OpenMMLab 生成式视觉工具箱 MMagic 中的人脸超分辨率算法 DIC(CVPR'2020),从论文思想、网络结构、配置文件到训练与测试命令,结合仓库源码给出完整的实战级解析。读完本文,你将掌握如何在 MMagic 中复现 DIC / DICGAN 在 CelebA-HQ 上的人脸 8× 超分实验,并理解"恢复分支与关键点估计分支迭代协作"这一核心机制的代码实现。
任务背景与算法定位
DIC(Deep face super-resolution with Iterative Collaboration between Attentive Recovery and Landmark Estimation)发表于 CVPR 2020,属于**图像超分辨率(Image Super-Resolution)**任务,其核心目标是解决严重退化的人脸图像的 8 倍超分辨率问题。在 MMagic 中,它被收录于 configs/dic 目录,相关文档为 configs/dic/README_zh-CN.md。
早期基于深度学习与人脸先验的超分方法存在一个共同缺陷:人脸先验(如关键点 landmark、部件图 component map)通常是由低分辨率或粗糙超分结果估计得到的,先验本身不够准确,进而限制了恢复效果。DIC 的解决思路是让两条循环网络迭代协作:
- 恢复分支:负责人脸图像重建,在每一步利用关键点先验生成更高质量的图像;
- 关键点估计分支:以当前恢复结果估计更准确的人脸关键点,反过来又提升下一轮恢复质量。
两个过程相互促进、逐步提升,形成"恢复 → 关键点估计 → 更好恢复"的正向循环。此外,论文设计了一个注意力融合模块(Attentive Fusion Module),将面部各部件分别生成后按注意力聚合,强化 landmark 热图对人脸恢复的引导作用。
引用信息(论文 BibTeX)见 configs/dic/README.md:
@inproceedings{ma2020deep, title={Deep face super-resolution with iterative collaboration between attentive recovery and landmark estimation}, author={Ma, Cheng and Jiang, Zhenyu and Rao, Yongming and Lu, Jiwen and Zhou, Jie}, booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, pages={5569--5578}, year={2020} }网络结构源码解析:迭代协作如何落地
MMagic 中 DIC 的完整实现位于 mmagic/models/editors/dic,共包含 5 个源文件。整个模型由生成器DICNet与可选判别器LightCNN组成,整体算法封装在DIC类中。
DIC 算法类:多损失协同训练
DIC 继承自 SRGAN,注册名为DIC,其关键设计包括:
- 像素损失(pixel_loss):对生成器输出的每一迭代步 SR 结果计算与 GT 的 L1 损失;
- 对齐损失(align_loss):对每一迭代步估计出的关键点热图与 GT 热图计算 MSE 损失;
- 特征损失(feature_loss):可选,使用预训练 LightCNN 提取特征计算感知损失;
- GAN 损失(gan_loss):可选,配合 LightCNN 判别器构成对抗训练。
从 dic.py 可以看到,模型通过train_cfg.pixel_init控制"纯像素训练"的迭代步数:当self.step_counter >= self.pixel_init时才启用特征损失与 GAN 损失。训练流程中判别器以disc_repeat指定的次数重复更新(见 dic.py)。
DICNet 生成器:反馈块 + 沙漏网络
DICNet 是生成器主体,注册名为DICNet。其前向过程体现了"迭代协作"的具体形态(见 dic_net.py):
- 输入低分辨率图像先经
conv_first(3×3 卷积 + PReLU + PixelShuffle 2×)放大特征; - 进入
num_steps(默认 4)次迭代循环:- 第一步由
first_block(FeedbackBlockCustom)提取初始特征; - 后续每一步由
FeedbackBlockHeatmapAttention结合上一步估计的人脸热图进行注意力融合恢复; - 每步恢复结果经
conv_last(转置卷积 + PReLU + 3×3 卷积)输出 SR 图像,并与双线性插值的中间结果相加(残差式输出); - 随后由
FeedbackHourglass沙漏网络从 SR 图像估计 68 点人脸关键点热图,输出又作为下一步的引导;
- 第一步由
- 返回所有迭代步的
sr_outputs与heatmap_outputs列表,训练时每一层都参与损失计算。
关键子模块:
- FeedbackBlock / FeedbackBlockCustom:反馈块,结构为"模块输出回传给模块输入"的循环样式,通过维护
last_hidden隐状态实现跨迭代的信息复用; - FeatureHeatmapFusingBlock:注意力融合模块,将特征按热图通道分组,对热图做 softmax 后加权聚合面部各部件(见 dic_net.py);
- FeedbackHourglass:带反馈连接的沙漏网络,用于人脸关键点估计。其输出热图被切分为两部分——前半用于生成 heatmap,后半作为 feedback 回传(见 feedback_hour_glass.py)。
值得注意的是 reduce_to_five_heatmaps:DIC 利用人脸关键点做超分,而不同数据集的关键点数量不同。该函数将原始关键点热图(如 68 点)归一化并聚合成 5 张热图,分别对应左眼、右眼、鼻子、嘴、人脸轮廓,统一后送入注意力融合模块。
LightCNN 判别器:MaxFeature 结构
DICGAN 使用LightCNN作为判别器(输入尺寸 128×128)。它采用MaxFeature基础单元:卷积输出双倍通道后切分,逐元素取最大值,形成判别力更强的特征选择器。分类头最终输出 1 维真假分数。此外,预训练的 LightCNN 权重(light_cnn_feature.pth)也作为LightCNNFeatureLoss的特征提取器,构成感知/特征损失。
配置文件深度解读:两种训练范式
MMagic 为 DIC 提供两套开箱即用的配置,均针对 CelebA-HQ 数据集、8 倍放大:
1. dic_x8c48b6_4xb2-150k_celeba-hq.py(纯回归版本)
配置文件为 configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py,继承../_base_/default_runtime.py。核心要点:
| 配置项 | 取值 | 说明 |
|---|---|---|
generator | DICNet, in_channels=3, out_channels=3, mid_channels=48 | 生成器通道数 48 |
pixel_loss | L1Loss, loss_weight=1.0 | 像素 L1 损失 |
align_loss | MSELoss, loss_weight=0.1 | 关键点热图对齐损失 |
train_cfg | IterBasedTrainLoop, max_iters=150_000, val_interval=2000 | 迭代式训练 |
optim_wrapper | Adam, lr=1e-4 | 生成器优化器 |
param_scheduler | MultiStepLR, milestones=[10000,20000,40000,80000], gamma=0.5 | 阶梯式学习率衰减 |
val_evaluator | MAE / PSNR / SSIM, crop_border=scale | 评估指标 |
该版本仅含像素损失与对齐损失,不包含判别器与 GAN 相关配置。
2. dic_gan-x8c48b6_4xb2-500k_celeba-hq.py(GAN 版本)
配置文件为 configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py,继承上一配置并在其基础上叠加对抗训练:
- 增加判别器
LightCNN(in_channels=3); - 增加
feature_loss=LightCNNFeatureLoss(使用预训练light_cnn_feature.pth,loss_weight=0.1,criterion='l1'); - 增加
gan_loss=GANLoss(gan_type='vanilla', loss_weight=0.005); train_cfg中设置pixel_init=10000(前 10000 迭代仅训练像素/对齐损失)、disc_repeat=2(判别器每步更新 2 次);- 采用
MMSeparateDistributedDataParallel包装,生成器与判别器使用分离优化器:生成器 Adam lr=1e-4,判别器 Adam lr=1e-5; - 训练迭代数提升到 500_000,milestones 调整为 [100000, 200000, 300000, 400000]。
此外,两套配置均设置data_preprocessor的均值为[129.795, 108.12, 96.39]、标准差为[255, 255, 255],用于输入归一化。
数据流水线与数据集准备
以 configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py 中的训练流水线为例,数据处理包含三个关键环节:
- 加载与缩放:
LoadImageFromFile加载 RGB 彩色 GT 图,随后Resize到 128×128; - 退化模拟:再次
Resize按1/8比例缩小并保持宽高比,输出键img,得到低分辨率输入(16×16 级); - 关键点热图生成:
GenerateFacialHeatmap以 GT 图为基准,在 32×32 分辨率下生成高斯热图(sigma=1.0),作为对齐损失的监督信号。
验证与测试流水线(valid_pipeline/test_pipeline)不生成热图,仅做加载与缩放;inference_pipeline面向推理,直接以img为输入键。数据集类型为BasicImageDataset,训练/验证分别指向data/CelebA-HQ下的train_256/all_256与test_256/all_256,batch_size=2(4 GPU 下等效 8)。
需要特别说明:训练集必须包含关键点标注,因为训练流水线中的GenerateFacialHeatmap需要 GT 人脸关键点来合成热图标签。因此复现时需准备带关键点标注的 CelebA-HQ 数据。
快速开始:训练与测试
以下命令与官方文档 configs/dic/README_zh-CN.md 保持一致,完整训练/测试细节可进一步参考 docs/zh_cn/user_guides/train_test.md。
训练
# CPU 上训练 CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py # 单个 GPU 上训练 python tools/train.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py # 多个 GPU 上训练(以 8 卡为例) ./tools/dist_train.sh configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py 8其中tools/train.py与tools/dist_train.sh位于仓库根目录 tools 下。训练产出与日志保存在配置指定的work_dirs/dic_gan-x8c48b6_4xb2-500k_celeba-hq目录。
测试
# CPU 上测试 CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth # 单个 GPU 上测试 python tools/test.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth # 多个 GPU 上测试 ./tools/dist_test.sh configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth 8测试时通过 URL 直接指定预训练权重,MMagic 会自动下载。若需测试非 GAN 版本模型dic_x8c48b6_g4_150k_CelebAHQ,将配置与权重替换为对应文件即可(权重与日志见下表下载列)。
评估协议与官方结果
官方评估协议(见 configs/dic/README_zh-CN.md):
- 在RGB 通道上评估,评估前裁剪图像每个边界的
scale(即 8)像素; - 使用PSNR和SSIM作为指标,这与配置中
val_evaluator的crop_border=scale设置一致; - 训练资源:4 块 Tesla PG503-216 GPU。
两个模型的官方结果如下:
| 算法 | scale | CelebA-HQ PSNR / SSIM | GPU 信息 | 下载 |
|---|---|---|---|---|
| dic_x8c48b6_g4_150k_CelebAHQ | x8 | 25.2319 / 0.7422 | 4 (Tesla PG503-216) | 模型 | 日志 |
| dic_gan_x8c48b6_g4_500k_CelebAHQ | x8 | 23.6241 / 0.6721 | 4 (Tesla PG503-216) | 模型 | 日志 |
需要留意两点官方说明:
- 纯回归版本
dic_x8c48b6_g4_150k_CelebAHQ的 PSNR/SSIM 更高,GAN 版本追求视觉真实感,因此像素级指标反而略低,这与 GAN 超分的普遍规律一致; - 在
dic_gan_x8c48b6_g4_150k_CelebAHQ的日志数据中,DICGAN 仅在 CelebA-HQ 测试集前 9 张图片上验证,因此表中 PSNR/SSIM 与日志中的数值不同。
小结
DIC 是 MMagic 中人脸超分辨率方向的重要基线算法,其"迭代协作 + 注意力融合"的设计在 mmagic/models/editors/dic 中有完整且可读的实现。通过两套官方配置,你可以快速复现从纯回归到 GAN 对抗两种训练范式;借助GenerateFacialHeatmap数据流水线、DICNet的多步迭代结构与LightCNN判别器,可以深入理解人脸先验引导超分的完整链路。若需将 DIC 用于自定义数据集或调整放大倍数,可在配置中修改scale、mid_channels、num_steps等关键参数,并同步调整数据流水线中的缩放比例与评估器的crop_border。
- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
相关推荐
揭秘AI-Writer:RWKV模型驱动的中文小说智能创作引擎
揭秘AI Writer:RWKV模型驱动的中文小说智能创作引擎 AI Writer是一个基于RWKV架构的中文预训练生成模型,专为玄幻和言情网络小说创作而生。这
媒体生成计算机视觉深度学习人工智能大模型IDHS (I Don't Have Spotify)入门指南:5分钟学会跨平台音乐链接转换终极教程 🎵
IDHS I Don't Have Spotify 入门指南:5分钟学会跨平台音乐链接转换终极教程 🎵 还在为不同音乐平台之间的链接转换而烦恼吗?IDHS(I
媒体生成计算机视觉深度学习人工智能大模型PaddleHub falsr_c 轻量级图像超分辨率模型:基于神经架构搜索的 2 倍超分实战指南
PaddleHub falsr_c 轻量级图像超分辨率模型:基于神经架构搜索的 2 倍超分实战指南 falsr_c 是 PaddleHub 生态中一款基于 Fa
人工智能大模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考