更多

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

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

    MeWe 繁體中文版登場

    潮流興社交轉移,在社交媒體上,與 Facebook 同類的是 MeWe 。不過,MeWe 上周在兩大 App 平台上仍未支援繁體中文,據說因此而令不少人不轉會,今早 MeWe 於 iOS 版本上提供繁體中文介面。此外,提醒一下大家,其實網頁版也有提供中文版本!

    WhatsApp 簡易匯出對話記錄

    近日有轉用通訊軟件風潮,不少友人私下查詢 WhatsApp 將對話保留的方法,不同過往的的備份方式,由於不是轉移,也沒有重新匯入的打算,只是要匯出重要的對話內容保留用作日後查詢,加上沒有取消電話,並不需要備份通訊錄,如此可運用Whatsapp 內置功能已足夠。

    Signal 快速上手 簡易設定兼快手開 group

    潮流興社交移民,但小編認為這不是單純移民持有單一國籍的想法。現時的狀況比較像是多了一個電視台,當巿場上有多一個平台可供選擇支持的話,只要大家樂意支持,就有機會促進巿場良性競爭,日後也可就個人情況使用,多一個機會實行 Work-life balance ,何樂而不為。事實上,科技世界的新服務往往比舊服務更能徹底改進。過往香港科技界亦曾發生,由 ICQ 轉至 msn messenger ,再轉至 Signal ,改變始於起動,而且現實也許沒有想像中困難和緩慢。

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

    您會感興趣的內容

    相關文章