Viola-Jonesの顔検出は180kの機能を主張します


84

私はViola-Jonesの顔検出アルゴリズムの適応を実装してきました。この手法は、画像内に24x24ピクセルのサブフレームを配置し、その後、可能な限りすべてのサイズですべての位置に長方形のフィーチャを配置することに依存しています。

これらの機能は、2つ、3つ、または4つの長方形で構成できます。次の例を示します。

長方形の機能

彼らは、網羅的なセットが180kを超えると主張しています(セクション2)。

検出器の基本解像度が24x24であることを考えると、長方形の特徴の網羅的なセットは非常に大きく、180,000を超えます。Haarベースとは異なり、長方形フィーチャのセットは不完全であることに注意してください。

以下の記述は本書に明示的に記載されていないため、私の側の仮定です。

  1. 2つの長方形のフィーチャが2つ、3つの長方形のフィーチャが2つ、4つの長方形のフィーチャが1つだけあります。この背後にある論理は、強調表示された長方形間の違いを観察しているということです。色や輝度などを明示的に観察しているわけではありません。
  2. フィーチャタイプAを1x1ピクセルブロックとして定義することはできません。少なくとも1x2ピクセルである必要があります。また、タイプDは少なくとも2x2ピクセルである必要があり、このルールは他の機能にも適用されます。
  3. 中央のピクセルは分割できないため、フィーチャタイプAを1x3ピクセルブロックとして定義することはできません。それ自体からそれを差し引くことは、1x2ピクセルブロックと同じです。このフィーチャタイプは、偶数の幅に対してのみ定義されます。また、フィーチャタイプCの幅は3で割り切れる必要があり、このルールは他のフィーチャにも適用されます。
  4. 幅や高さが0のフィーチャを定義することはできません。したがって、xyを24からフィーチャのサイズを引いたまで繰り返します。

これらの仮定に基づいて、私は網羅的なセットを数えました:

const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};

int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
    int sizeX = feature[i][0];
    int sizeY = feature[i][1];
    // Each position:
    for (int x = 0; x <= frameSize-sizeX; x++) {
        for (int y = 0; y <= frameSize-sizeY; y++) {
            // Each size fitting within the frameSize:
            for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
                for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
                    count++;
                }
            }
        }
    }
}

結果は162,336です。

Viola&Jonesが話す「180,000以上」を概算するために私が見つけた唯一の方法は、仮定#4を削除し、コードにバグを導入することです。これには、4行をそれぞれ次のように変更することが含まれます。

for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)

その結果、180,625になります。(これにより、フィーチャがサブフレームの右および/または下部に接触するのを効果的に防ぐことができます。)

もちろん、質問です。実装に誤りがありましたか?サーフェスがゼロのフィーチャを検討することは意味がありますか?それとも私はそれを間違った方法で見ていますか?


コードを実行すると、なぜcount = 114829を取得するのですか?
ニキ

x / yループが1から始まるのはなぜですか?x / yはフィーチャー長方形の左上の座標であると仮定します。x / yは0/0から始めるべきではありませんか?
ニキ・

0で始まるか1で終わるx < sizeかは別として、で終わるのは仮定#4と関係があります。フィーチャをサブフレーム内に残したいが、少なくとも1x1の寸法が必要です。フィーチャーの次元がサブフレームの外側に拡張されるべきではないかどうかに関しては、おそらくそれも仮定です。
Paul Lammertsma 2009年

同様に、xを0から開始した場合、まで実行するx < size - 1必要があるため、ゲインはありません。
Paul Lammertsma 2009年

私は無数のforループを実行しました。これは私には間違っているようです。<サイズはxが24になるのを防ぎ、0から始めると0 ... 23になります。幅が1ピクセルの寸法では、長方形がフレームから離れることはありません。
ブルトン

回答:


40

よく見ると、あなたのコードは私には正しいように見えます。これは、元の作者が1つずつバグを持っていたかどうか疑問に思います。私は誰かがOpenCVがそれをどのように実装するかを見るべきだと思います!

