最近在实现Pairwise Relational Networks for Face Recognition论文,预处理人脸时发现资料没那么好找,现整理成jupyter文档方便回顾。预处理的总体流程:

  • 人脸关键点检测
  • 根据眼部关键点旋转图片做人脸对齐
  • 旋转人脸关键点,使其与对齐后的图片匹配
  • 根据关键点裁剪人脸到固定尺寸(此步骤和PRN论文略有不同)
  • 变换人脸关键点,使其与裁剪后的图片匹配

1 Imports


import


2 导入图片


img_name


python给人脸添加特效 python 人脸对齐_python给人脸添加特效


3 人脸检测

使用face_recognition api检测人脸的关键点, model=”large”时返回68个关键点, model=”small”时返回5个关键点。


face_landmarks_list


定义人脸关键点可视化函数


def


可视化人脸关键点


visualize_landmark


python给人脸添加特效 python 人脸对齐_人脸对齐_02


4 人脸对齐

4.1 人脸旋转对齐

人脸对齐思路:

  • 分别计算左、右眼中心坐标
  • 计算左右眼中心坐标连线与水平方向的夹角θ
  • 计算左右两眼整体中心坐标
  • 以左右两眼整体中心坐标为基点,将图片array逆时针旋转θ

以下定义了人脸对齐函数


def


根据眼睛位置旋转整个图片,达到人脸对齐的目的。下图可以看出,旋转后图片(右图)中的人脸一对齐,双眼在水平方向上。align_face函数输出的eye_center, angle会在章节4.2张使用到。


aligned_face


python给人脸添加特效 python 人脸对齐_人脸对齐_03


4.2 人脸关键点旋转

图片旋转后,图中的landmark坐标也要相应旋转,这样landmark才能匹配旋转后的图片。landmark旋转前的效果如下:


visualize_landmark


python给人脸添加特效 python 人脸对齐_python给人脸添加特效_04


定义旋转图片中坐标的函数,具体公式推导见平面内直角坐标系中坐标旋转变换公式 - Eric_Wangyz的博客 - CSDN博客。另,由于图片和普通坐标系的原点不同,两者坐标点的旋转方式略有出入,图片坐标旋转涉及y坐标在图片坐标系和普通坐标系之间的变换,


def


定义旋转图片中landmark的函数,以人脸双眼中心为基点,将每个人脸关键点逆时针旋转θ,该θ角度是人脸对齐的旋转角度。


def


以下旋转所有人脸关键点,并可视化。


rotated_landmarks


python给人脸添加特效 python 人脸对齐_python 实现显著性检测_05


5 人脸裁剪

通常,人脸对齐后会根据landmark裁剪人脸到固定尺寸,再feed近卷积网络。此处裁剪的思路为:

  • 水平方向以最靠左和最靠右的landmark的中点为裁剪后图片的中心点
  • 垂直方向上分为三部分
  • 中部:两眼landmark中心到嘴巴landmark中心的像素距离
  • 底部和顶部:(size-两眼landmark中心到嘴巴landmark中心的距离)/2,size为输入高度

定义裁剪函数


def


人脸裁剪后,大小变成了140 * 140。


cropped_face


python给人脸添加特效 python 人脸对齐_github_06


定义landmark变换函数,由于图片裁剪,landmark坐标需要再次变换。


def


landmark坐标变换后完美fit裁剪后的人脸。


transferred_landmarks


python给人脸添加特效 python 人脸对齐_人脸对齐_07


======================= 更 新 =======================

6 人脸裁剪逻辑修改

应知友需求,修改人脸裁剪逻辑以适应不同尺寸的输入图片,调整后的人脸裁剪逻辑和PRN论文一致:

  • 垂直方向上分为三部分
  • 中部:两眼landmark中心到嘴巴landmark中心的像素距离,占垂直方向的35%
  • 底部:占垂直方向的35%
  • 顶部:占垂直方向的30%
  • 水平方向以最靠左和最靠右的landmark的中点为裁剪后图片的中心点,crop区域w=h
def


裁剪后图片长宽相等,feed进网络前可按需resize。


python给人脸添加特效 python 人脸对齐_预处理_08


======================= 资 源 =======================

最新jupyter文件地址:

DANNALI35/zhihu_articlegithub.com

python给人脸添加特效 python 人脸对齐_python给人脸添加特效_09