GFPGAN源码分析—第四篇
2021/12/7 1:18:21
本文主要是介绍GFPGAN源码分析—第四篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
2021SC@SDUSC
源码:utils.py
本篇主要分析utils.py中的class GFPGANer的enhance()方法,该方法实现了图像的修复
目录
enhance( )
(1).清空之前初始化的face_helper的所有参数
(2).修复前对图片进行预处理:仿射变换(对齐),相似变换(截取)
(3)人脸修复
(4)调用astype('uint8')会将小数部分直接截去,0-255之间的整数保留
(5)如果满足not has_aligned=True:修复前没有图像对齐 和paste_back=True:设置了需要将修复好的人脸贴回原图;做以下操作:
enhance( )
参数:(self, img, has_aligned=False, only_center_face=False, paste_back=True)
(1).清空之前初始化的face_helper的所有参数
#查看clean_all函数的实现 def clean_all(self): self.all_landmarks_5 = [] self.restored_faces = [] self.affine_matrices = [] self.cropped_faces = [] self.inverse_affine_matrices = [] self.det_faces = [] self.pad_input_imgs = []
(2).修复前对图片进行预处理:仿射变换(对齐),相似变换(截取)
if has_aligned: img = cv2.resize(img, (512, 512)) self.face_helper.cropped_faces = [img] else: self.face_helper.read_image(img) # get face landmarks for each face self.face_helper.get_face_landmarks_5(only_center_face=only_center_face) # align and warp each face self.face_helper.align_warp_face()
(3)人脸修复
遍历face_helper截取的所有cropped_face,修复前再做一下处理:归一化等
for cropped_face in self.face_helper.cropped_faces: # prepare data cropped_face_t = img2tensor(cropped_face / 255., bgr2rgb=True, float32=True) #归一化 normalize(cropped_face_t, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), inplace=True) cropped_face_t = cropped_face_t.unsqueeze(0).to(self.device)
调用gfpgan对图像进行修复,失败的话输出错误提醒,并返回未修复的照片
try: output = self.gfpgan(cropped_face_t, return_rgb=False)[0] # convert to image restored_face = tensor2img(output.squeeze(0), rgb2bgr=True, min_max=(-1, 1)) except RuntimeError as error: print(f'\tFailed inference for GFPGAN: {error}.') restored_face = cropped_face
经过修复后图片矩阵的数字一定的float的。但是需要保存.png,所以图片的数字类型必须变到[0,255]的整数,
(4)调用astype('uint8')会将小数部分直接截去,0-255之间的整数保留
restored_face = restored_face.astype('uint8') self.face_helper.add_restored_face(restored_face)
(5)如果满足not has_aligned=True:修复前没有图像对齐 和paste_back=True:设置了需要将修复好的人脸贴回原图;做以下操作:
-
bg_upsampler存在的话,使用RealESRGAN对输入的完整图片进行修复,提高分辨率
-
将修复好的人脸贴回原图(即上一步RealESRGAN修复的完整图片)
-
返回修复过程中得到的图像包括:修复前的人脸,修复后的人脸以及完整的修复图片
if not has_aligned and paste_back: if self.bg_upsampler is not None: # Now only support RealESRGAN bg_img = self.bg_upsampler.enhance(img, outscale=self.upscale)[0] else: bg_img = None self.face_helper.get_inverse_affine(None) # paste each restored face to the input image restored_img = self.face_helper.paste_faces_to_input_image(upsample_img=bg_img) return self.face_helper.cropped_faces, self.face_helper.restored_faces, restored_img else: return self.face_helper.cropped_faces, self.face_helper.restored_faces, None
这篇关于GFPGAN源码分析—第四篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南