それでも、理解しやすくするための1つの提案は、最初にすべてのサイズを調べてから、サイズを指定して可能な場所ループすることにより、forループの順序を逆にすることです。

#include <stdio.h>
int main()
{
    int i, x, y, sizeX, sizeY, width, height, count, c;

    /* All five shape types */
    const int features = 5;
    const int feature[][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
    const int frameSize = 24;

    count = 0;
    /* Each shape */
    for (i = 0; i < features; i++) {
        sizeX = feature[i][0];
        sizeY = feature[i][1];
        printf("%dx%d shapes:\n", sizeX, sizeY);

        /* each size (multiples of basic shapes) */
        for (width = sizeX; width <= frameSize; width+=sizeX) {
            for (height = sizeY; height <= frameSize; height+=sizeY) {
                printf("\tsize: %dx%d => ", width, height);
                c=count;

                /* each possible position given size */
                for (x = 0; x <= frameSize-width; x++) {
                    for (y = 0; y <= frameSize-height; y++) {
                        count++;
                    }
                }
                printf("count: %d\n", count-c);
            }
        }
    }
    printf("%d\n", count);

    return 0;
}

前と同じ結果になります 162336


それを確認するために、4x4ウィンドウのケースをテストし、すべてのケースを手動でチェックしました(1x2 / 2x1と1x3 / 3x1の形状は同じで、90度回転しているだけなので数えやすいです)。

2x1 shapes:
        size: 2x1 => count: 12
        size: 2x2 => count: 9
        size: 2x3 => count: 6
        size: 2x4 => count: 3
        size: 4x1 => count: 4
        size: 4x2 => count: 3
        size: 4x3 => count: 2
        size: 4x4 => count: 1
1x2 shapes:
        size: 1x2 => count: 12             +-----------------------+
        size: 1x4 => count: 4              |     |     |     |     |
        size: 2x2 => count: 9              |     |     |     |     |
        size: 2x4 => count: 3              +-----+-----+-----+-----+
        size: 3x2 => count: 6              |     |     |     |     |
        size: 3x4 => count: 2              |     |     |     |     |
        size: 4x2 => count: 3              +-----+-----+-----+-----+
        size: 4x4 => count: 1              |     |     |     |     |
3x1 shapes:                                |     |     |     |     |
        size: 3x1 => count: 8              +-----+-----+-----+-----+
        size: 3x2 => count: 6              |     |     |     |     |
        size: 3x3 => count: 4              |     |     |     |     |
        size: 3x4 => count: 2              +-----------------------+
1x3 shapes:
        size: 1x3 => count: 8                  Total Count = 136
        size: 2x3 => count: 6
        size: 3x3 => count: 4
        size: 4x3 => count: 2
2x2 shapes:
        size: 2x2 => count: 9
        size: 2x4 => count: 3
        size: 4x2 => count: 3
        size: 4x4 => count: 1

説得力があります。とても説得力があるので、私たちは正しいと確信しています。著者に電子メールを送信して、推論に根本的な誤りがないかどうかを確認しました。忙しい人が応答する時間があるかどうかを確認します。
Paul Lammertsma 2009年

このことは数年前から行われており、それ以来多くの改善が行われたことを覚えておいてください
Amro

25
180kが記載された元の論文は、2001年のコンピュータビジョンとパターン認識に関する会議の議事録からのものです。2003年に受理され、2004年にInternational Journal of Computer Visionに掲載された改訂論文は、p。139(セクション2の終わり):「長方形の完全なセットは非常に大きく、160,000です」。私たちが正しかったようです!
Paul Lammertsma 2009年

3
更新していただきありがとうございます。興味のある方のために、IJCV'04の論文へのリンクを見つけました:lear.inrialpes.fr/people/triggs/student/vj/viola-ijcv04.pdf
Amro

はい、それだけです。180kではなく160k。
Paul Lammertsma 2009年

9

すべて。ビオラとジョーンズの論文にはまだ混乱があります。

彼らのCVPR'01論文では、次のように明確に述べられています。

「より具体的には、3 種類のフィーチャを使用します。2つの長方形のフィーチャの値は、 2つの長方形の領域内のピクセルの合計の差です。領域のサイズと形状は同じで、水平または垂直に隣接しています(図を参照)。 1) 。3つの長方形の特徴は、中央の長方形の合計から差し引かれた2つの外側の長方形内の合計を計算します。最後に4つの長方形の特徴"。

