基於 OpenCV 的面部關鍵點檢測實戰

2021-10-22 08:05:54 字數 3079 閱讀 1502

【csdn 編者按】這篇文章概述了用於構建面部關鍵點檢測模型的技術,這些技術是udacity的ai nanodegree程式的一部分。

作者 | 小白       責編 | 歐陽姝黎

概述

在udacity的aind的最終專案中,目標是建立乙個面部關鍵點檢測模型。然後將此模型整合到完整的流水線中,該流水線拍攝影象,識別影象中的任何面孔,然後檢測這些面孔的關鍵點。

使用openc進行預處理

該項目的一部分是要熟悉opencv庫。具體來說,是在預處理輸入影象時使用它。在此專案中,它用於將影象轉換為灰度並檢測影象中的人臉。opencv的另乙個有用功能是高斯模糊,可以用來隱藏檢測到的面部的身份。下圖顯示了對影象應用面部檢測和高斯模糊的結果。

‍ 使用opencv庫中的面部檢測器,然後可以裁剪影象中的面部,以將其輸入到關鍵點檢測模型中。

資料集

為了訓練關鍵點檢測模型,使用了具有相應關鍵點標籤的面部資料集。該資料集來自kaggle,由96個x 96灰度面部影象組成,帶有15個(x,y)座標標記了面部關鍵點。原始資料集包含7049張影象,但是並非所有影象都具有完整的15個關鍵點標籤。為了解決這個問題,只使用了具有全部15個關鍵點的影象。剩下2140張影象,其中500張被分成了測試集。下圖顯示了資料集的樣本。‍

增廣

使用相對較小的1640張影象訓練集,可以以幾種方式增強資料,以增加模型可以從中學習的示例影象的數量。由於不僅需要增強輸入影象,而且還必須增強關鍵點標籤,以便它們與新增強的影象上的相同點相匹配,這一點變得更具挑戰性。應用了兩種型別的擴充,概述此過程的**可以在jupyter筆記本專案中找到。

水平翻轉—這是相對簡單的。影象的x值和關鍵點反映在影象的中心。對應於臉部左側的關鍵點被替換為相應的右關鍵點。這使訓練資料增加了一倍。以下是水平翻轉的示例。

旋轉和縮放—旋轉和縮放更具挑戰性,但是由於使用了opencv,因此很容易構造乙個可同時應用於影象及其關鍵點的旋轉/縮放矩陣。將旋轉/縮放後的資料集版本新增到普通資料集後,訓練示例再次加倍。下面是這種擴充的乙個示例。

擴充原始資料集後,該模型現在有6560個示例可以進行訓練。

建立模型

用於此模型的體系結構大致基於vgg16模型,該模型是為在imagenet上進行分類而構建的卷積神經網路。vgg16模型使用5個卷積塊從影象中提取特徵。這些塊由幾個卷積層組成,後跟乙個最大池化層,其中影象尺寸減小了一半。在用於該項目的模型中,每個卷積塊只有乙個卷積層。這樣做的原因是,由於資料量有限,因此較簡單的模型不太可能過擬合。

除了使用較少的卷積層之外,還將丟失層新增到前3個卷積塊中,其丟失率為20%,並且在每個卷積層之後新增了批處理歸一化層。最初的vgg16網路都缺少這兩種更新的技術,有助於防止過度安裝。

使用這種架構提取影象特徵,將卷積層的輸出饋送到全域性平均池化層,然後饋送到30個節點(15個關鍵點中每個點的x,y值)的完全連線的輸出層。下圖說明了該模型的完整架構。

訓練模型

為了訓練模型,使用標記的關鍵點和**關鍵點的均方誤差來計算損失。發現adam優化器提供了最佳結果。還發現,通過提高批量大小和學習率可以實現最低的損失。從0.001的學習率開始,對模型進行了針對32、64和128批次大小的15個時期的訓練。對於0.0001和0.00001的學習率重複此步驟。原因是批次數量較小時,梯度下降步驟更加隨機(隨機性更高),因為它是在較少的示例中進行平均的結果。當優化達到最小值時,引數步應代表更通用的解決方案,方法是採用較大批次大小的平均梯度來提供。

下圖顯示了訓練曲線,後者顯示了最後時期的近距離檢視。如你們在最後時期所看到的,訓練損失的步驟是由每種學習率的批量大小增加而產生的。

偽標籤

經過第一輪訓練後,模型相對準確。為了利用原始資料集中的所有資料,使用經過訓練的模型來**缺失值的關鍵點並將其用作標籤。本質上,資料集具有大量不完整的示例,這些示例被扔掉了,但它們仍然從確實存在的關鍵點那裡獲得有用的資訊。為了從該資訊中學習,模型以其最佳猜測填充了不完整的點。

以偽標籤完整資料集並像以前一樣對其進行擴充,使用29520個示例建立了乙個新的訓練資料集。然後,該模型繼續對該資料集進行訓練,然後再進行對原始的全標籤資料集的另一輪訓練。最終,模型誤差被訓練為低於0.0005。我們對此感到非常高興,正如專案筆記本所述:「乙個很好的模型將實現約0.0015的損失」。此外,當繪製在測試影象上時,關鍵點**似乎位於你們期望的位置。

總結

通過訓練關鍵點檢測模型,將面部檢測器和模型組合起來,將關鍵點應用於影象中的面部。下圖給出了此過程的示例產品。

此外,該模型已擴充套件為可與網路攝像頭一起使用,並使用關鍵點功能應用蒙版濾鏡(在這種情況下為太陽鏡)。

☞螞蟻集團換帥!胡曉明辭任 ceo

基於C 的opencv(十二)角點檢測

角點檢測被定義為兩條邊的交點,更嚴格的說法是,角點的區域性領域應該具有兩個不同區域的不同方向的邊界。而實際應用中,大多數所謂的角點檢測方法檢測的是擁有特定特徵的影象點,而不僅僅是 角點 這些特徵點在影象中有具體的座標,並具有某些數學特徵,如區域性最大或最小灰度 某些梯度特徵等。興趣點 interes...

基於MFC和OpenCV實現角點檢測

角點檢測 根據 基於opencv的計算機視覺技術實現 define max corners 200 限定的最大角點數 iplimage srcimage 0 待處理的源影象 iplimage imageshow 0 儲存顯示帶角點的影象 iplimage grayimage 0 原始影象轉換成的灰階...

基於深度學習關鍵點檢測演算法綜述

關鍵點檢測是計算機視覺中比較重要的任務之一,當前主流的演算法可總結如下 1 基於coordinate 即將卷積神經網路 cnn 的特徵通過乙個全連線層來回歸關鍵點的座標和對應的置信度資訊,在對卷積 特徵的利用上,逐漸由單層特徵到金字塔特徵轉換,有代表性的演算法為人臉關鍵點檢測的pfld演算法,全稱為...