1. 程式人生 > >呼叫face++平臺api進行人臉識別

呼叫face++平臺api進行人臉識別

Face++介紹:

Face++平臺提供一整套世界領先的人臉檢測,人臉識別,面部分析的視覺技術服務。通過提供雲端API、離線SDK等供使用者進行開發,像支付寶人臉支付使用的技術就是Face++。(face++的介紹

每個人在Face++的官網註冊賬號後可以申請新建API,填寫相關資訊後,隨後會分配API key和 API Secrect。我們可以選擇試用的服務,由於是免費的有的功能不支援。
這裡寫圖片描述

分配的API key和 API Secrect,有了這兩個東西才能呼叫api。
這裡寫圖片描述

官網提供了API文件和演示。
這裡寫圖片描述

開啟api文件可以檢視詳細說明,很詳細不多說了。
這裡寫圖片描述

實驗平臺:

我的測試程式是在Ubuntu下自帶的Python環境下編寫,用到了Python-OpenCV,所以要裝一下Python-OpenCV。

console下輸入:

sudo apt-get install python-opencv

很快就會安裝完成,並且會自動配置好環境變數。

import cv包和cv2包看看,發現沒有報錯,安裝成功。
這裡寫圖片描述

程式碼:

# -*- coding:utf-8 -*-
import cv2
import urllib2
import urllib
import time

#讀取原圖,並顯示
img = cv2.imread("football_players.jpeg")
cv2.namedWindow("原圖")
cv2.imshow("原圖", img)

#URL
http_url='https://api-cn.faceplusplus.com/facepp/v3/detect'
#使用者資訊 key = "RU8VkInUd4zpcCo2GbKxPz90rPoaY5O0" secret = "01YadiHNX_Fpqw6saBYa2POD6ozL6gWu" #圖片儲存路徑 filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg" #這後面的都是給的示例程式碼,呼叫API介面 boundary = '----------%s' % hex(int(time.time() * 1000)) data = [] data.append('--%s' % boundary) data.append('Content-Disposition: form-data; name="%s"\r\n'
% 'api_key') data.append(key) data.append('--%s' % boundary) data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_secret') data.append(secret) data.append('--%s' % boundary) fr=open(filepath,'rb') data.append('Content-Disposition: form-data; name="%s"; filename=" "' % 'image_file') data.append('Content-Type: %s\r\n' % 'application/octet-stream') data.append(fr.read()) fr.close() data.append('--%s--\r\n' % boundary) http_body='\r\n'.join(data) #buld http request req=urllib2.Request(http_url) #header req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary) req.add_data(http_body) try: #req.add_header('Referer','http://remotserver.com/') #post data to server resp = urllib2.urlopen(req, timeout=5) #get response qrcont=resp.read() print qrcont #打印出得到的結果 except urllib2.HTTPError as e: print e.read() #進過測試前面的程式會返回一個字典,其中指出了人臉所在的矩形的位置和大小等,所以直接進行標註 mydict = eval(qrcont) faces = mydict["faces"] faceNum = len(faces) print("識別到了%d個人臉"%(faceNum)) for i in range(faceNum): face_rectangle = faces[i]['face_rectangle'] width = face_rectangle['width'] top = face_rectangle['top'] left = face_rectangle['left'] height = face_rectangle['height'] start = (left, top) end = (left+width, top+height) color = (55,255,155) thickness = 3 cv2.rectangle(img, start, end, color, thickness) cv2.namedWindow("識別後") cv2.imshow("識別後", img) cv2.waitKey(0) cv2.destroyAllWindows() # print type(resp)

程式不復雜,按照程式思路簡單解釋下:
1、指定圖片的名稱,讀取圖片,並顯示。

#讀取原圖,並顯示
img = cv2.imread("football_players.jpeg")
cv2.namedWindow("原圖")
cv2.imshow("原圖", img)

把圖片直接放在當前目錄下即可(圖片是巴薩的<( ̄︶ ̄)>)。
這裡寫圖片描述

2、填一些呼叫api相關的資訊,根據需要自己改就行。

#URL
http_url='https://api-cn.faceplusplus.com/facepp/v3/detect' 
#使用者資訊
key = "RU8VkInUd4zpcCo2GbKxPz90rPoaY5O0"    
secret = "01YadiHNX_Fpqw6saBYa2POD6ozL6gWu"
#圖片儲存路徑
filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg"

使用者資訊要填上自己在前面申請的API Key和API Secret。
這裡寫圖片描述

要傳送圖片到face++的伺服器去進行識別,填上圖片所在的目錄的路徑:

當前目錄路徑+圖片名。

#圖片儲存路徑
filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg"

這裡寫圖片描述

3、中間的程式其實就是把資訊封裝一下,建立網路連結,然後跟伺服器通訊。呼叫urlopen()訪問伺服器,返回resp,列印結果。

try:
    #req.add_header('Referer','http://remotserver.com/')
    #post data to server
    resp = urllib2.urlopen(req, timeout=5)
    #get response
    qrcont=resp.read()
    print qrcont        #打印出得到的結果

except urllib2.HTTPError as e:
    print e.read()

4、resp是返回的資料。呼叫read()方法,轉換成qrcont,這是個字串,然後在終端打印出來。
終端的全部列印資訊:
這裡寫圖片描述
很明顯,返回的resp是一個字典,其中記錄了一些圖片的資訊,還有識別出的人臉的位置。
qrcont是一組字串,呼叫eval()函式將其轉換回字典型別,取出來再處理一下,在圖片上標識出人臉的位置。

#進過測試前面的程式會返回一個字典,其中指出了人臉所在的矩形的位置和大小等,所以直接進行標註
mydict = eval(qrcont)
faces = mydict["faces"]
faceNum = len(faces)
print("識別到了%d個人臉"%(faceNum))

for i in range(faceNum):
    face_rectangle = faces[i]['face_rectangle']
    width =  face_rectangle['width']
    top =  face_rectangle['top']
    left =  face_rectangle['left']
    height =  face_rectangle['height']
    start = (left, top)
    end = (left+width, top+height)
    color = (55,255,155)
    thickness = 3
    cv2.rectangle(img, start, end, color, thickness)

執行結果:

這裡寫圖片描述