更多

    【 AI 平民化】1 分鐘製人臉辨識.三:運用篇

    kaWing
    kaWing
    從事科技教育報導逾十年,見證香港電子學習及STEM的興起和轉變,近期關注AI及特殊教育。

    科學角度討論 全人教育發展

    昨日香港懸掛八號風球,但隨疫情期間新常態形成,《 2020 全人發展論壇 ── 從情緒支援及教育科技講起 》如期改在網上舉行,當中數位參與研討者能真實講解香港教育所面對的複雜現況,雖然此論壇不是政策公告,但值得熱心理解教育的相關人士聆聽和參與,從而對未來有更整體和清晰的觀感。

    Facebook 明禁「勸阻接種疫苗廣告」

    觀感和取態是兩面刀,一直鮮有立場的 Facebook 早前公佈政策,明確訂定將禁止「勸阻接種疫苗廣告」。另一方面,所有接種廣告需獲得授權及提供付款人資料。此項活動將率先在美國執行,並預計會推廣至全球。

    實踐真抗疫教學模式 探究未來學習

    數碼原生代( Digital natives )獲得知識的渠道十分多,甚至可說是垂手可得,要吸引或找出動機學習就變得困難。猶幸在疫情期間,有教師反思教學及學習真諦,運用工具實踐能適用於結合傳統面授課及在疫情期間或會停課的真抗疫教學模式。

    硬件準備就緒安裝好必要的軟件之後,現在只要按序執行程式就可以, 1 分鐘試玩人臉辨識。坦白說,實情是毋需 1 分鐘已可建立資料和辨識,可見科技超速發展。
    Face Recognition sample with opencv-python 」程式中,每個程式裡都有解說。要注意的是按照所連接的鏡頭類型,收集和辨識時都要使用不同程式,分別能對應 webcam 及 picam ,檔案名稱上經已註明。本文就以 Webcam 版來解說。

    Step 0 :事前準備(需時: 1 秒)

    執行 setup.py 即可建立用來儲存辨識對象的資料庫,只需建立一次即可。示範的資料庫只紀錄了辨識對象的用戶 ID 和姓名,不過當然大家可以加入更多資料,例如性別、聯絡電話等。

    Step 1 :收集人臉(需時:約 10 秒)

    每一位使用者,需執行 recordface_webcam.py 一次。程式執行後,會要求輸入辨識對象的名稱(第 25 行),然後辨識對象面對鏡頭,按下「 f 」鍵即會拍攝。程式預設是為每位辨識對象拍下 30 張只有臉部的照片(第 27 行)。過程中,程式先會將擷取到的畫面轉為灰階,然後利用 Haar Cascade 分類器來查看畫面裡有沒有人臉(第 54-55 行),有的話就把人臉的部分儲存在「dataset 」目錄裡(第 61-65 行)。
    完成紀錄 30 張人臉照片後,就會將辨識對象的名稱寫入資料庫(第 90 行),並發出一個用戶 ID (第 91 行),作為下一步訓練辨識器時所用的「標籤( Label )」。

    Step 2 :訓練辨識器(需時:約 3 秒)

    收集了多人的人臉照片後,就執行一次 trainer.py 來訓練辨識器。 OpenCV 提供了多種人臉辨識器可供選用,包括:

    • Eigenfaces
    • Fisherfaces
    • Local Binary Patterns Histograms (LBPH)

    今次我們選用 LBPH 人臉辨識器,它的特點是每張人臉照片都會獨立訓練,使用起來比較簡單。程式逐一讀取照片存入儲存一個陣列(Array)(第 46-47 行),另外用一個陣列來儲存這張照片是屬於哪個用戶 ID (標籤)的(第 50 行),然後把這兩個陣列交給 LBPH 人臉辨識器進行訓練(第 58 行),完成後就會得到一個 yml 格式的訓練模型,儲存在「recognizer 」目錄裡(第 59 行)。

    Step 3 :辨識人臉(需時:約 1 秒)

    完成訓練後,就可以進入實用階段。 detect_webcam.py 就是即時檢測畫面上的人臉轉換為數據(第 65-66 行),交給 LBPH 人臉辨識器去作比較,找出最接近的用戶 ID (第 70-72 行)。
    判斷畫面上的人是否資料庫裡的人就在第 79 行,這個數字就是辨識對象樣貌與紀錄資料「有多接近」,所以是愈小愈準確的。如果這個「距離」夠近的話,就會視為成功辨識,會出現 Step 1 裡所輸入的用戶名稱。大家還可以在第 86-90 行之間插入其他動作,例如寄封電郵,或是像第 87 行一樣打開門鎖。
    1362_p035_1

    進階篇:用多線程來提升辨識效能

    到這裡大家可能對辨識效率不太滿意,為甚麼每秒只辨識 5 次那麼少(第 33 行)?嘗試調高這個數字就會發現 Raspberry Pi 4 似乎應付不了更頻密的辨識。這是因為 detect_webcam.py 是以單線程來執行,效率不太好的原故。
    以生活中的攝影館比喻作 CPU ,若只有一個人負責拍攝、轉換相片檔案,再將相片發送至客戶,三個動作由同一個人負責,如此一來每單生意就需要 10 分鐘完成,看似沒有問題,但若全班同學 30 人均需拍照,那麼就需要 300 分鐘,而且這位負責人會非常忙碌。若將他的工作分為三個人,拍攝者、轉換相片檔案者,以及電郵發送者,就可縮短時間,而且由於不需轉換空間等工作,於時間和效率上均會大幅提升。前者由一個人執行所有工作就是單線程,將工作交由更多人分工就是多線程。
    1362_p021在「 Face Recognition sample with opencv-python 」程式中有個「 threading 」目錄裡,就收錄了 detect_webcam.py 的多線程版本「 detect_main.py 」,它把從 webcam 擷取畫面和辨識人臉的工作分別交給「 Capturer.py 」和「 Detector.py 」兩個人(模組)去處理,效能就能提高了。大家不妨一試。

    人臉辨識平民化時代來臨

    本習作既是迎接學習 AI 時代,畢竟 AI 發展多年,亦因此 AI 技術很成熟。本文所示範的僅是基礎人臉辨識技術,所使用的硬件甚至比不上高階智能電話,但效能已十分顯著。簡單而言,現在可在不知不覺中進行人臉辨識,至於如何應用在於執行者,若只是應用學習而非研究,也並不是太困難的事。最後再次鳴謝 Mickey 提供程式及技術講解。

    延伸閱讀

    https://www.pcmarket.com.hk/2019/10/02/ai%e5%b9%b3%e6%b0%91%e5%8c%96-1%e5%88%86%e9%90%98%e8%a3%bd%e4%ba%ba%e8%87%89%e8%be%a8%e8%ad%98-%e4%b8%80-%e5%99%a8%e6%9d%90%e7%af%87/
    https://www.pcmarket.com.hk/2019/10/05/ai-%e5%b9%b3%e6%b0%91%e5%8c%96-1%e5%88%86%e9%90%98%e8%a3%bd%e4%ba%ba%e8%87%89%e8%be%a8%e8%ad%98-%e4%ba%8c-%e8%bb%9f%e4%bb%b6%e7%af%87/

    您會感興趣的內容

    相關文章