芋出し画像

👀Viola-Jones物䜓怜出フレヌムワヌク

Viola-Jones物䜓怜出フレヌムワヌクは、䞻に顔怜出に䜿甚される高速なオブゞェクト怜出アルゎリズムです。このフレヌムワヌクは、積分画像、Haar-like特城、AdaBoost、カスケヌド分類噚の4぀の䞻芁なコンポヌネントを䜿甚したす。以䞋は、このプロセスを疑䌌コヌドずしお衚したものです。


def viola_jones_detection(image):
    # ステップ 1: 積分画像を蚈算
    integral_image = compute_integral_image(image)
    
    # ステップ 2: 䜿甚するHaar-like特城のセットを遞択
    features = select_haar_features()
    
    # ステップ 3: AdaBoostを䜿甚しお特城を匷化
    classifiers = train_adaboost(features, training_data)
    
    # ステップ 4: 分類噚のカスケヌドを構築
    cascade = build_classifier_cascade(classifiers)
    
    # 怜出プロセス
    detected_objects = []
    for (x, y, window_size) in sliding_window(image):
        window_integral = compute_window_integral(integral_image, x, y, window_size)
        if cascade_classify(cascade, window_integral):
            detected_objects.append((x, y, window_size))
    
    return detected_objects

def compute_integral_image(image):
    # 積分画像を蚈算する関数 (前の説明を参照)
    pass

def select_haar_features():
    # Haar-like特城のセットを遞択する
    # このステップでは、顔怜出に有甚な特城のタむプやサむズを定矩したす。
    pass

def train_adaboost(features, training_data):
    # AdaBoostアルゎリズムを䜿甚しお匱分類噚を蚓緎し、それらを組み合わせお匷分類噚を䜜成
    pass

def build_classifier_cascade(classifiers):
    # 分類噚のカスケヌドを構築。各段階では、前の段階を通過したりィンドりのみが次の段階に進む
    pass

def sliding_window(image):
    # 画像䞊を移動するスラむディングりィンドりを生成するむテレヌタ
    # この関数は、怜査するりィンドりの䜍眮ずサむズを返す
    pass

def compute_window_integral(integral_image, x, y, window_size):
    # 指定されたりィンドりの積分画像を蚈算
    pass

def cascade_classify(cascade, window_integral):
    # 䞎えられたりィンドりに察しおカスケヌド分類噚を適甚し、物䜓が存圚するかどうかを刀断
    pass


Viola-Jones物䜓怜出フレヌムワヌクは、Paul ViolaずMichael Jonesによっお2001幎に提唱された機械孊習による物䜓怜出フレヌムワヌクである。䞻に顔怜出の問題に動機づけられおいる。

このアルゎリズムは、埓来の700MHz Intel Pentium IIIで、384×288ピクセルの画像から15フレヌム/秒で顔を怜出するこずができ、時間に察しお効率的である。たたロバストであり、高い粟床ず再珟率を達成しおいる。

畳み蟌みニュヌラルネットワヌクのような最新の手法に比べるず粟床は劣るが、その効率性ずコンパクトなサむズDeepFaceのような兞型的なCNNの数癟䞇のパラメヌタに比べ、わずか50k皋床のパラメヌタにより、蚈算胜力が限られおいる堎合でも䜿甚される。䟋えば、オリゞナルの論文では、この顔怜出噚はCompaq iPAQ䞊で2fpsで実行できるず報告されおいるこのデバむスには、浮動小数点ハヌドりェアを持たない䜎消費電力のStrongARMが搭茉されおいる。

CC BY-SA 4.0 File:Haar Feature that looks similar to the eye region which is darker than the upper cheeks is applied onto a face.jpg Created: 1 December 2014

Wikipediaでの解説

Viola–Jonesフレヌムワヌクの䞻な特城ずしお、以䞋の4぀のキヌ技術が挙げられたす。

  1. 積分画像 (Integral Image): 画像内の任意の矩圢領域のピクセル倀の合蚈を高速に蚈算できるデヌタ構造。これにより、特城のスケヌリングず䜍眮の倉曎が容易になり、蚈算速床が倧幅に向䞊したす。

  2. アダブヌスト (AdaBoost) 孊習アルゎリズム: 匱い分類噚単玔な特城に基づく刀断を行う分類噚を組み合わせお、より正確な匷い分類噚を䜜成する孊習アルゎリズム。Viola–Jonesフレヌムワヌクでは、顔怜出に関連する特城を遞択し、非顔ず区別するために䜿甚されたす。

  3. カスケヌド分類噚: 怜出プロセスを耇数の段階に分け、各段階でオブゞェクト䟋えば、顔でないず刀断された領域を排陀するこずにより、蚈算量を削枛したす。最も簡単な特城から始たり、埐々により耇雑な特城を甚いお分析が行われたす。これにより、非顔領域を迅速に排陀し、怜出プロセスの効率を高めるこずができたす。

  4. ハヌル様特城 (Haar-like Features): 画像内の特定の圢状を識別するために䜿甚される、シンプルで効果的な特城。これらは、顔のようなオブゞェクトに特有の明暗のパタヌン䟋えば、目の呚りの暗い領域ず錻の橋の明るい領域を怜出するのに適しおいたす。

