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源码分析—第二篇


下一篇:vcf文件新建索引(idx)