在上一篇([04]人臉識別的AI服務 - 整合Face Api的Detect功能到C#程式裡面)看完了如何用C#呼叫Face Api取得圖像裡面人臉的資訊并且印在console上面之後,這篇連看看另外一個使用情景。
Python是一個最近很火紅(或者説一直以來都很火紅)的一個語言,可不可以用Python呼叫Face Api?
這篇來看看如何用Python把圖像裡面屬於人臉的部分框起來。
這篇的程式碼github頁面是alantsai-samples/mhat-cognitive-service-face-api:blog/chapter-05
也可以透過檢查Azure Notebook來看到原始碼:https://notebooks.azure.com/alantsai/libraries/blog-sample-cs-face-api/html/chapter05-face-api-detect.ipynb
爲什麽選擇Python?
Face Api其實只是REST Api的服務,因此不限制只有微軟相關的產品可以使用,而是所有可以發出http request的語言都可以使用。因此,換個語言呼叫看看感覺應該也是不錯的體驗。
Face Api屬於一個比較開發者Friendly的服務,因爲他提供了6個語言的SDK。雖然説沒有SDK也可以用,不過有人幫忙把呼叫API的部分包好還是可以省掉不少的功。
這次使用的Python也有在提供SDK的語言之内,因此呼叫Face Api變得非常簡單。
使用Python的另外一個原因是因爲太火了,如果對於Data Science(AI)有興趣,那麽多多少少會碰到Python或者R。R比較偏統計類型的語言,因此局限性比較明確,而Python則什麽都可以用,因此熟悉Python也是很有幫助。
環境準備
要開發一個語言,首先需要準備好開發環境。這邊有兩個選擇:
- 在你本機電腦開發
- 使用Jupyter Notebook類型的服務例如Azure Notebook
在往下之前,先説明一下,Python有兩個版本:2.x以及3.x。原則上來説盡量使用3.x除非使用的套件沒有支援。
然後在寫這篇的時候最新版本是3.7,但是有些套件不支援,例如tensorflow,因此建議裝3.6就好。
在你本機電腦開發
基本上只需要安裝Python就可以開始開發了。最快的安裝方式就是透過chocolatey:
choco install python --version 3.6.6
然後基本上接下來就是需要一個編輯器協助撰寫python程式碼。可以使用任何編輯器,從最陽春的notepad,到Visual Studio Code都可以,看個人習慣。
使用Jupyter Notebook類型的服務例如Azure Notebook
個人建議Python苦手可以先用這種類型的服務,例如Azure Notebook(鏈接)。
原因是只需要有一個瀏覽器,就可以開始開發Python - 因此可以focus在程式部分就好,最棒的是Azure Notebook是免費。
要使用很簡單,基本上:
- 登入/建立帳號
- 建立一個Library(就是類似Project的概念)
- 直接建立一個notebook,選擇使用
Python 3.6 Notebook
- 開始撰寫
用Python呼叫Face Api
環境準備好了之後,接下來就是實際來看看怎麽呼叫:
- 安裝SDK
- 設定好呼叫服務的環境
- 呈現圖片Detect得到的結果
- 把圖片呈現出來
- 把圖片裡面人臉的部分框起來
- 顯示圖片人物識別出來的信息
安裝SDK
這邊需要:
- Face Api的sdk - 讓呼叫起來比較容易。
- pillow - 這個是python裡面要修改圖片非常方便的一個套件。
!pip install cognitive_face
!pip install pillow
設定好呼叫服務的環境
主要設定:
- 用到的api endpoint
- 使用到的api key
- 測試的圖片
- 其他要偵測的attribute
faceURI = "https://eastasia.api.cognitive.microsoft.com/face/v1.0/"
faceKey = ""
img_url = 'https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg'
attributes = ('age,gender')
import cognitive_face as CF
# Set URI and Key
CF.BaseUrl.set(faceURI)
CF.Key.set(faceKey)
呈現圖片Detect得到的結果
接下來是呼叫Detect并且把Detect的值顯示出來:
result = CF.face.detect(img_url, False, False, attributes)
print (result)
把圖片呈現出來
%matplotlib inline
import requests
from io import BytesIO
from matplotlib.pyplot import imshow
from PIL import Image, ImageDraw, ImageFont
# Get the image
response = requests.get(img_url)
img = Image.open(BytesIO(response.content))
imshow(img)
把圖片裡面人臉的部分框起來
lineWidth = 8
color="red"
if result is not None:
draw = ImageDraw.Draw(img)
for currFace in result:
faceRectangle = currFace['faceRectangle']
left = faceRectangle['left']
top = faceRectangle['top']
width = faceRectangle['width']
height = faceRectangle['height']
draw.line([(left,top),(left+width,top)],fill=color, width=lineWidth)
draw.line([(left+width,top),(left+width,top+height)],fill=color , width=lineWidth)
draw.line([(left+width,top+height),(left, top+height)],fill=color , width=lineWidth)
draw.line([(left,top+height),(left, top)],fill=color , width=lineWidth)
# show the image
imshow(img)
顯示圖片人物識別出來的信息
!curl https://raw.githubusercontent.com/openscenegraph/OpenSceneGraph-Data/master/fonts/arial.ttf -o arial.ttf
font = ImageFont.truetype("arial.ttf", 45)
if result is not None:
draw = ImageDraw.Draw(img)
for currFace in result:
faceRectangle = currFace['faceRectangle']
left = faceRectangle['left']
top = faceRectangle['top']
width = faceRectangle['width']
height = faceRectangle['height']
draw.text([left, height + 150], 'Age:' + str(currFace['faceAttributes']['age']), font=font, fill=(0,0,255))
# show the image
imshow(img)
結語
這篇非常快速的介紹了Azure Notebook這個好用的Jupyter Notebook的服務,透過這種方式不止能夠快速測試Python,并且最後可以做成一個類似文件的東西。
雖然説Python版本也是使用sdk的方式來和Face Api溝通,但是可以看得出來只需要搞懂api的功能,其實什麽語言都可以把他整合進去。
下一篇([06]人臉識別的AI服務 - 使用Verify確認兩張圖片的人臉是否為同一人)來看看Face Api的另外一個服務,Face Verification。來看看這個服務怎麽呼叫,并且能夠做到什么。