人臉識(shí)別軟件是一款使用百度人臉識(shí)別接口做的有個(gè)簡(jiǎn)單的人臉識(shí)別工具(接口識(shí)別不準(zhǔn),僅限于娛樂),學(xué)習(xí)PyQt5做的一個(gè)人臉識(shí)別的小工具,使用百度的免費(fèi)人臉識(shí)別接口,識(shí)別不是很準(zhǔn)確,僅限學(xué)習(xí)娛樂。
調(diào)用說明
在百度AI開放平臺(tái)使用百度的人臉識(shí)別能力,只需要三個(gè)核心步驟即可操作完成:
獲取接口權(quán)限
準(zhǔn)備接口調(diào)用工具
進(jìn)行接口調(diào)用,全部流程走通只需要十分鐘時(shí)間。
百度在線人臉識(shí)別API簡(jiǎn)單實(shí)現(xiàn)教程
1.申請(qǐng)百度人臉識(shí)別應(yīng)用
首先需要在百度智能云平臺(tái)登錄
https://console.bce.baidu.com/ai/?_=1558444274128&fromai=1#/ai/face/overview/index
登陸后創(chuàng)建應(yīng)用,創(chuàng)建的應(yīng)用是人臉識(shí)別的,默認(rèn)已幫你勾選上了相關(guān)功能。
創(chuàng)建應(yīng)用后,點(diǎn)擊管理應(yīng)用,你就可以獲取API Key和Secret Key
2.獲取token
現(xiàn)在就可以編寫代碼調(diào)用在線的人臉檢測(cè)API了
首先是獲取token,用于校驗(yàn),代碼如下,注意換成自己申請(qǐng)的API Key和Secret Key
def getToken():
global token
# client_id 為官網(wǎng)獲取的AK, client_secret 為官網(wǎng)獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的API Key&client_secret=你的Secret Key'
request = urllib2.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib2.urlopen(request)
content = response.read()
if (content):
token=json.loads(content)['access_token']
3.圖片的base64編碼
上傳的用于檢測(cè)的圖片需經(jīng)過Base64編碼。需要注意的是,圖片的base64編碼是不包含圖片頭的,代碼如下:
def imgToBase64(imgPath):
with open(imgPath, "rb") as f: # 轉(zhuǎn)為二進(jìn)制格式
base64_data = base64.b64encode(f.read()) # 使用base64進(jìn)行加密
return base64_data
4.人臉識(shí)別
最后就是調(diào)用接口進(jìn)行人臉識(shí)別了
def faceDetect(imgBase64):
'''
人臉檢測(cè)與屬性分析
'''
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
request_url = request_url + "?access_token=" + token
request = urllib2.Request(request_url)
request.add_header('Content-Type', 'application/json')
data = {"image": imgBase64, "image_type": "BASE64","face_field":"age,beauty,expression,face_shape,gender"}
response = urllib2.urlopen(request, urllib.urlencode(data))
content = response.read()
if content:
return content
這個(gè)函數(shù)中輸入的是圖片的base64編碼,請(qǐng)求的參數(shù)中比較重要的是那個(gè)face_field,默認(rèn)只返回人臉框的位置、概率和旋轉(zhuǎn)角度,age(年齡預(yù)測(cè)),beauty(顏值打分),expression(表情)等更多屬性,需要在這個(gè)參數(shù)中添加,具體的請(qǐng)參考官方說明文檔:http://ai.baidu.com/docs#/Face-Detect-V3/top
5.結(jié)果繪制與可視化
人臉識(shí)別最后返回的是json數(shù)據(jù),但我們往往需要畫個(gè)框框,把人臉框出來,同時(shí)把一些預(yù)測(cè)的屬性也標(biāo)注上,這個(gè)代碼我已經(jīng)附在最后面了。
最終實(shí)現(xiàn)的效果如下:
6.實(shí)現(xiàn)的完整源代碼
下面我附上實(shí)現(xiàn)這些功能的完整代碼:
#coding:utf-8
import urllib,urllib2, sys
import ssl
import json
import base64
import cv2
global token
def getToken():
global token
# client_id 為官網(wǎng)獲取的AK, client_secret 為官網(wǎng)獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的API Key&client_secret=你的Secret Key'
request = urllib2.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib2.urlopen(request)
content = response.read()
if (content):
token=json.loads(content)['access_token']
def faceDetect(imgBase64):
'''
人臉檢測(cè)與屬性分析
'''
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
request_url = request_url + "?access_token=" + token
request = urllib2.Request(request_url)
request.add_header('Content-Type', 'application/json')
data = {"image": imgBase64, "image_type": "BASE64","face_field":"age,beauty,expression,face_shape,gender"}
response = urllib2.urlopen(request, urllib.urlencode(data))
content = response.read()
if content:
return content
def imgToBase64(imgPath):
with open(imgPath, "rb") as f: # 轉(zhuǎn)為二進(jìn)制格式
base64_data = base64.b64encode(f.read()) # 使用base64進(jìn)行加密
return base64_data
if __name__=="__main__":
getToken()
imgPath=r"C:\Users\lee\Pictures\lena.jpg"
result=json.loads(faceDetect(imgToBase64(imgPath)))['result']
face_list=result['face_list'][0]
location=face_list['location']
age=face_list['age']
beauty=face_list['beauty']
expression=face_list['expression']['type']
gender=face_list['gender']['type']
img = cv2.imread(imgPath, cv2.IMREAD_COLOR)
leftTopX=int(location['left'])
leftTopY=int(location['top'])
rightBottomX=int(leftTopX+int(location['width']))
rightBottomY = int(leftTopY + int(location['height']))
cv2.rectangle(img, (leftTopX, leftTopY), (rightBottomX, rightBottomY), (0, 255, 0), 2)
font = cv2.FONT_HERSHEY_SIMPLEX
# 第一個(gè)坐標(biāo)表示起始位置
cv2.putText(img,"age:"+str(age),(0, 20),font, 0.5, (200, 255, 255), 1)
cv2.putText(img, "gender:" + gender.encode("utf-8"), (0, 40), font, 0.5, (200, 255, 255), 1)
cv2.putText(img, "beauty:" + str(beauty), (0, 60), font, 0.5, (200, 255, 255), 1)
cv2.putText(img, "expression:" + str(expression), (0, 80), font, 0.5, (200, 255, 255), 1)
cv2.imshow('image', img)
cv2.waitKey(0)
print("end")