Viola–Jonesフレヌムワヌクは、その高速性ず効率性のために、監芖カメラ、画像線集゜フトりェア、およびその他の倚くのアプリケヌションで広く利甚されおいたす。たた、このフレヌムワヌクは顔怜出技術の研究における基瀎ずしおも機胜し、埌続の研究に倧きな圱響を䞎えたした。

Viola-Jonesオブゞェクト怜出フレヌムワヌクではHaar特城量が利甚されおいたす。

Haar特城量は、画像内の特定の圢状やパタヌンを識別するために蚭蚈された、シンプルながらも匷力な特城量です。これらの特城量は、画像の明るさの倉化を利甚しお、䟋えば顔の構造のようなオブゞェクトの特性を捉えたす。

Haar特城量は、矩圢領域内のピクセル倀の差を蚈算するこずに基づいおいたす。これらの矩圢は画像䞊で様々な䜍眮、サむズ、圢状に調敎され、顔のようなオブゞェクトが持぀兞型的な特城䟋目ず頬の間のコントラストを怜出するのに䜿甚されたす。Haar特城量は、積分画像の抂念を利甚しお高速に蚈算するこずができ、この高速蚈算がリアルタむムのオブゞェクト怜出を可胜にしおいたす。

Haar特城量には䞻に3皮類がありたす

  1. ゚ッゞ特城量: 画像の特定の領域内で明るさが急激に倉化する堎所を怜出したす。これは䟋えば、顔の境界や錻の橋など、゚ッゞや茪郭が明瞭な領域を識別するのに有効です。

  2. ラむン特城量: 明るい領域ず暗い領域が亀互に珟れるパタヌンを怜出したす。これは、顔の特定の郚分、䟋えば目の䞋の圱など、现かい線状のパタヌンを識別するのに適しおいたす。

  3. 四角特城量: 4぀の隣接する矩圢領域のうち、察角線䞊に䜍眮する2぀の領域が明るく、残りの2぀が暗いずいうパタヌンを怜出したす。これは、より耇雑な圢状やテクスチャの識別に圹立ちたす。

これらの特城量は、アダブヌスト孊習アルゎリズムによっお遞択され、最も識別力のある特城のみがオブゞェクト顔怜出の最終モデルに組み蟌たれたす。Haar特城量の䜿甚は、Viola-Jonesフレヌムワヌクの効率性ず粟床の䞡方を倧幅に向䞊させおいたす。

Viola-Jonesは基本的にブヌスト特城孊習アルゎリズム

Viola-Jonesは基本的にブヌスト特城孊習アルゎリズムであり、Haar特城分類噚に察しお修正AdaBoostアルゎリズムを実行し、分類噚のシヌケンスを芋぀けるこずによ っお孊習される。Haar特城分類噚は粗いが、非垞に高速な蚈算が可胜であり、修正AdaBoostは倚くの匱い分類噚から匷い分類噚を構築する。

OpenCV

Haar特城ベヌスのカスケヌド分類噚を甚いた物䜓怜出は、2001幎にPaul ViolaずMichael Jonesによっお論文「Rapid Object Detection using a Boosted Cascade of Simple Features」で提案された効果的な物䜓怜出手法である。これは機械孊習ベヌスのアプロヌチで、倚数の正負画像からカスケヌド関数を孊習する。このカスケヌド関数を甚いお、他の画像から物䜓を怜出する。
ここでは顔怜出を扱う。最初に、このアルゎリズムは分類噚を孊習するために、倚くのポゞティブ画像顔の画像ずネガティブ画像顔のない画像を必芁ずしたす。次に、そこから特城を抜出する必芁がありたす。そのために、䞋図に瀺すHaar特城が䜿われたす。これはちょうど畳み蟌みカヌネルのようなものです。各特城は、癜い長方圢の䞋のピクセルの総和ず黒い長方圢の䞋のピクセルの総和を匕くこずで埗られる単䞀の倀です。

https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html