IJCV'04の論文では、まったく同じことが言われています。つまり、全部で4つの機能です。しかし不思議なことに、彼らは今回、網羅的な機能セットは45396であると述べました!これは最終バージョンではないようです。ここでは、min_width、min_height、width / height比、さらには位置など、いくつかの追加の制約が導入されたと思います。

両方の論文が彼のウェブページからダウンロード可能であることに注意してください


3

論文全体を読んでいないので、あなたの引用の言葉遣いが私に突き出ています

検出器の基本解像度が24x24であることを考えると、長方形の特徴の網羅的なセットは非常に大きく、180,000を超えます。Haarベースとは異なり、長方形フィーチャのセットは不完全であることに注意してください。

「長方形の特徴のセットが不完全です」「網羅的なセット」

セットアップのように聞こえます。たとえば、ゼロの長方形などの些細なケースを取り除くことによって、ペーパーライターが検索スペースをより効果的なセットにカリングする方法についての説明をフォローアップすることを期待しています。表面積。

編集:または、抽象的なヒントとして、ある種の機械学習アルゴリズムを使用します。網羅的なセットは、「合理的な」ものだけでなく、すべての可能性を意味します。


「overcomplete」の後に脚注を含める必要があります。「完全な基底は基底要素間に線形依存性がなく、画像空間と同じ数の要素、この場合は576です。18万の機能のフルセットは何倍も過剰です。コンプリート。" サーフェスのない分類子を明示的に削除するのではなく、AdaBoostを使用して、「これらの機能のごく少数を組み合わせて効果的な分類子を形成できる」と判断します。さて、ゼロサーフェスフィーチャはすぐに削除されますが、そもそもなぜそれらを検討するのでしょうか。
Paul Lammertsma 2009年

まあそれは誰かが本当に集合論に推論しているように聞こえます。
ブルトン

私は同意します、網羅的なセットはすべての可能性を意味します。ただし、xに1〜24を使用し、幅がx未満の場合、フィーチャはサブフレームの外側に1ピクセル拡張されることを考慮してください。
Paul Lammertsma 2009年

コードに「オフバイワン」のバグがたくさんないことを確認しますか?よく見てみましたが、forループを書く面白い方法があります。
ブルトン

私はそれを修飾する必要があります-私はそれを少し考えました、そしてあなたが高さ1ピクセル、高さ2ピクセル、高さ3ピクセル、そして高さ24ピクセルまでの長方形を持っているなら、あなたは24種類の長方形を持っています、すべてこれは24ピクセルの高さのサブフレームに収まります。何が張り出しているのですか?
ブルトン

2

論文の著者がすべての仮定と発見において正しいという保証はありません。仮定#4が有効であると思われる場合は、その仮定を維持し、理論を試してください。あなたは元の作者よりも成功するかもしれません。


実験は、それが一見まったく同じように機能することを示しています。AdaBoostは、最初のサイクルでこれらの追加のゼロサーフェス機能を削除するだけだと思いますが、実際にはこれを調べていません。
Paul Lammertsma 2009年

ビオラとジョーンズは、コンピュータビジョンで非常に有名です。実際、この特定の論文は独創的であると考えられています。誰もが間違いを犯しますが、この特定のアルゴリズムは非常にうまく機能することが証明されています。
ディマ

