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
中的:
部分。
具體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[u'left'] top = mydata[u'top'] bottom = left + mydata[u'height'] right = top + mydata[u'width'] 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[u'faceRectangle'] c = getRectangle(b) draw.rectangle(c, outline='red') draw.text([c[0][0],c[0][1]-ps],"Age="+str(a[u'faceAttributes'][u'age']),font=font) newimg.show()
其輸出是一張如下d 照片:
總結:
通過Azure的Cognitive Service的Face API可以非常方便的進行人臉識別的工作。