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

從零開始玩人工智能-人臉 API-03

AI Cognitive Services Face API 人臉識別

前文我們嘗試寫了一個完整的人臉驗證過程,從創建一個組,一個人,到為人提供照片,並訓練AI,直至最後提供一張照片讓 AI 利用 Face API 判斷是不是這個特定的人。

另一個經常會用到的人臉識別,是在一張照片中查找認識的人。Facebook什麽的挺早就能夠識別照片中的人並可以讓你給他們打上標簽。其實,利用Face API做類似的事情也一點不復雜。不信我們用代碼來看看。

為了說明在一張合影中 AI 能夠找到並識別特定人,我用了去年峰會中國MVP及MVP Lead梁迪和微軟CEO薩蒂亞·納德拉(Satya Nadella)、微軟全球資深副總裁沈向洋、微軟全球資深副總裁潘正磊的合影來做代碼範例,也算是扯虎皮做大旗吧哈哈哈。

技術分享圖片

首先,使用前文示例代碼中用到的Detect方法來識別照片中的人臉。

技術分享圖片

說實話,我有點擔心。這張照片裏的人好多啊,AI 能夠都識別出來麽?

技術分享圖片

呼啦啦返回了46個faceId,我趴在照片上一頓數,還真的是一個不落都識別出來了,厲害厲害!

在這裏我遇到了一個問題。如前文介紹的,Detect方法識別出來的人臉會以JSON形式返回,而兩層及兩層以上的數據結構在轉成Python的數據時,不再是dict,而是list。多層的數據意味著多層的list對象。上一次因為數據簡單,直接使用了List的下標來定位數據。這一次就要老老實實遍歷進行處理了。因此,for語句和list.append()就學會使用了。

由這個問題引發的另外一個問題是,生成的List需要提供給下一步Face的Identify方法作為輸入。按照API文檔的說明,輸入應該形如:

技術分享圖片

在“faceIds”這裏,應該輸入所有經由Detect識別出的人臉的ID。所以我把上一步獲得的List轉換成了JSON格式然後拼裝這個請求的body。結果……報錯了……冷靜地print出來list和body,跟文檔進行比較,原來多了對’’’號……

技術分享圖片

原來拼裝這個JSON的時候,使用List對象facesId就可以了。使用json的dumps()把List轉成json,我多此一舉了。那為什麽又報Error:0呢?仔細看文檔,用於Identify方法的人臉數量,應該1到10之間。我們輸入給AI的Face ID大大超過了這個數量,所以……報錯了……那該怎麽辦呢?我可以分批處理,也可以裁剪照片。因為後續還要試試找不到人怎麽辦,所以我對照片進行了不同的裁剪。

返回的json格式形如:

技術分享圖片

如果沒有對應到人,faceId對應的“condidates”就會顯示為[],即空。而對應到人的faceId對應會有識別出的人的personId和相識度評分confidence。看來要把這個結果濾出來做點操作還是有點小復雜啊,一樣,使用for語句逐個下標處理List。

技術分享圖片

使用兩層List的下標讀取,就能夠成功拆分從Face API返回的json數據了。我記得人臉識別的Verify方法裏,判斷是否本人的參考值為0.5,因此在這裏如果系統返回相識度評分大於0.5,我就繼續從Face ID再去識別具體的人是誰。

技術分享圖片

果然,Face API從合影照片中認出了我~那麽如果我不在照片裏呢?

技術分享圖片

Face API確實沒有發現通過training認識的人~

細心的你發現了吧,兩次照片檢測的Face ID怎麽全部不一樣?還記得前文我們說過的嗎?Detect生成的Face ID是臨時的,會在24小時之後清除,所以每次獲得的ID都不同,即使是同一張臉。而關聯到人的臉,其Face ID就是持久的,可以在需要的時候使用。

這麽牛的合影,難道只識別我自己嗎?當然不,我們要試試 AI 能不能識別多個人~

立刻上網為這三位大神各自找了三張照片。找的過程中發現,潘女士原來早在2010年就參加過MVP的Open Day,難怪上次MVP Round Table的時候覺得那麽熟悉,看我這糟糕的記性…

技術分享圖片

趕緊在上次創建的person group裏再創建了三個person,每人傳輸了上圖的三張照片。

技術分享圖片

再次運行代碼,這一次,AI 在合影中就識別出了四個人了,厲害厲害~

技術分享圖片

利用Azure Cognitive Services中的Face API,哪怕沒有任何深入的 AI 知識,哪怕沒有熟練的編程技巧,只需要簡單的幾十行代碼,就能夠實現有趣的人臉識別。


從零開始玩人工智能-人臉 API-03