【蜂口 | AI人工智慧】人臉檢測(上)——龍鵬 深度學習與人臉影像應用連載(一)

絵飛的魚發表於2018-09-28

今天我將給大家帶來人 檢測的分享。 這次的分享是人 檢測的上半部分的分享。 這次分享的主要內容 總共包含三個模組:

第一模組是基本問題。 在這個分享中, 我們將給大家對人臉檢測的基本流程以及其中的一些關鍵技術做一個介紹。

第二模組是傳統方法的介紹。 我們選擇的傳統方法是以手動設計特徵以及手動選擇S VM、Adaboost 這樣的一些分類器的策略。 其中 DPM之類的方法在此不做過多的介紹。

第三模組裡我們對我們所選擇的傳統的方法做一個總結。 主要是從速度和精度這兩個方向進行一個總結。

下面開始第一模組, 檢測流程和關鍵技術。 我們首先看一張圖:

這是人臉檢測的一個典型的應用場景。 我們可以看到這個圖有如下幾個特點:

首先,這個圖它包含了非常多的人臉, 總共包含了幾十個人

其次,這個圖包含 人臉的尺度有比較大的變化。 從離攝像頭較近的比較大的人臉到離攝像頭比較遠的人臉, 從正面的人臉到側面的人臉。 這個圖中的人臉, 尺度以及角度這樣的多樣性。

那人 檢測的流程是什麼樣 主要包含三個步驟:

第一個步驟,就是影像塊的選擇, 也就是說我們要從源頭中選擇一個影像塊, 然後我們檢測這個影像塊是否包含人臉。

第二步驟就是要提取特徵進行描述。提取 特徵 必須要能夠區分人臉和非人 的影像。

第三個步驟就是對我們第二步驟提取的特徵, 使用一個比較 魯棒 的分類器來進行判斷。

所以人臉檢測問題實際上它要解決的就是三個問題。

第一個問題,如何選擇圖 塊?

這一直是人 檢測中最最重要的一個步驟。 當我們選擇好一個影像塊之後, 我們就可以對這個影像 去進行特徵的提取了。

在傳統方法中, 影像 的選擇主要是利用滑動視窗的方法, 也就是說我們選擇一個滑動視窗, 對原始的影像中進行逐個畫素的掃描, 也就是一個密集檢測的過程。 然後我們提取到了非常非常多的視窗, 這就是我們候選的人臉選擇視窗。 當然這個視窗的選擇它必須有一定的策略。 因為在影像之中人臉是有大小的, 也就是 尺度 的問題, 所以我們選擇的視窗要想覆蓋到不同大 的人臉, 我們必須進行一個多 尺度 的視窗的設計。

一個常見的方法, 也就是在影像領域中非常非常經典的一個思想,就是 影像 金字塔。 我們可以利用金字塔的多尺度來對我們的滑動視窗進行 選擇。

第二個問題就是如何提取這個特徵, 如何提取到一個非常魯棒的能夠區分人臉影像和非人臉影像的特徵?

這就是一個傳統的魯棒特徵的設計問題。在影像處理的發展過程中,已經出現了非常多的經典的影像描述子, LBP,HoG ,這些都是經過實際驗證非常魯棒的一些特徵。傳統的方法就是依賴於這些特徵以及這些特徵的改進。

第三個問題就是我們如何判斷它是否為人臉

當然這就是可以利用非常非常多的分類器來進行判斷。所以 如何判斷 人臉 ,實際 也就是我們分類器的選擇問題。

可以說只要解決了在選擇影像塊的過程中的一個計算量的問題, 解決了一個魯棒的特徵, 以及解決 分類器的選擇, 就解決了人 檢測的問題。

下面我們介紹一個比較具有代表性的傳統方法 思路。

傳統方法提取特徵, 它有幾個方向:

首先,利用先驗知識, 包括:

1)幾何位置。 也就是說人臉的影像中的一些子區域, 包括眼睛鼻子嘴巴等, 它們的幾何位置是有一些先驗知識的。 所以我們可以透過檢測這些區域性的影像塊的存在, 來判斷我們這個影像是不是一個人臉影像。

