用Face++实现人脸关键点检测

最近看了一篇很有意思的文章 http://matthewearl.github.io/2015/07/28/switching-eds-with-python/ ,本来想自己复现一下,后来发现自己太菜,用了一整天只完成了不到一半,最近要找工作了,看书看的有点烦,本来想写个有趣的代码放松下。哎。

开始正文。原作者用的是dlib的库完成关键点检测,试着装了一下,没装成,那就不用了。本来想用自己的库,后来想了下自己封装的太烂了,还是改用别人的吧,这样程序的大小也会小很多,训练好的文件还是比较大的。

首先去Face++注册一个账号,然后创建应用(得到访问的密钥),这里直接截图了。

我用的是Python 接口,去github下载SDK  https://github.com/FacePlusPlus/facepp-python-sdk/tree/v2.0

修改apikey.cfg的内容,可以运行hello.py的历程。

注意服务器的地址不要选错,还有就是官方的历程里是这样的,API_KEY = ‘<YOUR_API_KEY>‘,替换直接的密钥时记得把<>也删掉,不然也会报错。

SDK的facepp.py文件的350行左右修改一下,添加 ‘/detection/landmark‘,这句,不然的话人脸关键点检测的接口无法调用。

这里稍微吐槽一下,Face++的SDK写的真不怎么好,很多地方不够详细,而且程序有时会因为网络问题出现bug。想上传自己的图片也找不到接口,官网只给了这么几句,

感觉解释的太简单了吧,SDK里也没有见到有相关的本地图片上传接口。

说了这么多,展示一下效果,然后贴代码。

这是人类关键点检测的效果。

由于开始选的两个脸对齐的比较好,所以换了一张,这里完成的效果是把第二幅图片的人脸缩放、旋转和第一张人脸对其。之后的操作就是裁剪、覆盖了。

下面贴一下代码,只为完成了一半(文章里写的这么多),后面的部分不太熟悉,要找工作了,没心情写代码。。。

这里建议大家自己注册一个账号,每个账号的开发者版本同时有3个线程,如果我这里修改了密钥程序应该会报错,这里可能程序无法运行。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# You need to register your App first, and enter you API key/secret.
# 您需要先注册一个App,并将得到的API key和API secret写在这里。
API_KEY = 'de12a860239680fb8aba7c8283efffd9'
API_SECRET = '61MzhMy_j_L8T1-JAzVjlBSsKqy2pUap'
# Import system libraries and define helper functions
# 导入系统库并定义辅助函数
import time
import os
import cv2
import numpy
import urllib
import re

from facepp import API

ALIGN_POINTS = list(range(0,25))
OVERLAY_POINTS=list(range(0,25))

RIGHT_EYE_POINTS = list(range(2, 6))
LEFT_EYE_POINTS = list(range(4, 8))

FEATHER_AMOUNT = 11
SCALE_FACTOR = 1
COLOUR_CORRECT_BLUR_FRAC = 0.6

def encode(obj):
        if type(obj) is unicode:
            return obj.encode('utf-8')
        if type(obj) is dict:
            return {encode(k): encode(v) for (k, v) in obj.iteritems()}
        if type(obj) is list:
            return [encode(i) for i in obj]
        return obj

def getPoints(text):
    a=encode(text)
    a=str(a)
    #print a
    x = re.findall(r'\'x\':......',a)
    for i in range(len(x)):
        x[i]=re.findall(r'\d+\.\d\d',x[i])
    y = re.findall(r'\'y\':......',a)
    for i in range(len(y)):
        y[i]=re.findall(r'\d+\.\d\d',y[i])
    xy =zip(x,y)
    return xy

def drawPoints(img,xy):     #画点,用于检测程序运行情况
    Img = img
    tmp = numpy.array(img)
    h,w,c = tmp.shape
    for i,j in xy:
        xp=float(i[0])*w/100.
        yp=float(j[0])*h/100.
        point = (int(xp),int(yp))
        cv2.circle(Img,point,1,(0,255,0))
    return Img

