最近在实现Pairwise Relational Networks for Face Recognition论文,预处理人脸时发现资料没那么好找,现整理成jupyter文档方便回顾。预处理的总体流程:
- 人脸关键点检测
- 根据眼部关键点旋转图片做人脸对齐
- 旋转人脸关键点,使其与对齐后的图片匹配
- 根据关键点裁剪人脸到固定尺寸(此步骤和PRN论文略有不同)
- 变换人脸关键点,使其与裁剪后的图片匹配
1 Imports
import
2 导入图片
img_name
3 人脸检测
使用face_recognition api检测人脸的关键点, model=”large”时返回68个关键点, model=”small”时返回5个关键点。
face_landmarks_list
定义人脸关键点可视化函数
def
可视化人脸关键点
visualize_landmark
4 人脸对齐
4.1 人脸旋转对齐
人脸对齐思路:
- 分别计算左、右眼中心坐标
- 计算左右眼中心坐标连线与水平方向的夹角θ
- 计算左右两眼整体中心坐标
- 以左右两眼整体中心坐标为基点,将图片array逆时针旋转θ
以下定义了人脸对齐函数
def
根据眼睛位置旋转整个图片,达到人脸对齐的目的。下图可以看出,旋转后图片(右图)中的人脸一对齐,双眼在水平方向上。align_face函数输出的eye_center, angle会在章节4.2张使用到。
aligned_face
4.2 人脸关键点旋转
图片旋转后,图中的landmark坐标也要相应旋转,这样landmark才能匹配旋转后的图片。landmark旋转前的效果如下:
visualize_landmark
定义旋转图片中坐标的函数,具体公式推导见平面内直角坐标系中坐标旋转变换公式 - Eric_Wangyz的博客 - CSDN博客。另,由于图片和普通坐标系的原点不同,两者坐标点的旋转方式略有出入,图片坐标旋转涉及y坐标在图片坐标系和普通坐标系之间的变换,
def
定义旋转图片中landmark的函数,以人脸双眼中心为基点,将每个人脸关键点逆时针旋转θ,该θ角度是人脸对齐的旋转角度。
def
以下旋转所有人脸关键点,并可视化。
rotated_landmarks
5 人脸裁剪
通常,人脸对齐后会根据landmark裁剪人脸到固定尺寸,再feed近卷积网络。此处裁剪的思路为:
- 水平方向以最靠左和最靠右的landmark的中点为裁剪后图片的中心点
- 垂直方向上分为三部分
- 中部:两眼landmark中心到嘴巴landmark中心的像素距离
- 底部和顶部:(size-两眼landmark中心到嘴巴landmark中心的距离)/2,size为输入高度
定义裁剪函数
def
人脸裁剪后,大小变成了140 * 140。
cropped_face
定义landmark变换函数,由于图片裁剪,landmark坐标需要再次变换。
def
landmark坐标变换后完美fit裁剪后的人脸。
transferred_landmarks
======================= 更 新 =======================
6 人脸裁剪逻辑修改
应知友需求,修改人脸裁剪逻辑以适应不同尺寸的输入图片,调整后的人脸裁剪逻辑和PRN论文一致:
- 垂直方向上分为三部分
- 中部:两眼landmark中心到嘴巴landmark中心的像素距离,占垂直方向的35%
- 底部:占垂直方向的35%
- 顶部:占垂直方向的30%
- 水平方向以最靠左和最靠右的landmark的中点为裁剪后图片的中心点,crop区域w=h
def
裁剪后图片长宽相等,feed进网络前可按需resize。
======================= 资 源 =======================
最新jupyter文件地址:
DANNALI35/zhihu_articlegithub.com