2) 膚色 模型。 透過對我們不同膚色人種建立一個 膚色 模型。 我們可以做一個簡單的顏色分類器, 這是最開始的利用這些先驗知識的 人臉 檢測方法。

其次,隨後我們出現了更魯棒的特徵, 這個 更魯棒 的特徵就包括了 LBP紋理描述子 Haar描述子 以及 HoG 梯度描述 子, 這些特徵相對於先驗知識來說, 會更加的魯棒 對人 的各種姿態光照會更加 魯棒

再就是分類器的選擇。 在傳統的方法中, 分類器就包含了S VM、Adaboost 等等一系列比較經典的分類器。

下面我們介紹一下 opencv 裡面的一個人臉檢測演算法, 叫做 VJ 演算法。 這是傳統的人 檢測方法中非常非常具有代表性的一個方法, 它也是最開始的基於深度學習的人臉檢測方法的一個啟發。

它的基本流程是這樣的:

1)利用 Haar 等特徵來描述影像區域的共有的屬性。 也就是說 Haar 特徵就是一個區域性 影像塊 的特徵抽象。

2)建立積分影像。 建立 積分影像的動機就是為了快速獲取幾種不同的矩形特徵, 這是為了解決前面的計算量的問題。 因為對於一張非常大的人臉, 如果我們密集地進行 滑窗的話, 會涉及到大量的影像特徵的抽取。 如果我們不進行一個有效的策略的話, 這個計算量是非常之大的。

3)串接不同區域的幾何特徵。 前面我們雖然利用 Haar 特徵提取 每一個影像化的特徵, 但是這些特徵是影像的一個區域性區域塊, 它並不能完整地描述一個影像。 所以我們要把這些幾何特徵, 不同大小不同尺寸的一個視窗的幾何特徵進行串接, 從而能更好地描述這樣一個影像。 這解決的也是特徵的問題。

4) 利用 Adaboost 演算法來進行特徵的選擇與訓練。 前面我們選擇了非常非常多的特徵, 但是其中只有某些特徵是對人臉有效的一些特徵, 所以我們要利用 Adaboost 演算法來進行特徵的選擇。 這就是 VJ 演算法的一個核心的流程。

下面我們對 VJ 演算法進行一個比較詳細的講述。

首先, Haar 特徵。 什麼是 Haar 特徵? 所謂 Haar 特徵就是我們取一個矩形的小塊, 把這個影像塊劃分成黑色和白色兩部分割槽域, 然後我們分別對這個黑色和白色這兩部分割槽域的灰度值進行求和。 求和之後, 我們對這兩部分的灰度值的均值去做一個相減的操作, 就得到了 Haar 特徵。

我們看上面的這張圖。 這張圖展示了四種不同的型別的矩形區域, 我們都是求取的白色區域 黑色區域的一個灰度的差值, 它代表什麼? 它代表的就是一個區域性區域的相對明暗關係, 這就是 Haar 特徵。

另外還有很多的其他的一些常用於 人臉檢測和識別的特徵, 包括 L BP特徵、 Hog 特徵以及 Surf 特徵 它們本質上也是反映區域性區域的明暗關係。 因為我們人臉影像本身就有明暗關係, 所以 Haar 特徵是一個非常有效的傳統的特徵。

有了我們的特徵之後, 我們如何高效率的計算我們這樣的一個海量的視窗裡面的特徵, 假如在我們沒有一個比較高效的策略的前提下, 前面我們使用的是滑窗的方法, 我們透過 滑窗 逐行的掃描我們的影像, 就會產生海量的區域。 這個量是一個什麼樣的量級呢? 我們可以看到,當我們使用一個 16×16的視窗去掃描影像的時候, 它就會產生 3萬多的特徵數量。 當這個視窗增加到了 36×36, 特徵數量就從 3萬多迅速增長到了80多萬。 每一個特徵數量 意味著計算量, 當我們的影像越大, 我們的這個計算量的增長是非常非常的可觀的, 所以我們必須要使用一個非常高效的策略, 能夠快速的計算這個特徵。

