python人脸关键点识别_用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 = ‘‘,替换直接的密钥时记得把<>也删掉,不然也会报错。

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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【东营seo】SEO发展下的大机遇

【东营seo】SEO发展下的大机遇 seo优化越来越难做&#xff0c;很多的人都开始怀疑seo优化没有价值。的确现如今seo优化与十年前比确实不是一个级别的&#xff0c;即便如此&#xff0c;seo优化还是存在其持续发展的机制。  自然搜索排名不再是唯一的竞争点&#xff0c;语音搜索…

手机整屏显示数据php,完美解决手机网页大背景不能铺完整个屏幕的超级代码

html,body{min-height:100%;} 优化 html{min-height:100%;} html,body{min-height:100%;}body{background-image:url(bg_640.jpg);background-size:cover;babackground-repeat:no-repeat;}.main{padding-top:141%;text-align:cenhtml,body{min-height:100%;}优化html{min-heigh…

python linux教程_Python入门系列教程1—linux基础

课程咨询、获取课件、技术交流直接加入博学谷在线学习&#xff1a;631731828课程简介本课程是Python系列入门课程的第一阶段&#xff0c;首先通过介绍不同领域的三种操作系统&#xff0c;操作系统的发展简史以及Linux系统的文件目录结构&#xff0c;让大家对Linux系统有一个简单…

如何解决android studio的模拟器有密码的问题

原文链接&#xff1a;https://jingyan.baidu.com/article/e4d08ffd6a95300fd2f60dcf.html ------------------------ 在使用Android Studio的时候&#xff0c;创建的模拟器开机竟然有密码,提示&#xff1a;to start android,enter your password&#xff0c;困扰了好长时间&am…

为回馈广大学员,智捷课堂买关老师Cocos2d-x课程送Cocos2d-x图书

为回馈广大学员&#xff0c;智捷课堂买关老师Cocos2d-x课程送Cocos2d-x图书 一、凡购买如下课程送一本图书&#xff1a; 1、 Cocos2d-x入门与提高视频教程__Part 22、 Cocos2d-x数据持久化与网络通信__Part 33、 Cocos2d-x架构设计与性能优化内存优化视频教程__Part 44、 Cocos…

java手机音乐文件夹,从原始文件夹打开音乐文件,使用Android上的意图在设备的默认应用程序上播放...

我正在尝试写一个打开设备默认音乐播放器的意图来播放我在android工作室项目中的原始文件夹上的音乐文件(mp3) . 到目前为止&#xff0c;我找到了意图的代码&#xff0c;但我得到了如何命令它打开特定的mp3文件&#xff0c;在媒体播放器上播放到目前为止&#xff0c;我写了这样…

表正在被别的用户或进程使用_linux内核对进程的管理分为两个方面

嵌入式开发直播课 - linux内核通知链 - 创客学院直播室​www.makeru.com.cn众所周知&#xff0c;现在的分时操作系统能够在一个CPU上运行多个程序&#xff0c;让这些程序表面上看起来是在同时运行的。linux就是这样的一个操作系统。在linux系统中&#xff0c;每个被运行的程序实…

android studio生成签名导打包的方法

原文链接&#xff1a;http://blog.csdn.net/l_215851356/article/details/69914213 ---------------------------------如果图片失效了&#xff0c;见有道云笔记------------------- 方法一&#xff1a; 在android中。可以非常快速的生成签名文件.jsk文件。步骤如下&#xff1…

C艹 指针和const的关系和注意事项(非常有意思)

有两种不同的形式将const关键字指向指针。 第一种&#xff1a;让指针指向一个常量对象 const float g_moon 1.63; float * pm &g_moon; // 不允许 no allowed 第二种&#xff1a; 是将指针本身声明为常量 声明一个指向常量的指针pt int age 39; const int *pt &age…

concat php,php基于concat实现无限分类

这篇文章主要介绍了php无限分类使用concat是如何实现的&#xff0c;需要的朋友可以参考下一、数据库设计---- Table structure for table category--CREATE TABLE category (id int(11) NOT NULL auto_increment,catpath varchar(255) default NULL,name varchar(255) default …

vbs脚本延时_Wincc的脚本进程执行问题

接到某同事B的电话&#xff0c;说是一段Wincc里面的VBS脚本出现了问题&#xff1a;A按钮和B按钮&#xff0c;要求A按钮点击后&#xff0c;对plc某变量写1并等待5s后写0&#xff0c;在这5s期间如果点击B按钮&#xff0c;同样是对另外一个变量如此操作&#xff0c;则plc在5s内检测…

禁止进入activity后EditText自动获得焦点的方法

原文链接&#xff1a;http://blog.csdn.net/tablle/article/details/51659277 --------------------- 1、禁止进入activity后EditText自动获得焦点的方法 在项目中&#xff0c;一进入一个页面, EditText默认就会自动获取焦点。 那么如何取消这个默认行为呢&#xff1f; 在网上…

微信小程序 - 非Form数据怎么发送到后端?

通过设置异步缓存&#xff0c;就可以做到 wx.setStorageSync(imgs,imglist); 最后的提交信息&#xff1a;

python抓包代码_Python抓包并解析json爬虫的完整实例代码

Python抓包并解析json爬虫FwA免费资源网在使用Python爬虫的时候&#xff0c;通过抓包url&#xff0c;打开url可能会遇见以下类似网址&#xff0c;打开后会出现类似这样的界面&#xff0c;无法继续进行爬虫&#xff1a;FwA免费资源网FwA免费资源网例如&#xff1a;FwA免费资源网…

Android之back键拦截处理

原文链接&#xff1a;http://blog.csdn.net/lyjit/article/details/51597160 ---------------------------------------------------- Back键是手机上的后退键&#xff0c;在Android上有两种方法来获取该按钮的事件。 ** 一&#xff1a;如何捕获Back按键事件 ** 1.直接获取按…

php富强民主,WordPress主题添加“富强、民主、文明、和谐、”等鼠标点击特效

打开“外观-主题-编辑-(最右侧)模板-主题页脚 (footer.php)”加入以下代码/* 鼠标特效 */var a_idx 0;jQuery(document).ready(function($) {$("body").click(function(e) {var a new Array("富强", "民主", "文明", "和谐&quo…

DjangoAdmin站点调整列表页展示

调整列表页展示 1 页大小 每页中显示多少条数据&#xff0c;默认为每页显示100条数据&#xff0c;属性如下&#xff1a; list_per_page1001&#xff09;打开booktest/admin.py文件&#xff0c;修改AreaAdmin类如下&#xff1a; class BookInfoAdmin(admin.ModelAdmin):list_per…

大华热成像netsdkdemo_千年博物,智慧展馆丨大华股份全力守护“华夏珍宝库”...

陕西历史博物馆作为我国第一座大型现代化国家级博物馆&#xff0c;以及首批国家一级博物馆和全国排名前五的国家顶级博物馆&#xff0c;被誉为“古都明珠 华夏宝库”&#xff0c;是讲述五千年中华文化的大学堂&#xff0c;是我国博物馆事业发展的重要里程碑。随着陕西历史博物馆…

Android中scrollview与webview冲突事件

原文链接&#xff1a;http://www.linuxidc.com/Linux/2014-03/98847.htm -------------------------------------------------------------- 在做更新界面的时候&#xff0c;同时使用了scrollview和webview两个组件。在模拟器中测试的时候没有问题&#xff0c;但是在手机上测试…

最新php常用函数200个,180多个PHP常用函数总结

我们知道任何有效的 php 代码都有可能出现在函数内部&#xff0c;甚至包括其它函数和类定义。本文我们主要和大家分享180多个PHP常用函数总结&#xff0c;希望能帮助大家更高效的学习PHP。数学函数1.abs(): 求绝对值$abs abs(-4.2); //4.211输入: 数字输出: 绝对值数字2.ceil(…