def get_landmarks(path,tmpPic):
    result = api.detection.detect(url = path,mode = 'oneface')
    ID = result['face'][0]['face_id']
    points = api.detection.landmark(face_id=ID,type = '25p')
    xy = getPoints(points)
    print 'downloading the picture....'
    urllib.urlretrieve(path,tmpPic)  #为防止图片内容有变化,每次都下载一遍,调试可以不用
    tmp = cv2.imread(tmpPic)

    #测试
    Img = drawPoints(tmp,xy)
    cv2.imwrite('point.jpg',Img)

    tmp = numpy.array(tmp)
    h,w,c = tmp.shape
    points = numpy.empty([25,2],dtype=numpy.int16)
    n=0
    for i,j in xy:
        xp=float(i[0])*w/100.
        yp=float(j[0])*h/100.
        points[n][0]=int(xp)
        points[n][1]=int(yp)
        n+=1
    return numpy.matrix([[i[0], i[1]] for i in points])
    #return points

def transformation_from_points(points1, points2):
    """
    Return an affine transformation [s * R | T] such that:
        sum ||s*R*p1,i + T - p2,i||^2
    is minimized.
    """
    # Solve the procrustes problem by subtracting centroids, scaling by the
    # standard deviation, and then using the SVD to calculate the rotation. See
    # the following for more details:
    #   https://en.wikipedia.org/wiki/Orthogonal_Procrustes_problem

    points1 = points1.astype(numpy.float64)
    points2 = points2.astype(numpy.float64)

    c1 = numpy.mean(points1, axis=0)
    c2 = numpy.mean(points2, axis=0)
    points1 -= c1
    points2 -= c2

    s1 = numpy.std(points1)
    s2 = numpy.std(points2)
    points1 /= s1
    points2 /= s2

    U, S, Vt = numpy.linalg.svd(points1.T * points2)

    # The R we seek is in fact the transpose of the one given by U * Vt. This
    # is because the above formulation assumes the matrix goes on the right
    # (with row vectors) where as our solution requires the matrix to be on the
    # left (with column vectors).
    R = (U * Vt).T

    return numpy.vstack([numpy.hstack(((s2 / s1) * R,
                                       c2.T - (s2 / s1) * R * c1.T)),
                         numpy.matrix([0., 0., 1.])])

def warp_im(im, M, dshape):
    output_im = numpy.zeros(dshape, dtype=im.dtype)
    cv2.warpAffine(im,
                   M[:2],
                   (dshape[1], dshape[0]),
                   dst=output_im,
                   borderMode=cv2.BORDER_TRANSPARENT,
                   flags=cv2.WARP_INVERSE_MAP)
    return output_im

if __name__ == '__main__':
    api = API(API_KEY, API_SECRET)
    path1='http://www.faceplusplus.com/static/img/demo/17.jpg'
    path2='http://www.faceplusplus.com/static/img/demo/7.jpg'
    #path2='http://cimg.163.com/auto/2004/8/28/200408281055448e023.jpg'
    tmp1='./tmp1.jpg'
    tmp2='./tmp2.jpg'

    landmarks1=get_landmarks(path1,tmp1)
    landmarks2=get_landmarks(path2,tmp2)
    im1 = cv2.imread(tmp1,cv2.IMREAD_COLOR)
    im2 = cv2.imread(tmp2,cv2.IMREAD_COLOR)
    M = transformation_from_points(landmarks1[ALIGN_POINTS],
                               landmarks2[ALIGN_POINTS])
    warped_im2 = warp_im(im2, M, im1.shape)
    cv2.imwrite('wrap.jpg',warped_im2)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 23:35:04

用Face++实现人脸关键点检测的相关文章

PCL—低层次视觉—关键点检测(rangeImage)

关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协. ——三维视觉关键点检测 1.关键点,线,面 关键点=特征点: 关键线=边缘: 关键面=foreground: 上述三个概念在信息学中几乎占据了统治地位.比如1维的函数(信号),有各种手段去得到某个所谓的关键点,有极值点,拐点...二维的图像,特征点提取算法是标定算法的核心(harris),边缘提取算法更是备受瞩目(canny,LOG.....),当然,对二维的图像也有区域所谓的前景分割算法用于提取

