A detecção de rosto da Viola-Jones exige recursos de 180k

Eu tenho implementado uma adaptação deAlgoritmo de detecção de rosto de Viola-Jones. A técnica baseia-se em colocar um subquadro de 24x24 pixels em uma imagem e, posteriormente, colocar recursos retangulares dentro dela em todas as posições, com todos os tamanhos possíveis.

Esses recursos podem consistir em dois, três ou quatro retângulos. O exemplo a seguir é apresentado.

Eles alegam que o conjunto exaustivo é mais de 180k (seção 2):

Dado que a resolução básica do detector é 24x24, o conjunto exaustivo de recursos do retângulo é bastante grande, acima de 180.000. Observe que, diferentemente da base Haar, o conjunto de recursos do retângulo é excessivamente completo.

As seguintes declarações não são explicitamente declaradas no artigo, então são suposições de minha parte:

Existem apenas dois recursos de dois retângulos, dois de três retângulos e um de quatro retângulos. A lógica por trás disso é que estamos observando odiferença entre os retângulos destacados, não explicitamente a cor ou a luminância ou qualquer coisa desse tipo.Não podemos definir o tipo de recurso A como um bloco de pixels de 1x1; deve pelo menos ter pelo menos 1x2 pixels. Além disso, o tipo D deve ter pelo menos 2x2 pixels, e essa regra se mantém de acordo com os outros recursos.Não podemos definir o tipo de recurso A como um bloco de 1x3 pixels, já que o pixel do meio não pode ser particionado, e subtraí-lo de si mesmo é idêntico a um bloco de 1x2 pixel; esse tipo de recurso é definido apenas para larguras uniformes. Além disso, a largura do tipo de recurso C deve ser divisível por 3 e essa regra é mantida de acordo com os outros recursos.Não podemos definir um recurso com largura e / ou altura de 0. Portanto, iteramosx ey para 24 menos o tamanho do recurso.

Com base nessas suposições, contei o conjunto exaustivo:

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

O resultado é162,336.

A única maneira que eu encontrei de aproximar os "mais de 180.000" de que Viola e Jones falam, está descartando a suposição # 4 e introduzindo bugs no código. Isso envolve a alteração de quatro linhas, respectivamente para:

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

O resultado é então180,625. (Observe que isso impedirá efetivamente que os recursos atinjam a direita e / ou a parte inferior do subquadro.)

Agora, claro, a pergunta: eles cometeram um erro em sua implementação? Faz algum sentido considerar recursos com uma superfície de zero? Ou estou vendo o caminho errado?

questionAnswers(5)

yourAnswerToTheQuestion