1
間違いなく、私は彼らの方法をまったく疑っていません。それは効率的で非常にうまく機能します!理論は正しいですが、検出器を誤って1ピクセル短くトリミングし、不要なゼロサーフェス機能を含めた可能性があると思います。そうでない場合は、180kの機能をデモンストレーションするように挑戦します!
Paul Lammertsma 2009年

事実は誰もが人間であるということです。誰でも間違いはある。ビッグネームが間違いを犯すと、人々は受け取った知恵に疑問を抱くのを恐れて、何世代にもわたって隠されてしまうことがよくあります。しかし、真の科学は、科学的方法に従い、名前がどんなに大きくても、誰も崇拝しません。それが科学であるならば、単なる人間が努力を注ぎ、それがどのように機能するかを理解し、彼らの状況に適応させることができます。
マイケルディロン

わかります。著者にメールを送りました。
Paul Lammertsma 2009年

1

非常に良い観察ですが、回転シフトのように、またはブルトンがいくつかの機能を「些細な機能」と見なす可能性があると述べたように、24x24フレーム、つまり「オーバーフロー」を暗黙的にゼロパッドし、範囲外になると最初のピクセルの使用を開始する可能性がありますその後、AdaBoostでそれらを破棄します。

さらに、PythonバージョンとMatlabバージョンのコードを作成して、自分でコードをテストできるようにしました(デバッグとフォローが簡単です)。そのため、誰かがいつか役立つと思ったら、ここに投稿します。

Python:

frameSize = 24;
features = 5;
# All five feature types:
feature = [[2,1], [1,2], [3,1], [1,3], [2,2]]

count = 0;
# Each feature:
for i in range(features):
    sizeX = feature[i][0]
    sizeY = feature[i][1]
    # Each position:
    for x in range(frameSize-sizeX+1):
        for y in range(frameSize-sizeY+1):
            # Each size fitting within the frameSize:
            for width in range(sizeX,frameSize-x+1,sizeX):
                for height in range(sizeY,frameSize-y+1,sizeY):
                    count=count+1
print (count)

Matlab:

frameSize = 24;
features = 5;
% All five feature types:
feature = [[2,1]; [1,2]; [3,1]; [1,3]; [2,2]];

count = 0;
% Each feature:
for ii = 1:features
    sizeX = feature(ii,1);
    sizeY = feature(ii,2);
    % Each position:
    for x = 0:frameSize-sizeX
        for y = 0:frameSize-sizeY
            % Each size fitting within the frameSize:
            for width = sizeX:sizeX:frameSize-x
                for height = sizeY:sizeY:frameSize-y
                    count=count+1;
                end
            end
        end
    end
end

display(count)

なぜ5つの機能を使用するのですか?メインの質問には4つしか投稿されていません。しかし、とにかくPythonバージョンをありがとう。
Kasparov92

0

彼らの元の2001年の論文では、3種類の機能が使用されているとだけ述べています。

3種類の機能を使用しています

また

領域のサイズと形状は同じです

それぞれの種類には2つの方向があるため、(少なくともフィーチャの総数の計算では)合計6つのフィーチャを使用すると想定するのが妥当です。2つの2つの長方形のフィーチャ、2つの3つの長方形のフィーチャ、2つの4つの長方形のフィーチャです。この仮定では、実際に180,000を超える機能があります。

feature_types = [(1,2), (2,1), (1,3), (3,1), (2,2), (2,2)]
window_size = (24,24)

total_features = 0
for f_type in feature_types:
    for f_height in range(f_type[0], window_size[0] + 1, f_type[0]):
        for f_width in range(f_type[1], window_size[1] + 1, f_type[1]):
            total_features += (window_size[0] - f_height + 1) * (window_size[1] - f_width + 1)
            
print(total_features)
# 183072

4つの長方形のタイプの特徴を1つドロップすると(後の出版物に当てはまるようです)、特徴の総数は162,336になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.