前言
眼球追蹤技術已發展一段時間並且應用場景廣泛,而近期元宇宙爆炸性的成長讓眼球追蹤技術再次成為眾人的焦點,其原因在於要如何讓使用者能更加沉浸在虛擬世界裡眼神交流非常重要,因此要達到在虛擬世界裡呈現眼神或注視方向眼球追蹤技術是必不可少。眼球追蹤除了應用在元宇宙外廣告看板也是重點之一,透過蒐集消費者在關注廣告看板時的區域能讓廣告商更加了解消費者喜好,再利用大數據分析進而投放更符合消費者喜好的廣告。
目的
透過本篇博文教大家如何在Android手機利用OpenCV Cascade Classifier模型架構實現眼球追蹤功能。
Cascade Classifier模型介紹
OpenCV 使用的 Object detection 技術稱為 Cascade Classifier for Object Detection ,是一種屬於 boosted cascade of weak classifiers 的方法,也就是將數個弱分類器串聯起來再得出最佳的分類結果。其實最早整合到 OpenCV 並支援的分類特徵是哈爾特徵(Haar-like features),後來加入了 LBP ( Local Binary Pattern)以及 HOG( Histogram Of Gradient),不過可惜的是 HOG 在 3.x 後由於某些技術問題被取消了。Boosting 的中心思想在於「三個臭皮匠勝過一個諸葛亮」,主要是將大量的弱分類器(分類效果僅比隨機好一點)逐步訓練成一個較強的分類器,透過對每個弱分類器分類錯誤的部份持續投入學習,最後形成一個超強的分類器。在機器學習中,有很多分類器便應用了 Boosting 的方法,例如 AdaBoost(Adaptive Boosting)、Gradient Tree Boosting、XGBoost 等, 而 OpenCV 內建的 Cascade Classifier for Object Detection,正是應用了AdaBoost。而Android眼球追蹤是使用Cascade Classifier模型架構。
Cascade Classifier模型訓練
- Cascade Classifier模型訓練流程可參考作者:曾成訓(CH.TSENG)撰寫的【影像辨識】訓練貓臉偵測器。
App程式架構介紹
程式架構圖(圖1):
圖 1
detectors | |
EyeDetector |
AI模型判斷眼睛位置 |
FaceDetector |
AI模型判斷臉部位置 |
PupilDetector |
OpenCV抓取瞳孔位置 |
util | |
CircleRegion |
繪製圓形區域功能 |
SquareRegion |
繪製方形區域功能 |
EyeTrackingProcesser |
主要執行眼球追蹤程式碼 |
Frame |
調整輸入畫面功能 |
FrontalCameraView |
配置前鏡頭功能 |
MainActivity |
主程式 |
raw | |
haarcascade_eye.xml |
眼睛AI模型檔案 |
haarcascade_frontalface_alt2.xml |
臉部AI模型檔案 |
App程式碼重點講解
AI模型判斷流程:
圖 2
- loadClassifiers()函式主要功能為導入Cascade Classifier模型。(圖3)
圖 3
- initialize()函式主要功能為將圖片做前處理調整至適當大小以利模型判斷。(圖4)
圖 4
- detectMulitScale()函式主要功能為進行模型推論。(圖5) (圖6)
圖 5
圖 6
detectMulitScale()函式參數介紹:
image |
待檢測圖片。 |
objects |
被檢測物體的矩形框向量組。 |
scaleFactor |
表示在前後兩次相繼的掃描中,搜索窗口的比例係數。默認為1.1即每次搜索窗口依次擴大10%。 |
minNeighbors |
每個目標至少檢測到幾次以上,才可被認定是真數據。 |
flags |
分類器參數。不需設置,使用默認值即可。 |
minSize |
設定搜尋的最小尺寸。 |
maxSize |
設定搜尋的最大尺寸。 |
判斷眼睛觀看方向流程:
圖 7
- faceDetector.detect()函式主要功能為判斷是否有偵測到臉部。(圖8)
圖 8
- eyeDetector.detect()函式主要功能為判斷是否有偵測到眼睛。(圖9)
圖 9
- visualiseTracking()函式主要功能為判斷瞳孔中心點與眼睛中心點,並計算兩者差值是否大於10或小於-10,如果差值大於10代表看向右邊,差值小於-10代表看向左邊。(圖10)
圖 10
- 圖11內程式碼為判斷左右邊計數器。
圖 11
- 圖12內程式碼主要內容為將看左右邊資訊顯示於App上。
圖 12
App顯示結果
Total time |
總執行時間 |
Look left |
看左邊次數 |
Look right |
看右邊次數 |
runtime |
運行時間 |
FPS |
每秒幀數 |
圖 13
圖 14
結語
本篇博文使用的Cascade Classifier模型是屬於輕量化模型,運行速度快但準確度並非最佳。使用者可以依照Cascade Classifier模型訓練步驟增加訓練集或是提高訓練次數來提升模型準確度。
評論