1. 程式人生 > >經典計算機視覺論文筆記——《Robust Real-Time Face Detection》

經典計算機視覺論文筆記——《Robust Real-Time Face Detection》

        第一次讀這篇傳奇之作大概是九年前了,也就是2007年,而那時距論文正式發表(2004年)也已經有四年之久了。現在讀來,一些想法,在深度學習大行其道的今天仍然具有借鑑意義,讓人敬佩不已。

        VJ人臉檢測器應該是歷史上第一個成功商業應用的實時人臉檢測器。我估計現在相機和手機上的人臉檢測演算法絕大部分還是VJ或VJ演算法的徒子徒孫。OpenCV當年也是憑藉VJ演算法的整合而一炮走紅,到現在還是最主流的計算機視覺演算法庫。本人在真實環境下親測,2010年後的許多能在FDDB測評主頁上露個臉的開源演算法,其實效果都不見得會比VJ演算法好多少。

演算法創新點
創新點 作用
積分圖

加速haar特徵計算的巧妙點子。一勞永逸,去掉特徵計算中的冗餘。

AdaBoost人臉檢測器

特徵選擇+分類器融合。對adaboost的思想進行合理改造,一個haar特徵對應一個弱分類器,弱特徵組合成強特徵,弱分類器組合成強分類器。

級聯結構

由粗到精的檢測策略,加速的同時又能保證精度。先在前期用快速演算法把大量非人臉去掉,平衡後期慢速的更精細分類開銷。

一些值得反思的細節

  • AdaBoost演算法是1995年提出的,這篇論文正式發表是在2004年。如此經典的boosting思想怎麼沒早一點被人發揚?
  • 實驗環境:384*288解析度,700MHz Pentium3,15幀每秒。現在主流攝像頭解析度是640*480,但硬體計算能力要遠遠超越當時,24幀每秒毫無壓力。
  • 一幅影象上非人臉窗口占絕大多數,自然會想到先快速把大量非人臉幹掉的cascade的策略。
  • Haar特徵只是三種特徵(左右和上下矩形相減算一種),表達能力有限。但由於多比例伸縮、平移,構成了一個龐大的特徵集合,表達能力爆表。
  • 在檢測不同大小的人臉時,沒有采用金字塔策略,而是直接用不同尺度的人臉檢測器在同一幅影象上掃。作者認為生成金字塔太慢。但除了24*24尺度的,其它尺度的檢測器的cascade細節幾乎沒有介紹。不知道是不是我搞錯了?
  • 24*24的影象上,全部的Haar特徵有160000個!最後cascade選擇出來的一共有6060個特徵。
  • 積分圖的計算也是非常快的,從左上角開始遞迴計算,沒有冗餘。
  • AdaBoost演算法的目標是擬合訓練集。因為單個弱分類器的擬合太差了。但是,如果一個演算法本身對訓練集擬合的就很好了,比如深度學習,就不能看作是一個弱分類器,不適合用於AdaBoost框架。
  • 在分類器型別一致的情況下,不同的特徵就代表了不同的分類器。特徵組合和分類器組合就是一回事。
  • AdaBoost的每次迭代,只和前一次的迭代結果有關。
  • cascade共包含38個AdaBoost分類器,複雜度逐漸遞增。複雜度的遞增是通過採用的樣本越來越難分、特徵數量越來越多實現的。
  • 檢測出有重疊的人臉時,沒有用目前主流的IOU去重。畢竟年代太古老了。

借鑑之處

  • cascade的思想。許多檢測問題,負類會在樣本中佔絕大多數比重,可以先在保證正類檢測率近100%的情況下,去掉大量負類。再通過更精細的演算法繼續精準分類。
  • 想想演算法中有沒有冗餘計算之處,並加以優化。
  • AdaBoost的生命力長青。參考遷移學習中的TrAdaBoost。
  • 某些情況下,特徵就代表分類器,不需要分得太清。
  • 梯度型別的特徵就是牛逼!參考SIFT,HOG,LBP。