最近看了一篇很有意思的文章 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 = ‘‘,替换直接的密钥时记得把<>也删掉,不然也会报错。

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)

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

python人脸关键点识别_用Face++实现人脸关键点检测相关推荐

  1. 【人脸表情识别】基于图片的人脸表情识别,基本概念和数据集

    大家好,欢迎来到我们人脸表情识别的专栏,这是专栏的第一篇文章,今天我们讨论的问题是关于表情识别的基本概念和数据集. 作者&编辑 | Menpinland 在较早之前,有三AI已经有一篇< ...

  2. c++ 人脸识别_应用层下的人脸识别(四):人脸研判

    作者根据多年人脸识别项目经验,总结了人脸识别技术在安防.商业领域应用及产品设计细节,汇总成应用层下的人脸识别系列文章.本文为系列文章的第四篇,从什么是人脸研判及人脸研判类型和应用两方面介绍相关内容. ...

  3. python场景文字识别_针对复杂场景的 OCR 文本识别,推荐一个Python 库!

    大家好,我是 zeroing~ 1,前言 之前谈到图片文本 OCR 识别时,写过一篇文章介绍了一个 Python 包 pytesseract ,具体内容可参考 介绍一个Python 包 ,几行代码可实 ...

  4. 人物关系 人脸识别_一种基于人脸识别系统的人物关系挖掘系统及方法与流程...

    本发明涉及人脸识别技术领域,具体涉及一种基于人脸识别技术进行人物关系挖掘的系统及其方法. 背景技术: 人脸识别作为生物身份识别的典型技术,由于不需要被检测个体的主动配合,近年来在人机交互,安防,身份认 ...

  5. python opencv 文字识别_文本识别 使用 Tesseract 进行 OpenCV OCR 和 文本识别

    文本识别 用 Tesseract 进行 OpenCV OCR 和 文本识 在本教程中,您将学习如何应用OpenCV OCR(光学字符识别).我们将使用OpenCV,Python和Tesseract 执 ...

  6. 小程序加入人脸识别_微信小程序 人脸识别登陆模块

    微信小程序---人脸识别登陆的实现 关键词:微信小程序 人脸识别 百度云接口 前言 这是一篇关于一个原创微信小程序开发过程的原创文章.涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口.小程序的 ...

  7. svm 用来人脸识别_基于SVM的人脸识别

    基于 SVM 的人脸识别 摘要 :主成分分析( PCA )是人脸识别中特征提取的主要方法,支持向量机 ( SVM )具有适合处理小样本.非线性和高维数问题,利用核函数且泛化能力强 等多方面的优点.文章 ...

  8. Keras实战——人脸表情识别(二)提取人脸并识别表情

    完整代码已上传 CSDN下载:https://download.csdn.net/download/pmj110119/11293264 百度云:https://pan.baidu.com/s/16Z ...

  9. python人脸口罩识别_基于Python+OpenCV的人脸口罩识别检测

    以下编程在Jupyter notbook平台上进行 一.OpenCV下载安装 二.人脸口罩数据集下载处理 (一)人脸口罩数据集下载 下载人脸口罩数据集的目的是利用OpenCV进行模型训练,这里采用口罩 ...

最新文章

  1. Miscellaneous Character Drivers
  2. esp32cam与下载板的实际有效接线图
  3. JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例
  4. java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO
  5. microsoft符合服务器加载符号的解决方案
  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 解组合指令
  7. heatmap(热图)
  8. web.xml配置简介
  9. 【转】图标字体化浅谈
  10. DeepFake技术--DeepFakes 概述(一)(二)
  11. 用大数据挑选出国外最值得看的前50条swift教程(v.2019)
  12. 保姆级的Arduino循迹小车研发日志及一些坑(其中包含L298N、Arduino、TCRT5000以及1:48的TT电机的使用)
  13. 物联lot是什么意思_什么是物联网,物联网(lOT)简介
  14. 计算机系统定期验证,计算机化系统验证基本原则
  15. Java求指定精度的开根号运算
  16. 攻防实战 | 芙蓉区网络安全技能大比武暨网络安全应急攻防演练圆满结束!
  17. Idea 2022 创建 Artifacts 运行 Tomcat 步骤
  18. yum update和yum upgrade的真正区别
  19. 倒霉---落枕了---谈谈落枕
  20. 富通天下(W 笔试)

热门文章

  1. 基于spring注解AOP的异常处理
  2. krpano 场景切换 通知_一个基于Vulkan的异步场景加载设计
  3. android模拟器太卡,安卓模拟器安装之后太卡怎么解决
  4. arm linux 存储,linux arm的存储分布那些事
  5. .net 从txt中读取行数据_【VBA项目】从指定文件中读取数据并绘制图表
  6. 计算机常用主题词,标引主题词的目的是( )。A.反映文件的全部内容B.便于计算机检索和管理C.供归_考题宝...
  7. python控制台清屏_Python Shell 怎样清屏?
  8. python cnn 实例_基于CNN的纹理合成实践【附python实现】
  9. IIS 5 与IIS 6 原理介绍
  10. sql语言特殊字符处理