1. 程式人生 > >[計算機視覺]人臉應用:人臉檢測、人臉對比、五官檢測、眨眼檢測、活體檢測、疲勞檢測

[計算機視覺]人臉應用:人臉檢測、人臉對比、五官檢測、眨眼檢測、活體檢測、疲勞檢測

人臉應用在計算機視覺體系中佔很大一塊,在深度學習火起來之前,基於傳統機器學習的人臉應用就已經很成熟了,有很多商用應用場景。本文用一個可以實際執行的Demo來說明人臉應用中常見的技術概念,包含‘人臉檢測’、‘人臉對比’、‘人臉表徵檢測(五官定位)’、‘眨眼檢測’、‘活體檢測’以及‘疲勞檢測’。

 

人臉檢測

嚴格來講,人臉檢測只包含對照片中的人臉進行定位,人臉檢測只獲取照片中人臉的矩形方框(Left、Top、Right、Bottom),再沒有其他的內容。現如今網上大部分“人臉檢測”概念模糊,包含的東西很多,比如除了剛才說的定位,還包括後面要說的人臉對比,這個嚴格上講是錯的。

 

人臉對比

當你使用人臉檢測技術發現圖片(視訊幀)中包含一個人臉,那麼如何判斷該人臉是誰呢?這個就是我們常見的人臉授權應用,將一個人臉與資料庫的其他人臉進行對比,看它與資料庫中已有人臉哪個最相似。傳統機器學習中,人臉對比過程需要先提取人臉特徵編碼,尋找一個特徵向量來代替原有人臉RGB圖片,再通過計算兩個人臉特徵向量距離來判斷人臉是否相似(傳統機器學習中的特徵工程可以參考上一篇文章)。如果距離小於某值,則認為是同一個人臉,反之亦然。

 

上圖顯示傳統機器學習方法中人臉對比的過程,過程相對來說比較複雜,需要提取合適的特徵向量,該特徵對原RGB人臉圖片有一定代表性。基於深度學習的方式去做人臉對比就相對來說簡單很多,可以直接是一個端到端的流程:

當然也有的做法是先通過神經網路提取人臉特徵,然後再用傳統機器學習的方式去訓練類似SVM模型去做分類。

 

人臉表徵檢測(五官定位)

一般人臉應用使用前面說到的‘人臉檢測’、‘人臉對比’兩種技術就足夠了,比如人臉打卡、人臉自動馬賽克、人臉開鎖等應用。但是更復雜的一些人臉應用只有人臉檢測和對比是不夠的,比如後面要說的活體檢測、疲勞檢測等場景。這些時候不僅要判斷人臉的位置(矩形方框),還需要檢測出人臉五官位置,比如眉毛形狀、眼睛區域、鼻子位置、嘴巴位置等等,有了五官位置資料之後,我們就可以基於這些資料做一些更復雜的應用了,比如實時判斷視訊中的人是否眨眼、是否閉眼、是否說話、是否低頭抬頭等等。下圖為人臉表徵檢測得到的結果:

上圖顯示通過機器學習提取到一張人臉表徵的68個點,分別為:

(1)左眉毛5個點

(2)右眉毛5個點

(3)左眼睛6個點

(4)右眼睛6個點

(5)鼻樑4個點

(6)鼻尖5個點

(7)上嘴脣/下嘴脣20個點

(8)下巴17個點

我們可以通過下標(python中可以使用切片)快速獲取對應的座標點,該座標點代表臉部表徵在原輸入圖片中的實際位置(畫素單位)。

 

眨眼檢測

對視訊每幀做人臉表徵檢測,得到視訊每幀畫面中人臉五官的位置資料後,我們可以通過分析人眼區域(六個點組成一個閉合的橢圓形)的閉合程度來判斷是否發生眨眼,那麼如何衡量每個眼睛的閉合程度呢?根據前人研究:http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf可知,通過每隻眼的6個點即可判斷眼睛的閉合程度:

眼睛在開啟到閉合時,下面這個表示式的值快速趨近於零:

上面表示式EAR(Eye Aspect Ratio)的值等於垂直方向兩個線段長度之和除以水平方向線段長度*2,這個值在閉眼的瞬間可以趨近於零,在睜眼的瞬間,恢復到原來值。EAR的變化過程如下圖所示:

我們只需要監控EAR的值是否快速波動並且趨近於零來判斷是否閉眼,是否快速恢復來判斷是否睜眼。如果閉眼和睜眼時間間隔很短(只佔幾個視訊幀,每秒25幀算),那麼就認定為眨眼。

 

活體檢測

人臉應用中,為了防止人們使用照片等偽造人臉通過授權,一般都需要對畫面中的人臉進行活體過濾,即判斷當前視訊畫面中的人臉是否是真人,而不是照片等其他代替物。通過前面介紹的眨眼檢測技術,我們可以實現一個非常簡單的‘活體檢測’演算法,演算法每隔一個隨機時間段(比如幾秒,時間不固定,防止人們錄製視訊來偽造)就要求視訊畫面中的人眨眼,如果畫面中的人積極配合演算法發出的指令,那麼可以認為畫面中是真人,否則可能就是偽造人臉。

需要說明的是,活體檢測僅僅通過以上這種方式可能還不是足夠安全,一般還可以結合其他活體檢測技術,比如相機深度檢測、臉部光線檢測、以及利用深度學習技術直接對人臉進行二分類(活體/非活體)。

 

疲勞檢測

疲勞檢測這個應用場景太大了,比如可以用於長途汽車司機疲勞監控告警、值班人員疲勞監控告警等。主要原理還是通過前面介紹的眨眼檢測技術,將其稍微改進一下,我們就可以對閉眼進行檢測,如果閉眼超過一段時間(比如1秒),那麼就認為疲勞發生,發出告警。眨眼判斷很簡單,閉眼判斷更簡單,這些所有的判斷邏輯全部基於人臉表徵提取的資料:

 

Demo原始碼:在公眾號上

需要明確的是,本文所有演算法的準確性全部依賴於模型訓練的好壞,人臉檢測是否準確、人臉特徵提取是否合適、人臉表徵檢測結果是否準確。機器學習就是這樣,結果的好壞完全取決於模型訓練的好壞(特徵提取的好壞)。比如本文這個demo中可以容易看到,人臉表徵檢測對戴眼鏡的人臉效果不是很好,需要更多這方面的訓練資料。有問題的朋友請留言,感興趣的朋友請關注公眾號,分享原創CV/DL相關文