更多

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

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

    Facebook 對用戶轉發舊聞發出提醒

    在資訊爆發的年代,隨著人們面對大量訊息,而部份處理資訊的人面對訊息確實心有餘力而不足,其中一種情況是轉發舊聞。只是在疫情期間,這行為或會增加人們的心理負擔。 Facebook 面對此問題,添加一項小功能,當分享文章超過九十天,會立即向用戶進行提醒,有望轉發內容質素有所提升。

    Google 推出新認證計劃 發展新聞行業

    Google 以科技為核心,由科技著眼的新聞會有不一樣的角度,例如更注重客觀數據,展示新意念或無圖的抽像新聞時也可用 VR 等技術加入視覺描述,甚至打造出一個全新平台,由個人為主導,而再不需要由各大企業聾斷的媒體新聞事業,描繪如此美好,但這樣的計劃或平台是否沒有其他問題?

    AWS 推 Honeycode 企業免寫程式可製網頁及apps

    對企業來說,經常會運用類似試算表等類型表格的方式來管理計劃、預算、客戶追蹤和倉存管理等,但此類型表格的缺點難以做分層管理,而且輸入大量資料時也會容易混亂;但若因此聘請程式設計師,有點廢時失事。AWS 看到此問題,推出 Honeycode ,讓使用者毋需懂程式碼,也可自製網頁或 apps。

    硬件準備就緒安裝好必要的軟件之後,現在只要按序執行程式就可以, 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/

    相關文章