[CV]人脸识别检测数据集

[CV]人脸识别检测数据集 做了一段时间的人脸识别和检测,在这里列一下用过的数据集.基本上,大家近期也都是在这几个数据集上检测自己的算法.网上这方面的总结虽然不少,但是一则有些是多年前的数据,或是规模太小或是链接已经失效,再则是数据集的测试协议定义不明,不尽适合用来和其它方法做比较. 1. Labeled Faces in the Wild:做人脸识别,准确的说是人脸验证(Face Verification),UMass的LFW估计是最近被用的最多的了,LFW采用的测试协议也已经被几个新的数据集

PCL—低层次视觉—关键点检测(iss)

关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物体旋转后还能够检测出对应的关键点.不过说实话我觉的这个要求对机器人视觉来说是比较鸡肋的.因为机器人采集到的三维点云并不是一个完整的物体,没哪个相机有透视功能.机器人采集到的点云也只是一层薄薄的蒙皮.所谓的特征点又往往在变化剧烈的曲面区域,那么从不同的视角来看,变化剧烈的曲面区域很难提取到同样的关键点.想象一下一个人的面部,正面的时候鼻尖可以作为关键点,但是侧面的时候呢?会有一部分面部在阴影中,模型和之前可

SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序

项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸追踪检测 摄像头人脸检测 人脸切割显示 实时面部识别 样本自动采集 基于面部识别的程序锁 系统框图 人脸检测 人脸识别 系统截图 本程序以用户体验为中心,界面简洁.明了.易于操作.即使第一次使用该应用,也可以流利的操作. 1.主界面 2.人脸检测效果图--标准正脸 3.人脸检测效果图--人脸集 4.

通过人脸活体检测技术,解决了实名认证环节存在的风险与漏洞

人脸活体检测技术背景 由于现在各行业对客户真实性.安全性和可信度的要求较为严格,怎样在线上证明"你是你"成了各行各业发展线上业务的关键问题.随着深度学习方法的应用,基于Android.iOS人脸识别技术的识别率已经得到质的提升,人脸活体检测技术与其他生物特征识别技术相比,在实际应用中具有天然独到的优势:通过摄像头直接获取,可以非接触的方式完成识别过程,方便快捷.目前人脸活体检测技术已应用在金融.教育.景区.旅运.社保等领域. 下面简单介绍一下人脸活体检测技术 目前,人脸活体检测技术主要

『计算机视觉』Mask-RCNN_关键点检测分支(待续)

Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成 『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合 『计算机视觉』Mask-RCNN_推断网络其五:目标检测结果精炼

iOS人脸识别(检测)

iOS的CoreImage已经内建了人脸检测的接口,检测准确率一般,尤其是侧脸,基本上就检测不到.不过跟其他同类产品比较,也还算是不相上下吧.用起来很简单: CIImage* image = [CIImage imageWithCGImage:aImage.CGImage]; NSDictionary *opts = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]; CIDe

11.4关于人脸活体检测的思考&#129300;

到目前,我还没涉及到图像处理的方面,不过之前听龙华兄提起国内只有少数几家公司具备这样的技术,包括face++,腾讯,阿里等等. 自己结合以前在信息安全部门做反垃圾的经验来看,做了一些自己的思考. 活体检测本身是一个反欺诈问题,最主要的就是针对照片欺诈,如果没有活体检测,单纯由照片就可以进行欺骗性的人脸识别. 反欺诈向来都是成本之间的竞争,当欺骗成本很高,高过了所能取得的收益的时候,这些'垃圾'的流量就会去往成本更低的地方,反之亦然. 传统使用虹膜.指纹等解锁方式,利用了皮肤的电容.指纹的独一性等

PCL—低层次视觉—关键点检测(Harris)

除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更敏感.Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很好的检测出物体的角点.甚至对于标定算法而言,HARRIS角点检测是使之能成功进行的基础. HARRIS算法的思想还是很有意思的.很聪明也很trick. 1.Harris 算法 其思想及数学推导大致如下: 1.在图像中取一个窗 w (矩形窗,高斯窗,XX窗,各种窗,某师姐要改标定算法不就可以从选Har