Just My Life & My Work

積分影像 (Integral Image)

人臉偵測使用Haar features來辨別window中的影像是否為人臉特徵,然而以暴力法來做速度實在太慢,為什麼?因為必須掃描整張影像,而且影像裡人臉的特徵除了位置因素,還有大小型態等因素需要考量,勢必得利用特殊計算方法,才能達到現在如數位相機的real-time人臉偵測,於是積分影像 (Integral Image)這個計算方法因應而生!

計算Haar features之前必須將影像灰階化,也就是去除任何彩色資訊,我們只計算感興趣區域的灰階值。

我們可以簡單以上圖說明,從左上點往右下點拉出一個長方形藍色面積,我們把藍色面積裡的灰階值總和紀錄在右下點

上圖為6*3影像示意圖,左圖每個數字代表灰階值,右圖則是積分值

再一個例子:

  •  a = sum(1)
  •  b = sum(1+2)
  •  c = sum(1+3)
  •  d = sum(1+2+3+4)

接著我們想個別計算1、2、3、4區域的積分值該怎麼做呢?

  • Sum(1) = a
  • Sum(2) = b – a
  • Sum(3) = c – a
  • Sum(4) = d + a – b – c

知道只要由四個點的積分值,就可以計算4這個區域的積分值。

以上四個Haar features各需幾個點的積分值計算呢?

  • A, B: 2 rectangles => 6 point
  • C: 3 rectangles => 8 point
  • D: 4 rectangles => 9 point

要計算Integral Image上的任意點的灰階總和,只要從左上點陸續往右下點掃描便能計算出來,採用此方法(dynamic programming)就能快速計算出Integral Image上各點的值,然後應用於Haar features計算。

可以了解到Haar features的運算只需要在積分影像 Integral Image上對應的積分點進行幾次簡單的加法運算,便可以求出特徵差異值,這也就是使用Haar做為特徵計算能如此快速的原因。

特徵差異值計算方式為深色區與淺色區的灰階差值,對於人臉上不同區塊的灰階差值會有不同程度的結果,例如一般而言眼球區域的灰階總和會大於眼皮的灰階總和。

以上說明了Integral Image如何重複利用積分值來計算特徵差異值,進而達到real-time人臉偵測目的!

參考:多媒體系統設計投影片 – Window-based models for generic object detection、中央大學碩論 – Improving Face Recognition Performance。

Comments on: "積分影像 (Integral Image)" (9)

  1. 請問一下!所以說如果要用這個方法達到偵測的效果時,適不適要先把影像轉成灰階去做,才會有比較好的偵測正確率

  2. 您好:
    請問一下 HAAR FEATURE 及 積分影像 一些問題
    1. 我需要偵測人臉,輸入上半身的影像,然後計算整張影像的積分值,接著手動找出人臉的位置??還是說我輸入人臉影像,然後計算整張影像的積分值。

    2. 計算完積分值之後,選擇任意一種HAAR FEATURE 的矩形形狀,還是需要選擇特定的HAAR FEATURE 的矩形形狀,然後接下來每一張影像都是選擇一樣的HAAR FEATURE 的矩形形狀?

    3. HAAR FEATURE好像都是白矩形減灰矩形的積分值,會得到特徵差異值,那請問得到特徵差異值,要做甚麼?

    4. 因為我在研究Robust Real-Time Face Detection這篇paper,並且將這篇paper實現在MATLAB上,而架構主要是積分影像、adaboost及cascade,在積分影像跟adaboost這邊的連接我搞不太懂,因為計算完特徵差異值,我想不到怎麼繼續。

    抱歉,我是菜鳥剛研究人臉偵測這個領域,所以有這麼多問題。
    感謝大大

    • 嗨~菜鳥你好!
      關於你請教的問題十分有趣……
      基本上我是直接使用OpenCV跑人臉偵測,
      有需要的話請參考這一篇:人臉偵測

      1.若你想省些時間,就先使用手動的方式去讓程式跑人臉的區域,來測試看看你所使用的特徵是否符合理想結果,到最後當然就讓程式去跑整張圖,來達到自動偵測人臉的目的!
      2.HAAR FEATURE已經有前人定義好的形狀,我們可以直接拿來使用,當然我們可以選擇所有形狀去跑整張圖。
      3.得到差異值後需要比較一個預設的門檻值,若超過的話表示十分可能是人臉。
      4.Robust Real-Time Face Detection這篇paper我沒有仔細閱讀,你可能要自己去細讀喔!

  3. 您好,不好意思打擾您
    請問一開始輸入一張一人的大頭照後(請問輸入的照片有固定大小嗎)
    他是從左上角往右下角拉出一塊藍色面積計算出灰階值總和
    (請問拉的那塊藍色面積要拉多大呢)

    其中一張圖為 有一半是灰一半是白 請問那是如何產生出來的
    如何讓她在照片中找到人臉上的特徵

    抱歉問題很多 謝謝您

    • 藍色面積需要從左上拉到右下,占整個影像面積,因為我們想要算出所有pixel的積分值。
      你說「有一半是灰一半是白」,這是Haar features,被設計用來判斷區域是否為人眼。
      深色區與淺色區的灰階差值若超過某一門檻值,就可判斷為人眼。你可參考文章中有人臉的示意圖。

  4. […] 跟上次介紹的積分影像 (Integral Image)很像,積分直方圖 (Integral Histogram)有異曲同工之妙,都是dynamic programming的一種計算值的方法,可重複利用過去已算過的值,來獲得未來需要的值,這種DP技巧可以減少相當多的計算量,進而達到加速的目的。 […]

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: