如何理解並實現一個簡單的人臉識別演算法(下):人臉識別

weixin_34292287發表於2017-08-20

題外話

開篇先說一點題外話,我主要想通過這一期的教程表達一個觀點,那就是科研非常重要,而且入門其實沒有那麼難。

我在知乎上看到一篇文章,有一個清華大學物理系的助理研究員帶著福州一中的應屆畢業生董焌鍇合作完成了一篇論文已被《Science Bulletin》接收。在該研究員撰寫的專欄文章[1]裡,我得知“在此後不久,董焌鍇拿到了美國康奈爾大學物理系的本科錄取通知書,完全沒有了高考升學的壓力。”看到這,我雖然還沒有孩子,但更加堅定了我以後鼓勵孩子儘早做科研的決心。

2210978-c38ee2b13e1d44eb.jpg

鼓勵孩子主要有兩個原因,一是我不會逼自己的孩子。我在本科求學數學系期間,就聽說很多數學系教授把自己的孩子逼得非常討厭數學,基本與理工類的科技行業say goodbye了。如果那些教授們在教育理念和方法上有所改變,那些孩子說不定還真能在數學裡得到很多快樂。二是我覺得行行出人才。只要孩子努力做更好的自己就好了。大家也都知道歌手朴樹的父母都是北京大學的教授,其父濮祖蔭還是著名的地球物理專家,但是朴樹卻從小立志做文藝青年。我個人倒是覺得朴樹帶給我的感動和影響是超越他父親。所以呢,我也不是覺得科研是大家必須做的事情。

如果孩子喜歡科研,那麼鼓勵孩子做出成績,並且受到認可,從而進入更好的平臺提升自己,那簡直就是不要太完美啊!

題外話到此為止,下面進入正題。

人臉識別究竟是什麼

人臉識別是一個非常實用的技術。很多公司的考勤就是用的人臉識別技術。人臉識別也是一個非常古老的計算機視覺問題,研究歷史至少有將近30年。早期有一篇非常出名的文章介紹特徵臉[2],是人臉識別領域的一個里程碑技術,原理非常簡單,就是人臉在高維空間裡的低維子空間裡,所以可以通過降維來得到更好的識別效果。下圖大致表達了特徵臉的基本思想[3].

2210978-e79f6f1ad7fcf81c.gif

在維基百科的詞條介紹裡[4], 狹義的人臉識別特指通過人臉進行身份確認或者身份查詢的技術或系統。人臉識別還可以是確認(verification)和鑑別(identification)。確認的過程是這樣的,你先輸入你的身份ID,然後系統把你的人臉和你輸入身份ID的人臉作對比,如果極度相似,那麼就可以確認你是你輸入的身份ID這個人。而鑑別則是把你的人臉直接和系統裡已有的人臉一一匹配,如果你的人臉和系統裡的某張人臉極度相似,那麼就鑑別出你的身份。確認和鑑別都是生物特徵識別和安防裡常用的方法。

2210978-54dd6993e3902e7a.jpg

按照機器學習領域的方法,識別主要可以分為兩大類:分類和聚類。在之前的文章[5]裡,我介紹過分類是一種監督學習,分類過程中需要有類別的標籤;而聚類是一種無監督學習,聚類過程中可以不需要類別標籤。在本文中,人臉識別特指人臉的分類問題,也就是上文中的鑑別。

人臉識別演算法的必要組成

A 人臉模板(Template)

在人臉識別系統裡,我們首先需要人臉識別的系統裡已經有一些人臉的照片,這些照片作為模板被放在人臉識別的系統裡。模板的重要性不言而喻,如果沒有這些模板,我們都不知道要識別誰,還怎麼談人臉識別?!收集和預處理人臉模板是一項龐大的工程,不過簡單的自動化處理就可以得到還算滿意的結果。

在數學模型上,人臉模板經常被稱為訓練集。訓練集是訓練人臉識別演算法的引數的資料集。在訓練集中,有很多人的人臉照片。假設某一個訓練集裡有K個人,每張照片的都被轉換成一個豎直方向上的向量,那麼第k個人的多張人臉照片就可以組成一個矩陣Xk,全部人臉模板就可以用一個矩陣表示(要是這裡支援寫latex就好了):

X = [X1,...,Xk,...,XK]。

B 演算法模型

