2021SC@SDUSC
修复过程中用到的主要几个函数分析,FaceRestoreHelper为该项目成功运行必须下载的一个类
一、FaceRestoreHelper中的clean_all函数
将用来保存数据的一些列表清空,对下一张照片进行修复
二、FaceRestoreHelper中的read_image函数
?在使用过程中传入的img参数是一张图片,先判断img是不是string即是不是图片的路径,如果是路径就通过cv2.imread函数进行图片的读取。在测试的图片中,np.max(img)= 256,len(img.shape) = 3,所以底下的代码均不会执行,只会将图片赋值给input_img, 上述第一个if的作用是将图片转换位16位的,底下的if和elif作用均是将图片的转为BGR格式
三、FaceRestoreHelper中的get_face_landmarks_5函数
首先判断resize是否为None,即判断是否需要改变图片大小,如果不需要则将需要修复图片直接赋值给input_img,如果需要则进行下面的操作,将图片大小缩小
?with torch.no_grad查资料得到的结果是,被他包住的的代码,不需要求梯度,也不需要反向传播。face_det是一个面部检测模型,detect_faces方法是通过神经网络模型来进行面部识别的,将检测到的面部保存到bboxes中,然后遍历这个列表,判断视距是否小于规定标准,则不保存这张脸,如果符合标准,则将这张脸的坐标保存到all_landmarks_5列表中,同时将bbox的前5项保存到det_face中。
如果保存的面部图片为0,则返回0,如果只保存最大的一张面部,则将all_landmark_5的内容更改为最大一张面部的位置,如果只保存最中心的一张面部,则将all_landmark_5的内容更改为最中心的一张面部的位置。之后还会对面部位置进行扩充
四、FaceRestoreHelper中的align_warp_face函数
?作用是查看pad_input_imgs(扩充了的)的长度和all_landmark_5的长度是否匹配,不匹配就会输出提示
遍历面部位置的列表?,然后通过cv2.estimateAffinePartjal2D得到仿射矩阵,然后将每一张面部得到的仿射矩阵添加到affine_matrices中。然后通过cv2.warpAffine函数传入仿射变换矩阵来将每一张面部裁剪出来,保存到cropped_faces中。
总结:主要分析了上一篇中用到的函数,对图片,获得图片中面部位置,分割图片(通过cv2.estimateAffinePartjal2D和cv2.warpAffine函数得到)。
|