在過去十幾年的探索過程中,涌現出的特征不勝枚舉,這里只選取了部分比較有代表性和反映了人們探索思路的特征進行舉例。這里所有列舉的特征都有一個共同的特點:都由科研工作者根據自己的經驗手工設計,這些特征的設計反映了人們對問題的理解和思考。雖然隨著不斷的改進,設計出的特征已經日臻完善,但直到現在,人們在特征上的探索還遠沒有結束。
分類器及其學習方法的改進
分類器能力的強弱直接決定了分類準確度的高低,而分類的計算代價是影響檢測速度的一個關鍵因素,因此,人們探索的另一個方向就是對分類器及其學習方法的改進。
采用AdaBoost方法由弱分類器構建強分類器,這是一個順序執行的過程,換言之,一旦一個弱分類器被選中,其就必定會成為強分類器的組成部分,不允許反悔,這其實是假設增加弱分類器一定會使得強分類器的分類準確度更高,但是,這個假設并不總是成立。事實上,每次對弱分類器的選擇只是依照當時的情況決定,而隨著新的弱分類器被增加進來,從整體上來看,之前的選擇未必最優。基于這樣的想法,出現了允許回溯的FloatBoost方法。FloatBoost方法在選擇新的弱分類器的同時,也會重新考查原有的弱分類器,如果去掉某個弱分類器之后強分類器的分類準確度得到了提升,那說明這個弱分類器帶來了負面影響,應該被剔除。
VJ人臉檢測器中,相級聯的多個分類器在學習的過程中并不會產生直接的聯系,其關聯僅體現在訓練樣例上:后一級分類器的訓練樣例一定要先通過前一級分類器。不同分類器在學習時的獨立性會帶來兩方面的壞處:一是在每個分類器都是從頭開始學習,不能借鑒之前已經學習好的分類器的經驗;二是每個分類器在分類時都只能依靠自己,不能利用其它分類器已經獲得的信息。為此,出現了兩種改進的方案:鏈式Boosting方法和嵌套式Boosting方法。兩種方案都在學習新一級的分類器時,都考慮之前已經學好的分類器,區別在于鏈式Boosting方法直接將前面各級分類器的輸出進行累加,作為基礎得分,新分類器的輸出則作為附加得分,換言之,前面各級分類器實際上是新分類器的一個“前綴”,所有的分類器通過這種方式鏈在了一起;嵌套式Boosting方法則直接將前一級分類器的輸出作為新分類器第一個弱分類器的特征,形成一種嵌套的關系,其特點是只有相鄰的分類器才會互相影響。還有一種和嵌套式Boosting方法相類似的方案:特征繼承,即從特征而不是分類器的角度來關聯不同的分類器,具體而言,新的分類器在學習時會先繼承前一級分類器的所有特征,基于這些特征學習弱分類器,再此基礎上再考慮增加新的弱分類器,這一方案的特點在于其只引入了分類器學習時的相互影響,而在分類時分類器之間仍然是相互獨立的。
相關的任務之間往往會相互產生促進作用,相輔相成,而和人臉檢測密切相關的一個任務就是特征點定位:預測臉部關鍵點的位置,這些關鍵點可以是雙眼中心、鼻尖、嘴角等。基于這樣一種想法,在2014年出現了Joint Cascade,即把檢測人臉所需要的分類器和預測特征點位置的回歸器交替級聯,同時進行人臉檢測和特征點定位兩個任務。用特征點定位輔助人臉檢測的關鍵在于形狀索引特征的引入,即特征不再是在整個窗口中提取,而是在以各個特征點為中心的局部區域進行提取,這樣的好處就在于提高了特征的語義一致性。不同的人臉其對應的特征點位置是不同的,反過來看,也就是說相同的位置實際上對應于臉部的不同區域,那么在相同區域提取的特征實際上表示的是不同的語義,簡單地說,就是在拿鼻子去和嘴巴匹配。采用形狀索引特征可以很好地避免這個問題,從而增大人臉和非人臉窗口之間的區分性。對于一個給定的窗口,我們并不知道特征點的位置,因此采用一個“平均位置”作為初始位置,即基于標注有特征點坐標的人臉樣例集,計算出的每個點坐標的平均值;在平均位置的基礎上,我們提取特征預測各個特征點真實的位置,不過一次預測往往是不準確的,就好像跑步的時候我們沒法直接從起點跳到終點一樣,所以需要不斷基于當前確定的特征點位置來預測新的位置,逐步向其真實的位置靠近。這個過程很自然地形成了一種級聯結構,從而能夠和人臉檢測器耦合在一起,形成一種不同模型交替級聯的形式。
針對分類器學習過程中的每一個環節,人們都進行了細致而充分的探索,除了上面提到的幾個方向,在分類器分類閾值的學習、提升分類器學習的速度等問題上,也出現了很多出色的研究工作。大部分在分類器及其學習方法上進行改進的工作關注的還是Boosting方法(AdaBoost方法是Boosting方法的一個杰出代表)和相對簡單的分類器形式,如果能夠引入具有更強分類能力的分類器,相信能給檢測器帶來進一步的性能提升,這一點在后文會有所涉及。
級聯結構的演化
分類器的組織結構也是人們關心的一個重要問題,尤其是在面臨多姿態人臉檢測任務的時候。人臉的姿態是指人臉在三維空間中繞三個坐標軸旋轉的角度,而多姿態人臉檢測就是要將帶旋轉的人臉給檢測出來,不管是斜著的(繞x軸旋轉)、仰著的(繞y軸旋轉)還是側著的(繞z軸旋轉)。不同姿態的人臉在表觀特征上存在很大的差異,這給檢測器帶來了非常大的挑戰,為了解決這一問題,通常采用分治的策略,即分別針對不同姿態的人臉單獨訓練分類器,然后組合起來構建成多姿態人臉檢測器。
最簡單的多姿態人臉檢測器就是將針對不同姿態人臉的分類器采用并列式的結構進行組織,其中并列的每一個分類器仍然采用原來的級聯結構(我們稱這種分類器為級聯分類器);在檢測人臉的過程中,一個窗口如果被其中一個級聯分類器分為人臉窗口,則認為其確實是一個人臉窗口,而只有當每一個級聯分類器都將其判別為非人臉窗口時,才將其排除掉。這種并列式的組織架構存在兩方面的缺陷:一是造成了檢測時間的成倍增長,因為絕大部分窗口是非人臉窗口,這些窗口需要經過每一個級聯分類器的排除;二是容易造成整體分類準確度的降低,因為整個檢測器分錯的窗口包含的是所有級聯分類器分錯的窗口。
有人設計了一種金字塔式的級聯結構,金字塔的每一層對應于對人臉姿態(旋轉角度)的一個劃分,從頂層到底層劃分越來越細,級聯的每個分類器只負責區分非人臉和某個角度范圍內的人臉。對于一個待分類的窗口,從最頂層的分類器開始對其進行分類,如果其被分為人臉窗口,則送入到下一層的第一個分類器繼續進行分類,如果其被分為非人臉窗口,則送入到同一層的下一個分類器繼續進行分類,當在某一層上所有的分類器都將其分為非人臉窗口時,就確認其為非人臉窗口,將其排除。金字塔式的級聯結構也可以看成是一種特殊的并列式結構,只不過每個級聯分類器相互之間有共享的部分,這樣最直接的好處就在于減少了計算量,共享的部分只需要計算一次,同時在底層又保留了分治策略所帶來的好處——子問題比原問題更加容易,因此更容易學習到分類準確度更高的分類器。