積分圖 就是做了這樣的一個貢獻。 只需要遍歷一次影像, 就可以求出影像中的所有區域的畫素。

下面我們看一下積分圖的產生。

如上圖,左邊是一張普通的圖, 右邊是 的積分圖。 積分圖的產生是這樣: 右邊的積分圖的每一個畫素, 它都等於左邊的畫素對應它左上角的一塊矩形區域的值。 所以當我們想得到左邊 影像的任意一個子區域的畫素和 我們只需要用右邊的積分圖的對應的這個子區域的右下角的畫素值減去左上 畫素值 就能得到我們左邊這個影像任意一個矩形區域的畫素和。 而這個畫素和就可以用於計算我們 Haar 的特徵, 因為我們的 Haar 特徵,在前面我們已經講述過了, 無非就是計算了兩個矩陣畫素和的差, 所以我們利用積分圖來計算 Haar 特徵是非常之快速的, 這是一個查表的操作。 只需要透過一次的計算操作, 我們建立了這個積分影像之後, 後面我們就可以利用座標的查表操作, 來得到任意一個區域影像的表徵。

最後,當我們已經選好了特徵, 同時計算出了很多視窗的 haar 特徵之後, 我們就可以利用分類器來對這個特徵進行分類。 首先我們要將多個矩形區域的特徵組合得到一個區分度更大的特徵值, 這也就是整個影像的一個描述。 在得到這樣的一個特徵 向量 之後, 我們就可以利用 Adaboost 分類器來進行分類。 為什麼要選擇 Adaboost 因為 Adaboost 是一個 級聯 的分類器, 包含了非常非常多的弱分類器, 透過這些弱分類器的聯合來得到一個效能非常 魯棒 的分類器, 它的核心思想就是透過多個分類器級聯在一起, 從前到後, 分類器的複雜程度和計算代價逐漸增大。 在這個 級聯 分類器的前一部分, 分類器的效能是比較簡單的, 它的計算代價也比較低, 它可以過濾掉大部分的沒有人臉的區域。 隨著 分類器往後級聯 分類器的複雜程度, 也就是它的表徵能力會得到提升, 然後計算代價也會增加, 所要處理的候選的影像區域也減少了。 所以就能得到一個比較魯棒的檢測, 也就是人臉的檢測。

可以說級聯分類器的思想就是首先透過一些比較弱的分類器迅速過濾掉大部分無效的人臉, 然後一步一步 地對 剩下來的那些影像區域進行更魯 的檢測。 這一方面保證召回率,一方面 保證了 精確度。

最後我們對傳統方法做一個簡單的總結。 傳統方法包括以下幾個特點:

首先, 傳統 方法 的速度非常快。 前面我們可以看到, VJ 演算法 建立 了一個積分影像, 它計算特徵是非常快的。

其次, 傳統方法的召回率不高。 為什麼呢?是因為傳統方法它畢竟使用了一個比較固定的 窗的策略。 所以對於多尺度的人臉它仍然是受限的, 它的召回率並不是很好, 尤其是對於大角度, 對於姿態比較大的人臉, 它的召回率不高。

最後, 定位精度低。 因為傳統的方法, 它沒有定位的操作。 也就是說當我們選擇了一個影像區域塊之後, 我們就利用分類器來對這個影像區域進行分類,分類 是人臉或者不是人臉, 但是在這個 分類 之後 沒有一個定位的操作, 也就是說如果我們選擇了這個影像塊, 它本身就是不準的, 本身就有偏差。 傳統的像 VJ 這樣的方法, 它就無法解決定位的問題。

以上就是我們的傳統方法的一個分享。

免費領取技術大咖分享課,加蜂口V信: fengkou-IT  
感謝您的閱讀,更多精彩請持續關注蜂口微信小程式!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31553577/viewspace-2215201/,如需轉載,請註明出處,否則將追究法律責任。

相關文章