Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、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
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus