سؤال

لقد تم تنفيذ تكيف خوارزمية اكتشاف الوجه Viola-Jones. وبعد تعتمد هذه التقنية عند وضع إطار فرعي من 24 × 24 بكسل داخل صورة، ووضع ميزات مستطيلة بعد ذلك داخل كل موقف مع كل حجم ممكن.

هذه الميزات يمكن أن تتكون من اثنين أو ثلاثة أو أربع مستطيلات. يتم تقديم المثال التالي.

Rectangle features

يزعمون مجموعة شاملة أكثر من 180 ألف (القسم 2):

بالنظر إلى أن الحل الأساسي للكشف هو 24 × 24، فإن مجموعة شاملة من ميزات المستطيل كبيرة جدا، أكثر من 180،000. لاحظ أنه على عكس HAAR، فإن مجموعة ميزات المستطيل قد تجاوزت.

البيانات التالية غير مذكورة بشكل صريح في الورقة، لذلك فهي افتراضات من جانبي:

  1. لا يوجد سوى 2 ميزات مستطيلتين، وميزات 2 ثلاث مستطيل وميزة واحدة من أربعة مستطيلات. المنطق وراء هذا هو أننا نراقب فرق بين المستطيلات المميزة، وليس بصراحة اللون أو النصوع أو أي شيء من هذا النوع.
  2. لا يمكننا تحديد نوع الميزة ككتلة 1x1 بكسل؛ يجب أن يكون على الأقل على الأقل 1 × 2 بكسل. أيضا، يجب أن يكون النوع D 2 × 2 بكسل على الأقل، وتتحمل هذه القاعدة وفقا للميزات الأخرى.
  3. لا يمكننا تحديد نوع الميزة ككتلة 1 × 3 بكسل حيث لا يمكن تقسيم البكسل الأوسط، وطرحه من نفسه مطابق لحظر 1x2 بكسل؛ يتم تعريف نوع الميزة هذه فقط للحصول على العرض حتى. أيضا، يجب أن تكون عرض نوع الميزة C مقسولا بنسبة 3، وتتحمل هذه القاعدة وفقا للميزات الأخرى.
  4. لا يمكننا تحديد ميزة بعرض و / أو ارتفاع 0. لذلك، فإننا نشدد عاشر و Y. إلى 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.

الطريقة الوحيدة التي وجدتها تقريبية "أكثر من 180،000" VioLa & Jones تتحدث عنها، هو إسقاط افتراض رقم 4 ومن خلال إدخال الأخطاء في التعليمات البرمجية. هذا ينطوي على تغيير أربعة خطوط على التوالي إلى:

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

والنتيجة هي بعد ذلك 180,625. وبعد (لاحظ أن هذا سيمنع بشكل فعال الميزات من لمس الأيمن و / أو أسفل الإطار الفرعي.)

الآن بالطبع السؤال: هل ارتكبوا خطأ في تنفيذهم؟ هل يجعل أي معنى للنظر في الميزات بسطح صفر؟ أو هل أراها بطريقة خاطئة؟

هل كانت مفيدة؟

المحلول

عند نظرة فاحصة، يبدو الكود الخاص بك صحيح بالنسبة لي؛ مما يجعل المرء يتساءل عما إذا كان المؤلفين الأصليين لديهم خطأ خارج واحد. أعتقد أن شخصا ما يجب أن ننظر إلى كيف تنفذ OpenCV!

ومع ذلك، اقتراح واحد لتسهيل فهمه هو قلب ترتيب ل حلقات عن طريق الذهاب إلى جميع الأحجام أولا، ثم حلقت على المواقع المحتملة بالنظر إلى الحجم:

#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 و 1 × 3 و 1 × 1 هي نفسها 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

نصائح أخرى

الكل. لا يزال هناك بعض الارتباك في أوراق فيولا وجونز.

في ورقة CVPR'01 الخاصة بهم، من الواضح أن

"أكثر تحديدا، نستخدم ثلاثةأنواع الميزات. قيمة ميزة مستطيلين هو الفرق بين مجموع البكسل داخل منطقتين مستطيلتين. تتمتع المناطق بنفس الحجم والشكل وأفقيا أو رأسيا مجاورة (انظر الشكل 1). ميزة ثلاث مستطيل يحسب المبلغ في مستطيلتين خارجيين طرح من المبلغ في مستطيل مركز. أخيراً ميزة أربعة مستطيل".

في ورق IJCV'04، يقال بالضبط نفس الشيء. تماما، 4 ميزات. وبعد ولكن بشكل غريب بما فيه الكفاية، ذكروا هذه المرة أن مجموعة ميزة شاملة هي 45396! لا يبدو أن هذا هو النسخة النهائية. حيث أعتقد أن بعض القيود الإضافية قد تم تقديمها هناك، مثل Min_Width، Min_Height، Width / Height نسبة، وحتى الموقف.

لاحظ أن كلا الأوراق قابلة للتنزيل صفحة الويب الخاصة به.

بعد أن لا تقرأ الورقة بأكملها، فإن صياغة اقتباس العصي في وجهي

بالنظر إلى أن الحل الأساسي للكشف هو 24 × 24، فإن مجموعة شاملة من ميزات المستطيل كبيرة جدا، أكثر من 180،000. لاحظ أنه على عكس HAAR، فإن مجموعة ميزات المستطيل قد تجاوزت.

"مجموعة ميزات المستطيل هي overcomplete" مجموعة شاملة "

يبدو لي مثل الإعداد، حيث أتوقع أن تتابع كاتب الورق بشرط لكيفية قيادة مساحة البحث إلى مجموعة أكثر فعالية، على سبيل المثال، تتخلص من الحالات التافهة مثل المستطيلات التي تحتوي على صفر مساحة السطح.

تحرير: أو استخدام نوع من خوارزمية التعلم الآلي، كما تلميحات مجردة في. مجموعة شاملة تعني جميع الاحتمالات، وليس فقط "معقول".

لا يوجد أي ضمان أن أي مؤلف لأي ورقة صحيحة في جميع افتراضاتهم ونتائجهم. إذا كنت تعتقد أن الافتراض رقم 4 صالح، فاحصل على هذا الافتراض، وجرب نظريتك. قد تكون أكثر نجاحا من المؤلفين الأصليين.

مراقبة جيدة جدا، لكنها قد ضمنيا صفرية وسادة إطار 24x24، أو "تجاوز الفضاء" والبدء في استخدام البكسلات الأولى عندما يخرج من الحدود، كما في التحولات الدورانية، أو كما قال بريتون إن قد تعتبر بعض الميزات "ميزات تافهة" ثم تجاهلها مع adaboost.

بالإضافة إلى ذلك، كتبت إصدارات Python و 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 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)

ماتلاب:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top