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.pswp.cn/news/538385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538385.shtml
英文地址,請注明出處:http://en.pswp.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(…