ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

老照片修复深度学习实战:从人脸检测到增强的完整流水线拆解

老照片修复深度学习实战:从人脸检测到增强的完整流水线拆解 简介这份资源是一套基于Python深度学习的老照片修复实战项目面向具备一定编程基础、希望入门图像恢复与计算机视觉的开发者与学习者用于解决破损、划痕、模糊等严重退化老照片的智能修复问题。压缩包共81个文件约50.71MB以54个py脚本为核心辅以17张png效果图、4份pdf说明文档、2个txt依赖文件及gif、jpg、md、mp4等演示素材涵盖模型训练、人脸检测对齐、推理测试与文档展示等模块。项目围绕卷积神经网络展开涉及数据预处理、损失函数与优化器选择、权重保存与推理部署并延伸至GAN等进阶修复思路可借助TensorFlow、Keras或PyTorch实现。目前已有350人学习下载。读者可据此获得一套结构完整的修复流程代码、可复现的训练与测试脚本、效果对比图及演示视频便于理解从数据到部署的全链路并在此基础上二次开发或迁移到其他图像恢复任务。1. 老照片修复项目拆包一份能跑通的深度学习修复流水线翻硬盘翻出一张外婆年轻时的照片扫出来全是划痕、噪点和褪色想修又不会 PS 的手动修补这大概是很多人找老照片修复源码的起点。这份Old_Photo_Restoration_Using_Deep_learning-main就是冲着这个场景来的它用 Python 把「人脸检测 → 对齐 → 修复 → 增强」串成了一条完整流水线不是单个模型 demo而是带run.py入口、带Face_Enhancement增强模块、带test_images样例图的工程化项目。它适合两类人一类是想拿现成代码直接修自己照片的另一类是拿它当深度学习实战项目案例、想搞懂图像修复全流程怎么落地的。下面我按拆包顺序讲清楚每个模块干什么、参数怎么调、哪里容易翻车。2. 环境与依赖requirements.txt 里藏着的版本坑2.1 先看清这套代码的技术栈构成从目录结构看这个项目不是纯 PyTorch 或纯 TensorFlow 的单框架工程而是混用了多个库detection_models和models目录下是模型定义util放工具函数data和options管数据加载和配置根目录的train_mapping.py、train_domain_A.py、train_domain_B.py是训练脚本test.py、test_face.py是推理入口。人脸检测部分依赖 dlib从detect_all_dlib.py、align_warp_back_multiple_dlib.py这些文件名就能看出来它用的是 dlib 的 68 点人脸关键点做对齐和裁剪。修复主干网络常见做法是 U-Net 或类似编码器-解码器结构增强部分Face_Enhancement大概率是 GAN 思路的细化网络。这意味着你至少要准备 dlib、OpenCV、PyTorch或 TensorFlow看models里的 import、numpy、Pillow 这几样。2.2 依赖安装的可复现步骤先建虚拟环境再装依赖别直接往系统 Python 里灌这是血泪经验# 创建独立环境Python 版本建议 3.7~3.9太新的版本 dlib 编译容易挂 conda create -n oldphoto python3.8 conda activate oldphoto # 先装 dlib 的前置cmake 和 boost conda install -c conda-forge cmake boost # 再装 dlib这一步最容易翻车编译要几分钟 pip install dlib19.22.0 # 装项目 requirements pip install -r requirements.txt逻辑说明dlib 是这套流水线的第一道关卡人脸检测和对齐全靠它。requirements.txt里如果没锁 dlib 版本直接pip install dlib会拉最新版而新版 dlib 对 numpy 版本有要求容易和 PyTorch 自带的 numpy 打架。参数上dlib19.22.0是个相对稳的版本配合 Python 3.8 编译成功率最高。如果你在 Windows 上cmake 和 boost 建议用 conda 装而不是 pippip 装的 boost 经常找不到头文件。2.3 验证环境是否真的通了装完别急着跑run.py先单独验证 dlib 能不能检测到人脸import dlib import cv2 # 加载 dlib 正面人脸检测器 detector dlib.get_frontal_face_detector() img cv2.imread(test_images/old_w_scratch.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 第二个参数 1 表示上采样一次小脸照片可以调到 2 faces detector(gray, 1) print(f检测到 {len(faces)} 张人脸) for f in faces: print(f.left(), f.top(), f.right(), f.bottom())逻辑说明get_frontal_face_detector()返回的是 HOG 特征 线性分类器的人脸检测器不需要 GPU。第二个参数是上采样次数默认 0老照片人脸小、模糊调到 1 或 2 能提高召回但计算量翻倍。如果这一步报RuntimeError: Unable to open shape_predictor_68_face_landmarks.dat说明关键点模型文件没下需要单独去 dlib 官方下载shape_predictor_68_face_landmarks.dat放到项目根目录或data下。3. 修复流水线拆解从 detect_all_dlib 到 Face_Enhancement3.1 人脸检测与对齐为什么先对齐再修复老照片修复不是整图直接丢进网络就完事。整图修复的问题在于背景、衣服、人脸混在一起网络学不到人脸特有的结构先验修出来的人脸容易糊成一团。这个项目的做法是先检测人脸再用 68 个关键点做仿射变换对齐到标准姿态然后只修人脸区域最后贴回原图。align_warp_back_multiple_dlib.py和align_warp_back_multiple_dlib_HR.py就是干这个的HR 版本应该是给高分辨率图用的变换矩阵精度更高。对齐的核心是相似变换用两只眼睛和嘴巴中心三个点算出旋转、缩放、平移把人脸摆正。这样修复网络看到的人脸都是正脸、大小一致训练和推理的分布才对得上。3.2 跑通推理run.py 的参数怎么设run.py是主入口常见做法是它内部调用检测、对齐、修复、增强四个步骤。跑之前先确认test_images里有图然后# 基础推理默认处理 test_images 下所有图 python run.py --input_dir test_images --output_dir results # 如果只想处理单张常见参数名是 --input_path python run.py --input_path test_images/old_w_scratch.jpg --output_dir results # 开启人脸增强通常有个开关 python run.py --input_dir test_images --output_dir results --enhance逻辑说明--input_dir和--output_dir是最基本的输入输出路径。--enhance这类开关控制是否走Face_Enhancement模块开了之后人脸细节更锐但速度慢一倍左右。如果你的图里人脸特别小还要看有没有--upsample或--scale参数没有的话就得改detect_all_dlib.py里 detector 的第二个参数。注意不同版本参数名可能不一样跑之前先python run.py --help看一眼别硬套。3.3 训练脚本的分工train_domain_A 和 train_domain_B 是什么train_domain_A.py和train_domain_B.py大概率是域适应或两阶段训练的思路。Domain A 可能是退化图到清晰图的映射Domain B 可能是清晰图到增强图的映射train_mapping.py负责学两个域之间的映射关系。这种设计在图像修复里常见于「先粗修再精修」的两阶段方案。训练前要改options目录下的配置文件指定数据路径、batch size、学习率、epoch 数。常见配置项参数含义建议值batch_size每批样本数4~8显存 8G 以下用 4lr初始学习率1e-4Adam 优化器epoch训练轮数50~100看数据量image_size输入分辨率256 或 512对齐后的人脸尺寸训练时如果 loss 不降先检查数据对是不是对齐了——输入和标签图必须经过同样的变换否则网络学的是错位映射loss 会卡住不动。4. 避坑与排查五个真实翻车记录4.1 现象dlib 装不上报 cmake 找不到原因pip 装 dlib 需要本地编译系统里没有 cmake 或版本太低。解决先conda install -c conda-forge cmake再pip install dlib。Windows 上还要装 Visual Studio Build Tools否则编译到一半报缺编译器。4.2 现象跑 run.py 报 CUDA out of memory原因默认 batch 或输入分辨率太大显存不够。解决把options里的image_size从 512 降到 256或者把run.py里的批处理改成逐张推理。如果还不行加torch.cuda.empty_cache()在每张图处理后清缓存。4.3 现象修复结果人脸是歪的或贴回位置不对原因对齐时的变换矩阵和贴回时的逆变换不匹配常见于align_warp_back系列脚本里参数传错。解决检查align_warp_back_multiple_dlib.py里warp_back函数用的矩阵是不是对齐矩阵的逆以及贴回时的坐标偏移有没有算上裁剪框的左上角坐标。4.4 现象检测不到人脸输出全是原图原因老照片人脸模糊、对比度低dlib 的 HOG 检测器召回不够。解决把 detector 的上采样参数从 0 调到 1 或 2或者先对图做直方图均衡化再检测实在不行换 CNN 人脸检测器但那就不是这套代码的原生方案了。4.5 现象训练 loss 震荡不收敛原因学习率太大或者数据对没对齐。解决先把 lr 降到 1e-5 试几个 epoch如果 loss 开始降说明是 lr 问题如果还不降抽查几对训练数据把输入和标签叠在一起看边缘是否重合不重合就是数据预处理阶段对齐没做好。5. 进阶技巧用 Face_Enhancement 做二次精修与效果验证Face_Enhancement这个模块值得单独拿出来说因为它决定了修复结果是「能看」还是「像真的」。粗修网络U-Net 那类输出的脸往往偏平滑细节纹理丢失而增强模块通常用 GAN 的判别器逼着生成器补回毛孔、皱纹、发丝这些高频信息。我一般会分两步跑先关掉 enhance 跑一遍看整体结构对不对再开 enhance 跑一遍看细节。对比两张结果如果开了 enhance 之后脸上出现不自然的纹理块说明增强网络过拟合了训练集里的人脸分布这时候要么降低增强模块的权重要么换更接近目标年代的人脸数据微调。验证修复效果不能只看肉眼。常见做法是算 PSNR 和 SSIM但这两个指标在生成式修复里参考价值有限因为 GAN 会「编」出原图没有的细节PSNR 反而可能降低。更实用的验证方法是把修复后的脸做一次人脸识别看能不能和原图识别成同一个人。用 dlib 的face_recognition库算 128 维 embedding 的余弦距离距离小于 0.6 基本认为是同一个人。如果修复后识别不出来说明修复过程把人脸身份特征改掉了这种结果再好看也不能用。还有一个实操习惯每次改完参数跑完把输入、粗修输出、增强输出三张图拼成一张对比图存下来文件名带上参数。跑多了之后翻对比图比翻日志快得多。从那以后我每次调修复模型都强制走一遍「检测对齐验证 → 粗修 → 增强 → 人脸识别一致性检查」这条链少一步都可能白跑。希望帮到你。本文还有配套的精品资源点击获取
返回列表