什麼是人臉識別?(What is face recognition?)
到目前為止,你學了很多卷積神經網絡的知識。我這周準備向你展示一些重要的卷積神經網絡的特殊應用,我們將從人臉識別開始,之後講神經風格遷移,你將有機會在實踐中實現這部分內容,創造自己的藝術作品。
讓我們先從人臉識別開始,我這裡有一個有意思的演示。我在領導百度AI團隊的時候,其中一個小組由林元慶帶領的,做過一個人臉識別系統,這個系統非常棒,讓我們來看一下。
(以下內容為演示視頻內容圖片,大概的意思就是刷卡不能進,只有真實人臉來驗證才能通過)
視頻開始:
我想演示一個人臉識別系統,我現在在百度的中國總部,很多公司要求進入公司的時候要刷工卡,但是在這裡我們並不需要它,使用人臉識別,看看我能做什麼。當我走近的時候,它會識別我的臉,然後說歡迎我(Andrew NG),不需要工卡,我就能通過了。
讓我們看看另一種情況,在旁邊的是林元慶,IDL(百度深度學習實驗室)的主管,他領導開發了這個人臉識別系統,我把我的工卡給他,上面有我的頭像,他會試著用我的頭像照片,而不是真人來通過。
(林元慶語:我將嘗試用Andrew的工卡騙過機器,看看發生什麼,系統不會識別,系統拒絕識別。現在我要用我自己的臉,(系統語音:“歡迎您”)(林元慶順利通過))
類似於這樣的人臉識別系統在中國發展很快,我希望這個技術也可以在其他的國家使用。
#視頻結束
挺厲害的吧,你剛看到的這個視頻展示了人臉識別和活體檢測,後一項技術確認你是一個活人。事實上,活體檢測可以使用監督學習來實現,去預測是不是一個真人,這個方面我就不多說了。我主要想講的是,如何構造這個系統中的人臉識別這一部分。
首先,讓我們瞭解一下人臉識別的一些術語。
在人臉識別的相關文獻中,人們經常提到人臉驗證(face verification)和人臉識別(face recognition)。這是兩個概念要清楚的吶,往下看~
這是人臉驗證問題,如果你有一張輸入圖片,以及某人的ID或者是名字,這個系統要做的是,驗證輸入圖片是否是這個人。有時候也被稱作1對1問題,只需要弄明白這個人是否和他聲稱的身份相符。
而人臉識別問題比人臉驗證問題難很多(1對多問題(1:K)),為什麼呢?
假設你有一個驗證系統,準確率是99%,還可以。但是現在,假設在識別系統中,K=100,如果你把這個驗證系統應用在100個人身上,人臉識別上,你犯錯的機會就是100倍了。如果每個人犯錯的概率是1%,如果你有一個上百人的數據庫,如果你想得到一個可接受的識別誤差,你要構造一個驗證系統,其準確率為99.9%或者更高,然後才可以在100人的數據庫上運行,而保證有很大幾率不出錯。事實上,如果我們有一個100人的數據庫,正確率可能需要遠大於99%,才能得到很好的效果。
在之後的幾個筆記中,我們主要講構造一個人臉驗證,作為基本模塊,如果準確率夠高,你就可以把它用在識別系統上。
下一個筆記中,我們將開始討論如何構造人臉驗證系統,人臉驗證之所以難,原因之一在於要解決“一次學”(one-shot learning problem)問題。
One-Shot學習(One-shot learning)
人臉識別所面臨的一個挑戰就是你需要解決一次學習問題,這意味著在大多數人臉識別應用中,你需要通過單單一張圖片或者單單一個人臉樣例就能去識別這個人。
而歷史上,當深度學習只有一個訓練樣例時,它的表現並不好,讓我們看一個直觀的例子,並討論如何去解決這個問題。
假設你的數據庫裡有4張你們公司的員工照片,(實際上他們確實是deeplearning.ai的員工,分別是Kian,Danielle,Younes和Tian)。現在假設有個人(編號1所示)來到辦公室,並且她想通過帶有人臉識別系統的柵門,現在系統需要做的就是,僅僅通過一張已有的Danielle照片,來識別前面這個人確實是她。相反,如果機器看到一個不在數據庫裡的人(編號2所示),機器應該能分辨出她不是數據庫中四個人之一。
所以在一次學習問題中,只能通過一個樣本進行學習,以能夠認出同一個人。大多數人臉識別系統都需要解決這個問題,因為在你的數據庫中每個僱員或者組員可能都只有一張照片。
有一種辦法是,將人的照片放進卷積神經網絡中,使用softmax單元來輸出4種,或者說5種標籤,分別對應這4個人,或者4個都不是 ,所以softmax裡我們會有5種輸出。但實際上這樣效果並不好,因為如此小的訓練集不足以去訓練一個穩健的神經網絡。
而且,假如有新人加入你的團隊,你現在將會有5個組員需要識別,所以輸出就變成了6種,這時你要重新訓練你的神經網絡嗎?這聽起來實在不像一個好辦法(的確是這樣吶,每次來了都要重新輸很費時間的)。
所以要讓人臉識別能夠做到一次學習,為了能有更好的效果,你現在要做的應該是學習Similarity函數。
詳細地說,你想要神經網絡學習這樣一個用d表示的函數,d(img1,img2)=degree of difference between images,它以兩張圖片作為輸入,然後輸出這兩張圖片的差異值。如果你放進同一個人的兩張照片,你希望它能輸出一個很小的值,如果放進兩個長相差別很大的人的照片,它就輸出一個很大的值。
所以在識別過程中,如果這兩張圖片的差異值小於某個閾值τ,它是一個超參數,那麼這時就能預測這兩張圖片是同一個人,如果差異值大於τ,就能預測這是不同的兩個人,這就是解決人臉驗證問題的一個可行辦法。
要將它應用於識別任務,你要做的是
拿這張新圖片(編號6),然後用d函數去比較這兩張圖片(編號1和編號6),這樣可能會輸出一個非常大的數字,在該例中,比如說這個數字是10。
之後你再讓它和數據庫中第二張圖(編號2)片比較,因為這兩張照片是同一個人,所以我們希望會輸出一個很小的數。
然後你再用它與數據庫中的其他圖片(編號3、4)進行比較,通過這樣的計算,最終你能夠知道,這個人確實是Danielle。
對應的,如果某個人(編號7)不在你的數據庫中,你通過函數d將他們的照片兩兩進行比較,最後我們希望d會對所有的比較都輸出一個很大的值,這就證明這個人並不是數據庫中4個人的其中一個。
要注意在這過程中你是如何解決一次學習問題的,只要你能學習這個函數d,通過輸入一對圖片,它將會告訴你這兩張圖片是否是同一個人。如果之後有新人加入了你的團隊(編號5),你只需將他的照片加入你的數據庫,系統依然能照常工作。
現在你已經知道函數d是如何工作的,通過輸入兩張照片,它將讓你能夠解決一次學習問題。那麼,下節筆記中,我們將會學習如何訓練你的神經網絡學會這個函數d。
其實一次的意思就是說我們訓練一次,以後都可以使用了~大概這樣理解吧~
閱讀更多 極客Array 的文章