YOLO 人臉識別演算法以及應用 (1)
最前沿的網路技術,為你的網站帶來國際化的使用者體驗和易用性,這一切只有Witmart.com能做到。
第四周 特殊應用:人臉識別和神經風格轉換(Special applications: Face recognition &Neural style transfer)
4.1 什麼是人臉識別?(What is face recognition?)
4.2 One-Shot學習(One-shot learning)
4.3 Siamese 網路(Siamese network)
4.4 Triplet 損失(Triplet 損失)
4.5 面部驗證與二分類(Face verication and binary classication)
4.6 什麼是神經風格轉換?(What is neural style transfer?)
4.7 什麼是深度卷積網路?(What are deep ConvNets learning?)
4.8 代價函式(Cost function)
4.9 內容代價函式(Content cost function)
4.10 風格代價函式(Style cost function)
4.11 一維到三維推廣(1D and 3D generalizations of models)
4.1 什麼是人臉識別?(What is face recognition?)
歡迎來到第四周,即這門課卷積神經網路課程的最後一週。到目前為止,你學了很多卷積神經網路的知識。我這周準備向你展示一些重要的卷積神經網路的特殊應用,我們將從人臉識別開始,之後講神經風格遷移,你將有機會在程式設計作業中實現這部分內容,創造自己的藝術作品。
讓我們先從人臉識別開始,我這裡有一個有意思的演示。我在領導百度AI團隊的時候,其中一個小組由林元慶帶領的,做過一個人臉識別系統,這個系統非常棒,讓我們來看一下。
(以下內容為演示視訊內容)
視訊開始:
我想演示一個人臉識別系統,我現在在百度的中國總部,很多公司要求進入公司的時候要刷工卡,但是在這裡我們並不需要它,使用人臉識別,看看我能做什麼。當我走近的時候,它會識別我的臉,然後說歡迎我(**Andrew
NG**),不需要工卡,我就能通過了。
讓我們看看另一種情況,在旁邊的是林元慶,IDL(百度深度學習實驗室)的主管,他領導開發了這個人臉識別系統,我把我的工卡給他,上面有我的頭像,他會試著用我的頭像照片,而不是真人來通過。
(林元慶語:我將嘗試用Andrew的工卡騙過機器,看看發生什麼,系統不會識別,系統拒絕識別。現在我要用我自己的臉,(系統語音:“歡迎您”)(林元慶順利通過))
類似於這樣的人臉識別系統在中國發展很快,我希望這個技術也可以在其他的國家使用。
#視訊結束
挺厲害的吧,你剛看到的這個視訊展示了人臉識別和活體檢測,後一項技術確認你是一個活人。事實上,活體檢測可以使用監督學習來實現,去預測是不是一個真人,這個方面我就不多說了。我主要想講的是,如何構造這個系統中的人臉識別這一部分。
首先,讓我們瞭解一下人臉識別的一些術語。
在人臉識別的相關文獻中,人們經常提到人臉驗證(**face
verification**)和人臉識別(face recognition)。
這是人臉驗證問題,如果你有一張輸入圖片,以及某人的ID或者是名字,這個系統要做的是,驗證輸入圖片是否是這個人。有時候也被稱作1對1問題,只需要弄明白這個人是否和他聲稱的身份相符。
而人臉識別問題比人臉驗證問題難很多(整理者注:1對多問題[]
)),為什麼呢?假設你有一個驗證系統,準確率是99%,還可以。但是現在,假設在識別系統中,[]
,如果你把這個驗證系統應用在100個人身上,人臉識別上,你犯錯的機會就是100倍了。如果每個人犯錯的概率是1%,如果你有一個上百人的資料庫,如果你想得到一個可接受的識別誤差,你要構造一個驗證系統,其準確率為99.9%或者更高,然後才可以在100人的資料庫上執行,而保證有很大機率不出錯。事實上,如果我們有一個100人的資料庫,正確率可能需要遠大於99%,才能得到很好的效果。
在之後的幾個視訊中,我們主要講構造一個人臉驗證,作為基本模組,如果準確率夠高,你就可以把它用在識別系統上。
下一個視訊中,我們將開始討論如何構造人臉驗證系統,人臉驗證之所以難,原因之一在於要解決“一次學”(**one-shot
learning problem**)問題。讓我們看下一個視訊,什麼是一次學習問題。
4.2 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函式。詳細地說,你想要神經網路學習這樣一個用[]{.MathJax_Preview}
表示地函式,[]
,它以兩張圖片作為輸入,然後輸出這兩張圖片的差異值。如果你放進同一個人的兩張照片,你希望它能輸出一個很小的值,如果放進兩個長相差別很大的人的照片,它就輸出一個很大的值。所以在識別過程中,如果這兩張圖片的差異值小於某個閾值[]
,它是一個超引數,那麼這時就能預測這兩張圖片是同一個人,如果差異值大於τ,就能預測這是不同的兩個人,這就是解決人臉驗證問題的一個可行辦法。
要將它應用於識別任務,你要做的是拿這張新圖片(編號6),然後用[]
函式去比較這兩張圖片(編號1和編號6),這樣可能會輸出一個非常大的數字,在該例中,比如說這個數字是10。之後你再讓它和資料庫中第二張圖(編號2)片比較,因為這兩張照片是同一個人,所以我們希望會輸出一個很小的數。然後你再用它與資料庫中的其他圖片(編號3、4)進行比較,通過這樣的計算,最終你能夠知道,這個人確實是Danielle。
對應的,如果某個人(編號7)不在你的資料庫中,你通過函式[]
將他們的照片兩兩進行比較,最後我們希望[]
會對所有的比較都輸出一個很大的值,這就證明這個人並不是資料庫中4個人的其中一個。
要注意在這過程中你是如何解決一次學習問題的,只要你能學習這個函式[]
,通過輸入一對圖片,它將會告訴你這兩張圖片是否是同一個人。如果之後有新人加入了你的團隊(編號5),你只需將他的照片加入你的資料庫,系統依然能照常工作。
現在你已經知道函式是如何工作的,通過輸入兩張照片,它將讓你能夠解決一次學習問題。那麼,下節視訊中,我們將會學習如何訓練你的神經網路學會這個函式[]
。
4.3 Siamese 網路(Siamese network)
上個視訊中你學到的函式d的作用就是輸入兩張人臉,然後告訴你它們的相似度。實現這個功能的一個方式就是用Siamese網路,我們看一下。
你經常看到這樣的卷積網路,輸入圖片[]
,然後通過一些列卷積,池化和全連線層,最終得到這樣的特徵向量(編號1)。有時這個會被送進softmax單元來做分類,但在這個視訊裡我們不會這麼做。我們關注的重點是這個向量(編號1),加如它有128個數,它是由網路深層的全連線層計算出來的,我要給這128個數命個名字,把它叫做[]
。你可以把[]
看作是輸入影象[]
的編碼,取這個輸入影象(編號2),在這裡是Kian的圖片,然後表示成128維的向量。
建立一個人臉識別系統的方法就是,如果你要比較兩個圖片的話,例如這裡的第一張(編號1)和第二張圖片(編號2),你要做的就是把第二張圖片餵給有同樣引數的同樣的神經網路,然後得到一個不同的128維的向量(編號3),這個向量代表或者編碼第二個圖片,我要把第二張圖片的編碼叫做[]
。這裡我用[]
和[]
僅僅代表兩個輸入圖片,他們沒必要非是第一個和第二個訓練樣本,可以是任意兩個圖片。
最後如果你相信這些編碼很好地代表了這兩個圖片,你要做的就是定義d,將[]
和[]
的距離定義為這兩幅圖片的編碼之差的範數,[]
。
對x^{(1)}於兩個不同的輸入,執行相同的卷積神經網路,然後比較它們,這一般叫做Siamese網路架構。這裡提到的很多觀點,都來自於**Yaniv
Taigman**,Ming Yang,Marc’ Aurelio Ranzato,**Lior
Wolf**的這篇論文,他們開發的系統叫做DeepFace。
怎麼訓練這個Siamese神經網路呢?不要忘了這兩個網路有相同的引數,所以你實際要做的就是訓練一個網路,它計算得到的編碼可以用於函式d,它可以告訴你兩張圖片是否是同一個人。更準確地說,神經網路的引數定義了一個編碼函式[],如果給定輸入影象[],這個網路會輸出[]的128維的編碼。你要做的就是學習引數,使得如果兩個圖片[]和[]是同一個人,那麼你得到的兩個編碼的距離就小。前面幾個幻燈片我都用的是[