今日香港係假期,大家在家若有時間,可能有興趣寫吓程式,今次與大家介紹如何用電腦程式編寫自拍人臉辨識程式。

人臉辨識可算是最早應用人工智能(AI)和機器學習(ML)的實用領域,由於fb早在幾年前已開始廣泛使用人臉辨識技術,透過機器學習自動認出相片中人物的名字,因此相信大家對人臉辨識技術不會感到陌生;近年更加被應用到監察系統用途,引起愈來愈多人的關注。

然而,我們一般接觸到的人臉辨識技術都是別人在開發和使用,我們只有被辨識的份兒,沒有機會實驗人臉辨識技術的實際編寫和應用情況,即使最近Google開發了Teachable Machine可供使用,非常好玩,但若不編碼仍只是應用而不能改寫內容;相信有不少對年青人和先進科技愛好者都想自己編寫人臉辨識應用程式,了解相關的技術。

早年由於人工智能和機器學習仍處於研究階段,編碼相對困難,以機器學習為例,在機器能辨識人臉前,程式編寫員須先提供大量不同的人臉和非人臉相片為機器進行訓練,過程並不容易。但今天已有相對成熟的技術,有不少已預先訓練好辨識人臉的程式可供使用,其他配套的攝影和雲端檔案存取程式均可備用,而且不少高手在網上提供程式編碼和拍攝Youtube介紹編碼內容,即使是中學生相信也不難學曉。

但在介紹人臉辨識技術前,必先學會編寫電腦程式自拍照片 (selfie),再把不同的自拍照進行人臉辨識,看看人工智能的水平如何。當然大家可以使用很多不同的平台編碼,但我習慣了使用 Google Colaboratory (Colab),好處是不但免費,更提供GPU/CPU雲端存取,又可直接存檔至Github,感覺非常方便,大家可以考慮。但在自拍程式上則較為複雜,由於照片不是從本身的電腦檔案存取,編碼較為困難。但幸好網上已有不少編碼圖書館可以參考。

在介紹編碼前,不如我先把程式的結果示範一些結果讓大家明白程式可做到甚麼,當然我懂的只是小兒科,希望拋磚引玉,一起學習,一起進步。

我為了測試人臉辨識技術的能力,以下是兩款測試結果,首先如圖1所示,我手中持著有我樣貌的照片,看看人臉辨識技術能否辨識出兩張臉孔。

圖1 自編電腦自拍程式相片一

圖1 自編電腦自拍程式相片一

預訓機器學習的程式能夠在相片中(或鏡頭中)辨識出人臉,然後用藍色正方框加以顯示,圖2是使用預訓程式辨識,它能發覺有兩張人臉,一大一小都能辨認出來。此外,還有眼和口的辨識程式,甚至是笑臉辨識技術等,十分有趣。

圖2 自編電腦人臉辨識程式相片一

圖2 自編電腦人臉辨識程式相片一

第二項測試是把手機擋著半邊面,看看人臉辨識能否分辨出來。圖3是自拍的相片2,手機中的相片是側面,而機後的臉孔被手機檔了一半,背景也較暗,且看辨識能力,到底能辨出正半面、側全面,或是兩者皆能,或皆不能?

圖3 自編電腦自拍程式相片二

圖3 自編電腦自拍程式相片二

圖3顯示結果,辨識器只能辨識出手機中的側面人臉,並未能辨識出後面的人臉,到底是因為光線不足,抑或因為手機阻擋?有興趣的朋友可以自行測驗,甚至可以加入很多人一起自拍,考考它能辨識多少人。

圖4 自編電腦人臉辨識程式相片二

圖4 自編電腦人臉辨識程式相片二

誠然,我這介紹的只是人臉辨識技術的最基礎應用,只辨出人臉,卻說不出該人是誰,比起最新科技仍有一段相當大的距離,還要慢慢學習。

關於編碼內容,這裡主要是參考了Open CV and Deep Learning 的程式,可直接在Colab使用(https://colab.research.google.com/github/dortmans/ml_notebooks/blob/master/face_detection.ipynb#scrollTo=N77mENRp_cDV) 及相關的Blog: https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/,圖5是把技術應用到Video / GIF 之上,用途更廣。

圖5 Face Detection by OpenCV and Deep Learning, by Adrian Rosebrock on February 26, 2018https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/

圖5 Face Detection by OpenCV and Deep Learning, by Adrian Rosebrock on February 26, 2018https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/

我同時使用了CascadeClassifier的程式,把人臉辨識的編碼簡化了很多,大家不防參考 https://colab.research.google.com/github/computationalcore/introduction-to-opencv/blob/master/notebooks/4-Cascade_classification.ipynb#scrollTo=rOG12Rey7g9C,同樣是Colab平台的程式,可直接使用,他們採用了Haar feature-based cascade classifiers,有人臉、笑口和眼等辨識預訓程式,但效果未如理想,錯漏的情況頗多,網頁自介照片也說明有多處錯處,把T-Shirt摺紋都當成笑口 (圖6)。

圖6 ”it detected the smiles correctly (the right guy, who is actually me, is not giving a full smile) but there are a lot of false positives, as usual in cascade models.’ https://colab.research.google.com/github/computationalcore/introduction-to-opencv/blob/master/notebooks/4-Cascade_classification.ipynb#scrollTo=_IEdRb4-gU3a

圖6 ”it detected the smiles correctly (the right guy, who is actually me, is not giving a full smile) but there are a lot of false positives, as usual in cascade models.’ https://colab.research.google.com/github/computationalcore/introduction-to-opencv/blob/master/notebooks/4-Cascade_classification.ipynb#scrollTo=_IEdRb4-gU3a

如果大家意猶未盡,想再加以改良,上星期Youtube有新片介紹如何編碼用電腦連續自拍笑容,毋須按掣拍攝,只要笑口,便會自拍,示範了如何用人工智能把人生美好時光留下。有興趣可以瀏覽Programming Hero (2021) Take Automatic Selfie Using Python, Youtube, June 23.https://youtu.be/xhG2AeyJXcU