Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[Cognitive Service之Face Api][05]人臉識別的AI服務 - 使用Python框出圖像裡面人臉的部分

[Cognitive Service之Face Api][05]人臉識別的AI服務 - 使用Python框出圖像裡面人臉的部分.jpg
圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 

在上一篇([04]人臉識別的AI服務 - 整合Face Api的Detect功能到C#程式裡面)看完了如何用C#呼叫Face Api取得圖像裡面人臉的資訊并且印在console上面之後,這篇連看看另外一個使用情景。

Python是一個最近很火紅(或者説一直以來都很火紅)的一個語言,可不可以用Python呼叫Face Api?

這篇來看看如何用Python把圖像裡面屬於人臉的部分框起來。

爲什麽選擇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也是很有幫助。

小弟我也是Python苦手,所以太深入的我也不會。這邊只是介紹一下Python開發的周邊,讓未來介紹到Data Science(希望有一天)的時候不會這麽陌生。

環境準備

要開發一個語言,首先需要準備好開發環境。這邊有兩個選擇:

  1. 在你本機電腦開發
  2. 使用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是免費

要使用很簡單,基本上:

  1. 登入/建立帳號
  2. 建立一個Library(就是類似Project的概念)
  3. 直接建立一個notebook,選擇使用 Python 3.6 Notebook
  4. 開始撰寫

用Python呼叫Face Api

環境準備好了之後,接下來就是實際來看看怎麽呼叫:

以下的指令是在Azure Notebook(Jupyter)可以直接使用的,如果是純Python script要調整一下。

  1. 安裝SDK
  2. 設定好呼叫服務的環境
  3. 呈現圖片Detect得到的結果
  4. 把圖片呈現出來
  5. 把圖片裡面人臉的部分框起來
  6. 顯示圖片人物識別出來的信息

安裝SDK

這邊需要:

  1. Face Api的sdk - 讓呼叫起來比較容易。
  2. pillow - 這個是python裡面要修改圖片非常方便的一個套件。

!pip install cognitive_face
!pip install pillow

設定好呼叫服務的環境

主要設定:

  1. 用到的api endpoint
  2. 使用到的api key
  3. 測試的圖片
  4. 其他要偵測的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)
chrome_2018-09-17_21-12-48.png
得到的結果

把圖片呈現出來

%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)
chrome_2018-09-17_21-12-28.png
框起來的畫面

顯示圖片人物識別出來的信息

!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)
chrome_2018-09-17_21-12-36.png
顯示包含識別出的年齡

結語

這篇非常快速的介紹了Azure Notebook這個好用的Jupyter Notebook的服務,透過這種方式不止能夠快速測試Python,并且最後可以做成一個類似文件的東西。

雖然説Python版本也是使用sdk的方式來和Face Api溝通,但是可以看得出來只需要搞懂api的功能,其實什麽語言都可以把他整合進去。

下一篇([06]人臉識別的AI服務 - 使用Verify確認兩張圖片的人臉是否為同一人)來看看Face Api的另外一個服務,Face Verification。來看看這個服務怎麽呼叫,并且能夠做到什么。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus