2021SC@SDUSC
源码:utils.py
本篇主要分析utils.py中的class GFPGANer的enhance()方法,该方法实现了图像的修复
目录
(2).修复前对图片进行预处理:仿射变换(对齐),相似变换(截取)
(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