人脸Landmark Detection

前言

    因工作需要,最近研究了一些人脸合成的东西。之前并没有接触过cv方面的东西,一切都要从零开始学起。学着学着,发现cv真的挺有意思的,想深入钻研下,当然也想在上记录下足迹。好久之前也零零星星写过几篇文字,就没有然后了。这次一定要坚持下来:)
    人脸合成学名叫face morph. 最简单的是2d图片的融合,比如把几个不同人的脸融合在一起,再比如插值生成两图之间的中间状态等。这里既包含了人脸处理里的几个重要的算法,实现起来又不复杂(注:主要参考    learnopencv(https://www.learnopencv.com)里的内容,同时结合自己的理解和实践)
一般我会分两块来说技术,第一块是背景和理论;第二块是实现和代码。处理人脸的第一步一般都是Landmark Detection(标记检测),所以先说它。

背景和理论

    计算机处理人脸,先要找到face在哪。怎么找?就是检测landmark。landmark是什么意思呢?就是在脸上绘制的若干标记点,标记点一般画在边、角、轮廓、交叉、等分等关键位置,借助它们就可以描述人脸的形态(shape).
    现在常用的开源landmark检测工具是dlib,其开源模型中的landmark包含68个点,按顺序来说: 0-16是下颌线(红),17-21是右眼眉(橙),22-26是左眼眉(黄),27-35是鼻子(浅绿),36-41是右眼(深绿),42-47是左眼(浅蓝),48-60是嘴外轮廓(深蓝),61-67是嘴内轮廓(紫)。

obama_landmark.png

    那么dlib是如何做到的呢?算法是基于histogram of oriented gradients (HOG) 和linear classifier,论文是这篇:One Millisecond Face Alignment with an Ensemble of Regression Trees by# Vahid Kazemi and Josephine Sullivan, CVPR 2014, 以后会研究一下。其开源model(shape_predictor_68_face_landmarks)是用300w的图片库训练的( iBUG 300-W face landmark dataset),直接拿来用就是了。

实现

    dlib有python的封装,所以用起来非常简单。shape_predictor_68_face_landmarks.dat是模型,可以直接下载(http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2),get_facial_landmarks函数返回一个68*2的numpy array就是landmark了。

import dlib
import cv2

predictor_path = 'shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)

def get_facial_landmarks(image):
    # detect face(s)
    dets = detector(image, 1);
    shape = np.empty([1,1])
    for k, d in enumerate(dets):
        # Get the landmarks/parts for the face in box d.
        shape = predictor(image, d);
        shape = face_utils.shape_to_np(shape);
    return shape;

img = cv2.imread('pic/obama.jpg')
landmarks = get_facial_landmarks(image)
print(landmarks)

你可能感兴趣的:(人脸Landmark Detection)