1. 程式人生 > >從零開始玩人工智能—人臉 API—02

從零開始玩人工智能—人臉 API—02

per ans encoder 頭部 個人 api 照片 python nor

前文介紹了人臉API,但沒有一個完整的功能實現,各個功能的API始終如散開的珍珠一樣,不能串成珠鏈。到底這套API是如何工作的呢?Person、Person Group、FaceList、Face這些不同的對象是怎麽發生聯系的呢?

於是,我決定寫一個相對完整的簡單程序,完成一個對人臉進行識別的功能。

仔細看了看文檔,琢磨了一下。為了實現人臉識別,需要實現以下幾個步驟:

1、創建一個Person Group。人需要通過組來進行管理組織。每個組最多有1000個人,免費的每個訂閱最多1000人,S0訂閱的每個組10000人,每個訂閱上限1M組、100M人。

2、創建一個Person。人是Face的擁有著。每個人最多有248張臉的圖片。和人關聯的臉是持久化的persistedFace,而使用detect等api讀取的是非持久的Face。

3、為Person提供幾張不同的Face。除了Face,還有FaceList對象,但更多用於分辨類似的臉。我估計要進行人臉識別,用Face對象就可以。

4、對提供的幾張Face進行訓練。人工智能需要對輸入進行訓練,利用認知服務進行分析並得到結果。理論上提供訓練的數據越多,結果越準確。

5、提供一張用於比對的Face。上傳一張圖片,讓人工智能判斷是不是同一個人。

開始之前我要首先熟悉一下示例代碼。前文提供的示例代碼和Face API的示例代碼使用了不同的模塊。示例代碼引入了requests這個庫,使用它可以更靈活的完成有關HTTP的各類方法特別是傳遞數據。所以:

pip install requests

因為有兩種不同的數據headers提交方式json和octet-steam,所以分開寫了兩個不同的headers頭部定義。為了便於使用,把訂閱的Key和訪問的基礎鏈接分別使用變量進行提供。

技術分享圖片

正式開幹~首先是創建Person Group。和別的對象不同,PersonGroup的名字和ID都是字符串,只接受小寫英文字符和‘-’、‘_’,不多於64個字符。

技術分享圖片

其他對象的ID都是類似GUID的形式。通常在創建對象的時候由服務返回。由於Person Group是首先創建的,所以其ID由用戶指定也很合乎情理。創建Person Group之後,就可以在組裏面創建人了。

技術分享圖片

每一部我都是用了print來輸出獲得的json數據。由於添加Face需要提供Person ID,所以在這裏我從json裏面取出了personId的數據。

Python裏面處理json可以用dump、dumps、load、loads不同的方法。loads能夠把獲得的json數據轉成dict或者list,這在我踩過list的坑之後才想明白。一旦json中的數據分層了,轉化出來的就是list了,這時就需要逐層處理數據。可以參考Python的手冊: 18.2. json— JSON encoder and decoder:https://docs.python.org/2/library/json.html

技術分享圖片

有了personId,就可以為特定的人添加Face了。官方示例代碼給的是通過json傳遞一個圖片的url。有很多人在下面問,怎麽使用本地的照片呢?其實利用文件,然後使用octet-steam發送給Azure就可以了。經過一番對requests.request()參數的猜測和對文件的嘗試,果然就能夠把圖片傳上去了。persistedFaceId其實後面沒有直接使用,為了學習我還是把它提取出來了。

為了訓練機器,繼續傳了幾張我的帥照……

技術分享圖片

當一個人有了幾分臉面之後……哈哈,我們應該訓練人工智能了。直接POST特定URL即可。

到了關鍵的時候了,我們要檢驗認知服務的效果了。先使用Detect方法輸入一張照片。

技術分享圖片

這裏其實不需要所有參數,只需要返回faceId就可以。所以把params裏面的數據刪了也無所謂。不過我想看看完整的輸出是怎樣的,就全寫出來了。

於是就遇到了前面說的坑,使用dict的方法,沒法獲得list裏面的數據。要是一層一層分析…好麻煩啊,轉念一想,輸出的格式是固定的,因此偷了個懶,直接用list的下標獲取faceId的dict,然後再get出faceId。

最後,就是調用Verify方法,確認提供的照片是不是我們之前使用幾張照片訓練過的人的了。這句話好長去……

技術分享圖片

為了容易體現結果,我還特意用了中文……

技術分享圖片

按照文檔說的,高於0.5的評分就可以視作通過,所以屬性isIdentical的值為True,直接拿來做條件。

照片是我本人嗎?當然,是。

利用Azure的Face API,完成一個人臉識別,很簡單吧。


從零開始玩人工智能—人臉 API—02