有了模板之後,我們就可以根據輸入的測試樣本來進行人臉識別了。這裡假設y是待識別的測試樣本,和X的每一列樣本一樣,是一張人臉照片轉換成的豎直方向上的向量。

上一次教程裡,我介紹了最小二乘迴歸模型。這個簡單的模型被我導師在2011年的ICCV大會論文[6]裡指出可以有效地應用在人臉識別裡。基本模型非常簡單:

2210978-df745a85a8810fb1.png

上圖是一個優化模型,X = [X1,...,Xk,...,XK]是所有類別的人臉的所有照片組成的矩陣,也叫訓練矩陣;y是輸入的測試樣本,是一個和X每一列一樣大小的向量;p是輸入的測試樣本在訓練樣本下的表達係數,也是一個向量,維數等於訓練集中樣本的個數。在這個模型裡主要求上述有換模型的解,也非常簡單:

2210978-1d36ab4cd47d8400.png

向量p畫出來的大概樣子是這樣的(大家可以忽略):

2210978-3692273c29d334a4.png

物理涵義就是輸入樣本可以被訓練集裡的樣本線性表達。

在得到p之後,我們下一步該怎麼用p進行人臉識別呢?

請注意p是在訓練集中所有的人臉照片上的表達係數向量,那麼p在每個人的人臉照片Xi裡的表達可以用pi來表達。那麼y在不同類裡可以得到不同的重構。即y在第i個人的人臉照片裡的重構人臉是yi=Xi*pi。如果y是第i個人的人臉照片,那麼y應該約等於yi,即y被第i個人的人臉照片Xi重構出來的誤差就會最小。這就是人臉識別的最關鍵原理。

接下來人臉識別的步驟就很簡單而直觀了,即分別計算每一個人的人臉照片重構y的誤差,然後規定y就是誤差最小的那一類人臉照片所屬於的那個人:

2210978-20acab53d35072e7.png

人臉識別例子

我先給出一幅圖,讓大家有一個直觀的印象。

2210978-8959c735964ac97f.jpg

在上圖中,左邊是輸入的測試樣本y,中間的每一張都是一個人的人臉照片Xi,那麼y在全部訓練集X=[X1,...,XK]上可以根據上面的最小二乘迴歸模型得到一個表達係數向量p。然後我們可以計算y在每一張人連照片Xi上的重構誤差,誤差越大,相似性越低,誤差越小,相似性越高。比如在上圖中,y恰好與X2(資料庫裡第一行左二)的誤差最低,相似度達到了96%,那麼y就是資料庫裡第一行左二的那個人的人臉照片,與我自己的辨別相符,達到了人臉識別的目的。


人臉識別的重要性

人臉識別有多重要?人臉識別不僅在安防,海關等重要場合裡發揮了很大的作用,而且在找回遺失的孤兒上起到關鍵作用。這裡不得不稱讚一下人工智慧技術最近在找回丟失兒童方面所作出的貢獻[7],這裡面有一項很關鍵的技術就是人臉識別,尤其是跨年齡人臉識別技術(當然,最後還是要用DNA匹配技術深度確認)。

據我所知,騰訊優圖實驗室應該是目前國內做人臉識別最好的機構之一[8]。

2210978-6454536f5278eb96.png

昨天非常榮幸收到騰訊優圖某位高管的郵件,郵件裡他邀請我去騰訊優圖面試。希望我以後能在人臉識別領域做出對社會真正有貢獻的技術。

參考文獻:

[1] 尹璋琦, 與高中生合作發表學術論文, https://zhuanlan.zhihu.com/p/28315413

[2] Turk M, Pentland A. Eigenfaces for recognition. Journal of cognitive neuroscience, 1991, 3(1): 71-86.

[3] 自動人臉識別基本原理,https://b2museum.cdstm.cn/identification/rlsb-2.htm

[4] https://zh.wikipedia.org/wiki/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB,維基百科。

[5] 人工智慧依然需要被“監督”,微信公眾號“君君玩科技”。

[6] Zhang L, Yang M, Feng X. Sparse representation or collaborative representation: Which helps face recognition? IEEE international conference on computer vision (ICCV), 2011.

[7] http://www.sohu.com/a/133773386_500237

[8] 準確率99.80%!騰訊優圖再次重新整理人臉識別世界紀錄, http://tech.qq.com/a/20170330/033980.htm

相關文章