最終的な分類噚は、これらの匱い分類噚の重み付き和です。匱い分類噚ず呌ばれるのは、それだけでは画像を分類できないが、他の分類噚ず䞀緒になるず匷い分類噚になるからである。この論文によれば、200の特城でも95の粟床で怜出が可胜だずいう。圌らの最終的なセットアップには玄6000の特城があった。(想像しおみおほしい。これは倧きな進歩だ。
では、画像を撮圱する。24x24のりィンドりをそれぞれ取る。それに6000の特城量を適甚する。それが顔かどうかをチェックする。ちょっず非効率的で時間がかかるず思いたせんかそうなんです。著者たちはそれに察しお良い解決策を持っおいる。
画像の倧郚分は非顔領域である。だから、りィンドりが顔領域でないかどうかをチェックする簡単な方法があったほうがいい。もしそうでなければ、䞀発で砎棄し、二床ず凊理しない。その代わりに、顔がありそうな領域に焊点を圓おる。こうするこずで、顔の可胜性がある領域のチェックに時間をかけるこずができる。

https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html

分類噚のカスケヌド

そのために、圌らは分類噚のカスケヌドずいう抂念を導入した。1぀のりィンドりに6000の特城量をすべお適甚するのではなく、特城量を異なる段階の分類噚にグルヌプ化し、1぀ず぀適甚する。(通垞、最初の数ステヌゞは非垞に少ない特城しか含たない。もしりィンドりが最初のステヌゞで倱敗したら、それを砎棄する。残りの特城は考慮しない。合栌したら、第2段階の特城を適甚し、凊理を続ける。すべおの段階を通過したりィンドりが顔領域ずなる。その蚈画はどうなっおいるのか
著者の怜出噚には6000以䞊の特城があり、最初の5段階で1、10、25、25、50の特城を持぀38段階があった。(䞊の画像の2぀の特城は、実際にはAdaboostのベスト2特城ずしお埗られたものである。著者によれば、6000以䞊の特城量のうち、平均しお10個の特城量がサブりィンドりごずに評䟡される。
これが、Viola-Jones顔怜出の仕組みの盎感的な説明です。詳しくは論文を読むか、远加リ゜ヌスセクションの参考文献をご芧ください。


カスケヌド分類期のむメヌゞ 「カスケヌドする」ずは、「䜕かが連なっおいる状態」、「連続しお起こっおいる状態」などを意味する衚珟である。 「cascade」には「階段状に連続しおいるもの」や「瞊぀なぎ」などの意味があるため、そういった状態にするこず、そういった状態のものを「カスケヌドする」、「カスケヌドしおいる」などず衚珟するこずがある。

積分画像(Integral Image)たたは面積和衚

def compute_integral_image(image):
    import numpy as np
    
    integral_image = np.zeros_like(image, dtype=np.int32)
    
    integral_image[0, 0] = image[0, 0]
    for x in range(1, image.shape[1]):
        integral_image[0, x] = integral_image[0, x-1] + image[0, x]
    for y in range(1, image.shape[0]):
        integral_image[y, 0] = integral_image[y-1, 0] + image[y, 0]
    
    for y in range(1, image.shape[0]):
        for x in range(1, image.shape[1]):
            integral_image[y, x] = (image[y, x] + 
                                    integral_image[y-1, x] + 
                                    integral_image[y, x-1] - 
                                    integral_image[y-1, x-1])
    
    return integral_image

# 入力画像
image = np.array([[10, 20, 30], 
                  [40, 50, 60], 
                  [70, 80, 90]])

# 積分画像の蚈算
integral_image = compute_integral_image(image)

array([[ 10, 30, 60],
[ 50, 120, 210],
[120, 270, 450]], dtype=int32)

この積分画像では、各芁玠がその䜍眮に察応する矩圢領域のピクセル倀の総和を衚しおいたす。たずえば、䞀番右䞋の芁玠450は、画像党䜓のピクセル倀の合蚈を瀺しおいたす。

面積和衚は、グリッドの矩圢郚分集合の倀の和を迅速か぀効率的に生成するためのデヌタ構造およびアルゎリズムである。画像凊理の分野では、積分画像ずしおも知られおいる。1984幎にフランク・クロりがミップマップで䜿甚するためにコンピュヌタグラフィックスに導入した。コンピュヌタビゞョンでは、Lewis[1]によっお普及し、その埌「積分画像」ずいう名前が䞎えられ、2001幎にViola-Jonesの物䜓怜出フレヌムワヌクで顕著に䜿甚された。歎史的には、この原理は倚次元確率分垃関数の研究、すなわち、それぞれの环積分垃関数から2次元たたはND確率確率分垃䞋面積を蚈算する際に非垞によく知られおいる。

https://en.wikipedia.org/wiki/Summed-area_table

お願い臎したす