SORU
10 Kasım 2009, Salı


Viola-Jones' Yüz Tanıma iddiaları 180k özellikleri

Viola-Jones' face detection algorithm bir adaptasyon yapmaktayım. Tekniği her boyutu ile olası bir görüntü içinde 24x24 piksel salıncak yerleştirerek, ve daha sonra her pozisyonda içine dikdörtgen özellikleri yerleştirerek dayanır.

Bu özellikler, iki, üç veya dört dikdörtgenler oluşur. Aşağıdaki örnek sunulmuştur.

Rectangle features

Geniş set 180k fazla (bölüm 2) iddia:

Dedektör tabanı, kararın verildiği 24x24, dikdörtgen özellikleri kapsamlı bir kümesi oldukça büyük, 180,000 . Saç temelinde, dikdörtgen kümesi aksine unutmayın özellikleri overcomplete.

Aşağıdaki ifadeleri açıkça kağıt belirtilmemiş, benim varsayımlar böylece:

  1. İki dikdörtgen, 2 üç-dikdörtgen Özellikleri 1 Dört-dikdörtgen özellikleri sadece 2 özelliği var. Bunun arkasındaki mantık izliyoruzfarkvurgulanan dikdörtgenler, açıkça bu tür renk veya parlaklık veya herhangi bir şey arasında.
  2. Tanımlama özelliği türü Bir 1x1 piksel blok olarak veremeyiz; en azından en az 1x2 piksel olmalı. Ayrıca, D tipi en az 2x2 piksel olması gerekir, ve bu kural buna göre diğer özelliklere sahiptir.
  3. Biz tanımlamak özellik türü gibi bir 1x3 piksel blok olarak orta piksel olamaz bölümlenmiş ve çıkarma ondan kendisi aynı bir 1x2 piksel blok; bu özellik tipi sadece tanımlanmış için bile genişlikleri. Ayrıca, özellik C tipi genişliği 3, ve bu kurala göre diğer özelliklerine tutar ile bölünebilir olmalıdır.
  4. 0 genişlik ve/veya yükseklik ile bir özellik tanımlamak edemeyiz. Bu nedenle, yinelemexvey24 eksi özelliği boyutu.

Bu varsayımlara dayalı olarak, geniş set saydım:

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  ;
                }
            }
        }
    }
}

Sonucudur162,336.

Yaklaşık için bulduğum tek yolu "üzerinde 180,000" Viola & söz, efsane 4 ve Tanıtma böcekler düşüyor kodu Jones. Bu sırasıyla dört satır değiştirme içerir:

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

Sonuç180,625. (Bu etkili şimdiye kadar salıncak sağ ve/veya alt dokunmadan gelen özellikleri engelleyecektir unutmayın.)

Tabii şimdi soru şu: kendi uygulamasında bir hata mı yaptılar? Herhangi bir anlamda sıfır bir yüzey özelliklerini dikkate almak mantıklı mıdır? Ya yanlış görüyorum?

CEVAP
10 Kasım 2009, Salı


Daha yakından bakmak üzerine, kodunuz orijinal yazarlar, off-by-one bir hata olup olmadığını düşündürüyor bana doğru görünüyor;. Birisi OpenCV nasıl bunu uygulayan bak yeter herhalde!

Yine de, daha kolay anlamak için yapmak için bir öneri sırasını ters çevirmek içiniçinilk, o zaman boyutu göz önüne alındığında Olası yerleri döngü içinde: tüm boyutları üzerinde giderek döngüler

#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;
}

önceki gibi aynı sonuçları 162336 ile


Bunu doğrulamak için, 4x4 bir pencere olması durumunda test ettim ve el ile tüm vakaların kontrol 1x2/2 x 1 ve 1x3/3x1 şekiller beri saymak kolay, sadece 90 aynı derece döndürülmüş ():

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bucky Roberts

    Bucky Robert

    9 HAZİRAN 2011
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011