真會(huì)玩,程序員用AI認(rèn)雙胞胎兒子!“這個(gè)樹(shù)莓派版人臉識(shí)別系統(tǒng),沒(méi)我認(rèn)得準(zhǔn)”
到了 2021 年,人們普遍認(rèn)為,通過(guò)學(xué)習(xí)算法和人工智能研究,機(jī)器在很多方面都優(yōu)于人類。長(zhǎng)期以來(lái),機(jī)器一直主導(dǎo)著制造業(yè)和供應(yīng)鏈領(lǐng)域,甚至開(kāi)始涉足更復(fù)雜的任務(wù),比如自動(dòng)駕駛,甚至撰寫(xiě)高難度綜合類文章。但是,在面部識(shí)別方面,機(jī)器的發(fā)展真的已經(jīng)超過(guò)人類大腦了嗎?
13 年前,當(dāng)我的同卵雙胞胎兒子出生時(shí),我和妻子很容易認(rèn)出哪一個(gè)是 Nicolas,哪一個(gè)是 Alexander。在舊金山加利福尼亞太平洋醫(yī)學(xué)中心的新生兒重癥監(jiān)護(hù)室(NICU)陪伴了他們 8 周后,我們知道如何將他們的個(gè)人行為與名字相匹配。我們很早就學(xué)到了大多數(shù)同卵雙胞胎父母都會(huì)掌握的東西:一個(gè)人是誰(shuí),不僅取決于他的長(zhǎng)相,還取決于他走路、說(shuō)話的方式,以及在與世界互動(dòng)時(shí)的各種行為舉止的差異。處理這個(gè)廣泛的數(shù)據(jù)集使人類能夠立即識(shí)別出我們所認(rèn)識(shí)的人,包括同卵雙胞胎。
圖|Alexander 和 Nicolas
隨著從識(shí)別罪犯到幫助我們購(gòu)物等各個(gè)方面的廣泛應(yīng)用,面部識(shí)別在新聞中被稱為“矩陣式的銀彈”(Matrix-like silver bullet),我一直在想,當(dāng)數(shù)據(jù)集只呈現(xiàn)出非常微小的差異時(shí),機(jī)器在辨別人臉?lè)矫婺軌蜃龅绞裁吹夭剑勘热缱R(shí)別同卵雙胞胎。
深入探討差異
隨著兒子們一天天長(zhǎng)大,我們?cè)敿?xì)地討論了他們基因組成的獨(dú)特性質(zhì)——本質(zhì)上說(shuō),他們是從同一個(gè)受精卵中克隆而來(lái)的(注:這有一個(gè)頻率非常高的“克隆”(“coolness”)因素,因?yàn)樗麄兪恰缎乔虼髴?zhàn)》中克隆人軍隊(duì)的忠實(shí)粉絲)。對(duì)他們來(lái)說(shuō),他們是完全相同的人,從相同的藍(lán)圖中創(chuàng)造出來(lái)。當(dāng)然,它們之間是有區(qū)別的,這些區(qū)別使得我偶爾會(huì)將他們弄混淆,而且我猜測(cè),機(jī)器也會(huì)分不清。相同的 DNA 是一回事,但是基因的內(nèi)在表現(xiàn)和所處環(huán)境的影響,在人類隨著時(shí)間變化和發(fā)展中起著重要作用。
舉個(gè)例子,我最近購(gòu)買了一部帶有指紋識(shí)別器的手機(jī),我問(wèn)我的兒子們是否想做一個(gè)小實(shí)驗(yàn):一個(gè)將指紋錄入,然后另一個(gè)用自己的手指去解鎖,這顯然是行不通的。事實(shí)證明,多種環(huán)境因素(其中只有一種是基因)驅(qū)使了子宮內(nèi)的“指紋”形成,因此雙胞胎通常具有不同的指紋。
為了幫助回答有關(guān)“人類或機(jī)器誰(shuí)更擅長(zhǎng)識(shí)別同卵雙胞胎”的問(wèn)題,我決定設(shè)計(jì)一個(gè)比指紋讀取器稍微復(fù)雜的實(shí)驗(yàn),并邀請(qǐng)我的“小科學(xué)家們”(我的兒子)接受培訓(xùn)以提供幫助。
構(gòu)建實(shí)驗(yàn)
對(duì)于這個(gè)項(xiàng)目,我想構(gòu)建一個(gè)盡可能便宜的計(jì)算機(jī)系統(tǒng),該系統(tǒng)能夠運(yùn)行執(zhí)行和訓(xùn)練機(jī)器學(xué)習(xí)與面部識(shí)別模型所需的所有軟件。我選擇樹(shù)莓派(Raspberry Pi)是因?yàn)樗哂袠O高的成本效益,其外圍支持并且能夠運(yùn)行標(biāo)準(zhǔn)的 Linux 發(fā)行版以及所有編譯軟件所必需的工具。
我現(xiàn)在已經(jīng)擁有一些用于其他項(xiàng)目的 Raspberry Pi,因此我測(cè)試了三個(gè),看哪種最適合該應(yīng)用程序。Pi Zero 可以正常工作,但在分析視頻提要的幀并編譯所有必需的軟件時(shí),它耗時(shí) 48 小時(shí)(是的,編譯該軟件需要 2 天)。對(duì)于任何想要運(yùn)行類似環(huán)境的人,我強(qiáng)烈推薦 Pi 4b(8GB 型號(hào)),因?yàn)樗哂懈斓奶幚砥鳎鄠€(gè)內(nèi)核和擴(kuò)展內(nèi)存。我們測(cè)試的三個(gè) Pi 的詳細(xì)細(xì)節(jié)和形狀因子如下所示。該設(shè)置過(guò)程的其余部分假定使用 Pi 4b(8GB)。
圖 | Pi Zero,Pi 3b+ 和 Pi 4b- 刻度鉛筆
這個(gè)項(xiàng)目還需要一個(gè)網(wǎng)絡(luò)攝像頭。我已經(jīng)有一個(gè) Logitech USB 網(wǎng)絡(luò)攝像頭,該攝像頭運(yùn)行良好,無(wú)需安裝驅(qū)動(dòng)程序。任何現(xiàn)代的 Logitech 或類似的網(wǎng)絡(luò)攝像頭都可以使用。
設(shè)置:步驟 1
設(shè)置Pi的第一步是將 Raspberry Pi OS 閃存到 micro SD 卡上并進(jìn)行一些基本配置。為此,將 Raspberry Pi 成像器下載并安裝到工作站上。安裝完成后,插入 micro SD 卡(通常使用適配器),啟動(dòng)成像儀,選擇操作系統(tǒng)和 SD 卡,然后選擇“寫(xiě)入(Write)”。對(duì)于 OS(操作系統(tǒng)),請(qǐng)選擇 Raspberry PI OS(32位),這是 Debian Linux 的端口,具有設(shè)置機(jī)器學(xué)習(xí)環(huán)境所需的一切要素。SD 卡寫(xiě)入并驗(yàn)證后,請(qǐng)勿將其移除,將其重新插入 Pi 之前,還需要進(jìn)行三個(gè)附加配置:設(shè)置 WiFi,SSH 和視頻輸出。
- WiFi:?jiǎn)?dòng) Pi 時(shí),需要將其連接到本地網(wǎng)絡(luò)。創(chuàng)建一個(gè)名為 wpa_supplicant.conf 的文件,并將其放在 SD 卡的頂層。確保文件格式為純文本,并以 .conf 結(jié)尾。保存文件之前,添加你地理位置的兩個(gè)字母的國(guó)家/地區(qū)代碼以及 WiFi 網(wǎng)絡(luò)的 SSID 和 PSK(保留雙引號(hào))。
- SSH:由于我們將 Pi 設(shè)置為無(wú)頭運(yùn)行(沒(méi)有監(jiān)視器),因此我們需要一種連接到它進(jìn)行管理和配置的方法——使用 SSH。要啟用 Linux SSH 守護(hù)程序并自動(dòng)進(jìn)行,請(qǐng)將一個(gè)名為 ssh 的文件放置在 SD 卡的頂層,該文件不包含任何內(nèi)容且沒(méi)有文件擴(kuò)展名。
- 視頻:我們將在沒(méi)有顯示器連接的情況下啟動(dòng) Pi,但仍希望在對(duì)其進(jìn)行遠(yuǎn)程控制時(shí)啟用視頻,因此即使沒(méi)有被檢測(cè)到,我們也必須強(qiáng)制 HDMI 處于活動(dòng)狀態(tài)。編輯 SD 卡頂層的名為 config.txt 的文件,然后取消 hdmi_force_hotplug = 1 行的注釋。
現(xiàn)在彈出 micro SD 卡,將其插入 Pi,連接到電源并打開(kāi)。大約一分鐘后,Pi 應(yīng)已完全啟動(dòng),并應(yīng)連接到你的 WiFi 網(wǎng)絡(luò)。檢查 WiFi 路由器以獲取 Pi 的 IP 地址。
現(xiàn)在,通過(guò)打開(kāi)終端(在 Mac 上)或使用 Putty(在 Windows 上)和 SSH 將 IP 地址作為用戶名“Pi”(默認(rèn)密碼為“raspberry”)來(lái)驗(yàn)證你可以連接到 Pi。
設(shè)置:步驟 2
安裝過(guò)程的第二步是安裝和編譯所有必需的軟件。為了執(zhí)行面部識(shí)別任務(wù),我決定使用 OpenCV(開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù))和 Dlib。OpenCV 和 Dlib 具有許多優(yōu)化算法,包括面部識(shí)別,已在工業(yè)界和學(xué)術(shù)界廣泛應(yīng)用,受到了良好的尊重和支持,并且具有用于 Python 編程語(yǔ)言的接口,這些接口可用于驅(qū)動(dòng)模型訓(xùn)練和識(shí)別程序。互聯(lián)網(wǎng)上有許多在 Raspberry Pi 上設(shè)置 OpenCV 和 Dlib 的示例,但是我找不到任何簡(jiǎn)潔而全面的內(nèi)容,因此創(chuàng)建了一個(gè)簡(jiǎn)單的包裝程序來(lái)安裝所有的必備軟件并編譯 OpenCV 和 Dlib 源代碼。要下載和執(zhí)行此包裝程序,請(qǐng)執(zhí)行以下操作:
- 以 pi 用戶的身份通過(guò) SSH 連接到 Pi,并確保你位于 pi 用戶的主目錄中:cd~
- 在Github上克隆我們的Raspberry Pi面部識(shí)別存儲(chǔ)庫(kù)的副本:git clone https://github.com/tomalessi/pi-facial-recognition.git
- 執(zhí)行安裝腳本(大約需要 1 個(gè)小時(shí)):pi-facial-recognition / pi-setup.sh
設(shè)置:步驟 3
Pi 現(xiàn)在已經(jīng)準(zhǔn)備好拍照和訓(xùn)練面部識(shí)別模型。為此,我們需要查看 Pi 上的窗口環(huán)境,以便通過(guò) VNC Viewer 連接到它。你需要在 Pi 上啟用 VNC 服務(wù)器,并在你的工作站上下載一個(gè)客戶端。請(qǐng)按照以下步驟操作:
- Pi 設(shè)置:SSH 到 PI,執(zhí)行命令 sudo raspi-config,向下滾動(dòng)到界面選項(xiàng) →VNC 并啟用它。啟用此功能后,你需要重新啟動(dòng)。
- 工作站設(shè)置:從 RealVNC 下載并為你的平臺(tái)安裝 VNC Viewer(免費(fèi)下載)。安裝完成后,使用其 IP 地址設(shè)置從 VNC Viewer 到 Pi 的新連接,并確保你可以登錄。成功登錄后,你將會(huì)看到 Raspberry Pi OS 的背景。
進(jìn)行面部識(shí)別
面部識(shí)別過(guò)程涉及 3 個(gè)步驟:拍照,訓(xùn)練模型,然后分析實(shí)時(shí)視頻。這 3 個(gè)任務(wù)都可以使用 face-req.py Python 程序執(zhí)行,該程序已從上面的 Github 存儲(chǔ)庫(kù)中彈出(注意:這是第一個(gè)修訂版,沒(méi)有很多錯(cuò)誤處理功能-如果你希望我們進(jìn)行改進(jìn),請(qǐng)?zhí)峤?PR)。拍攝照片,訓(xùn)練模型和分析視頻的步驟如下所示。這三個(gè)假設(shè)你都已通過(guò) VNC 登錄到 Pi,并打開(kāi)了一個(gè)終端窗口。
- 通過(guò)執(zhí)行以下命令并在觀看實(shí)時(shí)視頻后按空格鍵來(lái)拍照:python pi-facial-recognition / face-req.py -c photo -n Tom 通過(guò)將 -n 參數(shù)替換為另一個(gè)參數(shù)來(lái)繼續(xù)為他人拍照名稱。在終端窗口中按 ctrl + c 退出。
- 訓(xùn)練模型:python pi-facial-recognition / face-req.py -c train。分析每張照片,然后將結(jié)果序列化以用于分析視頻時(shí),大約需要 10 秒鐘。
- 分析視頻并應(yīng)用面部識(shí)別模型:python pi-facial-recognition / face-req.py -c analyze。大約十秒鐘后,應(yīng)該開(kāi)始直播視頻。識(shí)別出的所有面孔將被標(biāo)記為該人的名字,否則面孔將被標(biāo)記為無(wú)法識(shí)別。按“q”退出。
- 清理環(huán)境并重新開(kāi)始,請(qǐng)執(zhí)行以下操作:python pi-facial-recognition / face-req.py -c clean。
實(shí)驗(yàn)結(jié)果
完全設(shè)置好環(huán)境后,我拍攝了 3 張自己的頭像,3 張 Nicolas 的頭像和 3 張 Alexander 的頭像,然后用這些照片訓(xùn)練面部識(shí)別機(jī)器學(xué)習(xí)系統(tǒng)(一張正面,一張向左,另一張向右)。在執(zhí)行這些測(cè)試的當(dāng)天,除了當(dāng)前照片外,沒(méi)有對(duì)任何照片進(jìn)行任何修正。訓(xùn)練完系統(tǒng)后,我們輪流站在鏡頭前確定機(jī)器是否可以識(shí)別。
注意:我們嘗試了另一種實(shí)驗(yàn),即以不同角度拍攝 10 張照片,但這并沒(méi)有改變結(jié)果,可能是因?yàn)槲覀兪褂玫氖敲嫦蛱荻戎狈綀D(HOG)的面部識(shí)別方法,它只適用于正面照片。
結(jié)果:測(cè)試 1
測(cè)試 1 是我本人和 Alexander,機(jī)器識(shí)別正確。
結(jié)果:測(cè)試 2
測(cè)試 2 是我和 Nicolas。機(jī)器再次正確識(shí)別了。我開(kāi)始思考自己最開(kāi)始的猜測(cè)是錯(cuò)誤的——也許機(jī)器會(huì)勝利。
結(jié)果:測(cè)試 3
測(cè)試 3 是本次的“重頭戲”——我們?nèi)齻€(gè)人一起。然后機(jī)器故障了!顯然,沒(méi)有兩個(gè) Nicolas。我們發(fā)現(xiàn),如果孩子們四處走動(dòng),識(shí)別會(huì)來(lái)回切換,但是機(jī)器很少能同時(shí)識(shí)別雙胞胎。不科學(xué)的是,大約有 5% 的時(shí)間,它能同時(shí)正確識(shí)別雙胞胎和我自己。
結(jié)果:測(cè)試 4
我想看看機(jī)器學(xué)習(xí)模型對(duì) 3 歲時(shí)的雙胞胎照片的識(shí)別效果如何——照片被舉到鏡頭前。我必須給這臺(tái)機(jī)器一些肯定,它確實(shí)在照片中(第一次)正確地識(shí)別了 Nicolas(雖然沒(méi)有識(shí)別出 Alexander),我把照片的方向和距離在鏡頭上稍微移動(dòng)了一下,然后它錯(cuò)誤地識(shí)別了 Alexander,無(wú)法識(shí)別 Nicolas。不過(guò),這已經(jīng)是很好的結(jié)果,畢竟從 3-10 歲,孩子們的臉已經(jīng)發(fā)生了很多變化。
Alexander(左),Nicolas(右)
Alexander(左),Nicolas(右)
結(jié)果:測(cè)試 5
我嘗試了一張較新的彩色照片(孩子可能已經(jīng) 4 歲),機(jī)器再次出現(xiàn)故障。它錯(cuò)誤地識(shí)別出兩個(gè) Nicolas。
對(duì)于最后的測(cè)試,我想看看這些照片的年齡限制在機(jī)器完全無(wú)法識(shí)別之前應(yīng)該為多少。我用了一張雙胞胎一歲左右的照片。機(jī)器正確地識(shí)別了我,但沒(méi)有識(shí)別出雙胞胎。
注意:即使是一張 12 歲的靜態(tài)照片,我和我妻子也很容易馬上分辨雙胞胎。
實(shí)驗(yàn)結(jié)論
這里的第一個(gè)結(jié)論是顯而易見(jiàn)的。一個(gè)人花 75 美元就能構(gòu)建一個(gè)能夠運(yùn)行現(xiàn)代面部識(shí)別和機(jī)器學(xué)習(xí)算法的功能完備的計(jì)算機(jī)系統(tǒng)(如果你不介意有點(diǎn)慢,有的甚至只需 10 美元)。暫且不提更復(fù)雜的識(shí)別雙胞胎的任務(wù),這臺(tái)機(jī)器在現(xiàn)場(chǎng)視頻中識(shí)別非雙胞胎的成功率為 100%。該系統(tǒng)訓(xùn)練的每一個(gè)非雙胞胎都能獲得 100% 的識(shí)別成功率(我們做了其他非雙胞胎測(cè)試,這里沒(méi)有顯示)。同時(shí),出于個(gè)人隱私方面的考慮,這確實(shí)讓我躊躇不前。這項(xiàng)技術(shù)功能強(qiáng)大,非常容易使用,而且很可能部署在我們?nèi)粘I钪袩o(wú)法預(yù)料的地方——我們需要確保這項(xiàng)技術(shù)不會(huì)被濫用。
第二個(gè)結(jié)論是,在我們生命的前 13 年中,我們的面部特征會(huì)持續(xù)發(fā)生巨大變化,這使得年輕人的面部識(shí)別變得困難。該機(jī)器能夠從舊照片中識(shí)別雙胞胎,即使他們還在“蹣跚學(xué)步”,也給我留下了深刻的印象。老實(shí)說(shuō),這太棒了!除了我和我的妻子,沒(méi)有人可以看我們孩子的舊照片并確定誰(shuí)是誰(shuí)。
最后,最重要的是,我觀察到機(jī)器很難識(shí)別同卵雙胞胎,即使是像我孩子這樣有明顯差異的雙胞胎。該系統(tǒng)識(shí)別時(shí)確實(shí)很費(fèi)勁,尤其是當(dāng)一對(duì)雙胞胎或一個(gè)在視頻幀內(nèi)移動(dòng)時(shí)–經(jīng)常出現(xiàn)標(biāo)識(shí)錯(cuò)誤。從這些簡(jiǎn)單的測(cè)試中,我們得出結(jié)論:就目前而言,人類在面部識(shí)別方面比機(jī)器要好得多。這不足為奇,因?yàn)?600 萬(wàn)年來(lái)我們一直在進(jìn)化和完善我們的感官。我不能告訴你為什么我能輕易地分辨出我的孩子之間的區(qū)別,我只知道這很容易。機(jī)器或許終將趕上我們,但不是現(xiàn)在。
下一步的打算
我的兒子們想在 Pi 上內(nèi)置一些其他功能,以控制門(mén)上的鎖,或在他們進(jìn)入臥室時(shí)打招呼,但是根據(jù)我們的結(jié)果,我們首先需要提高Pi的能力來(lái)區(qū)分他們(以免一方接觸到另一方的寶藏)。
為了提高系統(tǒng)的準(zhǔn)確性,我想嘗試一些不同的面部識(shí)別技術(shù),比如利用 Dlib 支持的卷積神經(jīng)網(wǎng)絡(luò)(CNN)(盡管 Raspberry Pi 受其計(jì)算能力的限制),或者讓 Pi 調(diào)用 GCP、AWS 或 Azure 中的公共服務(wù)進(jìn)行面部識(shí)別。
學(xué)術(shù)界對(duì)雙胞胎面部識(shí)別的研究也越來(lái)越多,因此技術(shù)肯定會(huì)繼續(xù)改進(jìn),以解決我們?cè)诖颂幹赋龅囊恍┈F(xiàn)有缺陷——我和我的兒子們肯定會(huì)關(guān)注這個(gè)領(lǐng)域。