1. 程式人生 > >用Azure上Cognitive Service的Face API識別人臉

用Azure上Cognitive Service的Face API識別人臉

path python程序 src width not pre ons nco ins

Azure在China已經發布了Cognitive Service,包括人臉識別、計算機視覺識別和情緒識別等服務。

本文將介紹如何用Face API識別本地或URL的人臉。

一 創建Cognitive Service

1 在Azure上創建Cognitive Service的Face服務:

技術分享圖片

2 獲取服務的鏈接和key:

創建成功後,在overview的頁面上可以看到服務鏈接,已經Key:

技術分享圖片

有了這些信息後,就可以開始進入coding的階段了。

二 Python code

1 通過URL鏈接實現人臉識別

關於Azure 人臉識別的API內容可以參考:

https://docs.microsoft.com/en-us/azure/cognitive-services/Face/APIReference

中的:

https://eastasia.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236/console

部分。

具體python的實現如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#導入相關模塊
import httplib, urllib, json

#Face API相關的Key和Endpoint
subscription_key = 30a236e53b924f2c943892711d8d0e45
uri_base 
= api.cognitive.azure.cn #定義html的header,這裏Content-type決定了body中的類型,是URL還是文件類型的,這裏的Json支持URL模式 headers = { Content-Type: application/json, Ocp-Apim-Subscription-Key: subscription_key, } #定義返回的內容,包括FaceId,年齡、性別等等 params = urllib.urlencode({ returnFaceId: true, returnFaceLandmarks
: false, returnFaceAttributes: age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise, }) #圖片的URL body = "{‘url‘:‘http://www.bidmc.org/~/media/Images/Research_NotDepartmentResearch/ResearchCenters/Cancer%20Research%20Institute/Wenyi%20Wei%20250.jpg‘}" #Call Face API,進行人臉識別 try: conn = httplib.HTTPSConnection(api.cognitive.azure.cn) conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers) response = conn.getresponse() data = response.read() parsed = json.loads(data) print ("Response:") print (json.dumps(parsed, sort_keys=True, indent=2)) conn.close() except Exception as e: print("[Errno {0}] {1}".format(e.errno, e.strerror))

輸出結果如下:

[
    {
    "faceAttributes": {
        "age": 45.5,
        ...
        "gender": "male",
        "faceId": "b15284c9-ce1c-40eb-a76b-99d5ce381081",
        "faceRectangle": {
            "height": 56,
            "left": 155,
            "top": 50,
            "width": 56
            }
        }
    }
]

可以看到是一個Json的輸出,裏面包含有FaceId,年齡,性別等各種信息。

2 用本地文件作為源文件進行圖片識別

具體的代碼如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#導入相關模塊
import httplib, urllib, json
from os.path import expanduser

#Face API相關的Key和Endpoint
subscription_key = 30a236e53b924f2c943892711d8d0e45
uri_base = api.cognitive.azure.cn

#定義html的header,這裏Content-type決定了body中的類型,是URL還是文件類型的,這裏的Json支持URL模式
headers = {
    Content-Type: application/octet-stream,
    Ocp-Apim-Subscription-Key: subscription_key,
}
#定義返回的內容,包括FaceId,年齡、性別等等
params = urllib.urlencode({
    returnFaceId: true,
    returnFaceLandmarks: false,
    returnFaceAttributes: age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise,
})
#打開本地圖片
img = open(expanduser(D:\\Heng\\Pictures\\100EOS5D\\C5D_5131.JPG), rb)
#Call Face API,進行人臉識別
try:
    conn = httplib.HTTPSConnection(api.cognitive.azure.cn)
    conn.request("POST", "/face/v1.0/detect?%s" % params, img, headers)
    response = conn.getresponse()
    data = response.read()
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

輸出和前面的類似。

3 給圖片中的人臉打框,並表示年齡

根據前面的人臉識別,可以根據返回值,對人臉進行打框,並標識其返回的年齡,具體Python程序如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#導入相關模塊
import httplib, urllib, json
from os.path import expanduser
from PIL import Image, ImageDraw, ImageFont

def getRectangle(mydata):
    left = mydata[uleft]
    top = mydata[utop]
    bottom = left + mydata[uheight]
    right = top + mydata[uwidth]
    return ((left, top), (bottom, right))

#Face API相關的Key和Endpoint
subscription_key = 30a236e53b924f2c943892711d8d0e45
uri_base = api.cognitive.azure.cn

#定義html的header,這裏Content-type決定了body中的類型,是URL還是文件類型的,這裏的Json支持URL模式
headers = {
    Content-Type: application/octet-stream,
    Ocp-Apim-Subscription-Key: subscription_key,
}
#定義返回的內容,包括FaceId,年齡、性別等等
params = urllib.urlencode({
    returnFaceId: true,
    returnFaceLandmarks: false,
    returnFaceAttributes: age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise,
})
#打開本地圖片
#imgfile = ‘D:\\Heng\\Pictures\\C5D_3966.JPG‘
imgfile = D:\\Heng\\desktop\\face.JPG

img = open(expanduser(imgfile), rb)
#Call Face API,進行人臉識別
try:
    conn = httplib.HTTPSConnection(api.cognitive.azure.cn)
    conn.request("POST", "/face/v1.0/detect?%s" % params, img, headers)
    response = conn.getresponse()
    data = response.read()
    parsed = json.loads(data)
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
#新建一個文件
newimg = Image.open(imgfile)
draw = ImageDraw.Draw(newimg)
#判斷其大小
size = len(str(newimg.size[0]))
#根據大小分配字體大小和字的位置
if size>= 4:
    fs = 50
    ps = 130
else:
    fs = 10
    ps = 13
#圖片的字體和顏色
font = ImageFont.truetype("consola.ttf", fs)
draw.ink = 255 + 0 * 256 + 0 * 256 * 256
#給每個識別出的人臉畫框、並標識年齡
for a in parsed:
    b = a[ufaceRectangle]
    c = getRectangle(b)
    draw.rectangle(c, outline=red)
    draw.text([c[0][0],c[0][1]-ps],"Age="+str(a[ufaceAttributes][uage]),font=font)
newimg.show()
 

其輸出是一張如下d 照片:

技術分享圖片

總結:

通過Azure的Cognitive Service的Face API可以非常方便的進行人臉識別的工作。

用Azure上Cognitive Service的Face API識別人臉