He estado implementando una adaptación del algoritmo de detección de rostros de Viola-Jones . La técnica se basa en colocar un subcuadro de 24x24 píxeles dentro de una imagen y, posteriormente, colocar elementos rectangulares en su interior en todas las posiciones con todos los tamaños posibles.
Estas características pueden constar de dos, tres o cuatro rectángulos. Se presenta el siguiente ejemplo.
Afirman que el conjunto exhaustivo es más de 180k (sección 2):
Dado que la resolución base del detector es 24x24, el conjunto exhaustivo de características rectangulares es bastante grande, más de 180.000. Tenga en cuenta que, a diferencia de la base Haar, el conjunto de características rectangulares está demasiado completo.
Las siguientes declaraciones no se establecen explícitamente en el documento, por lo que son suposiciones de mi parte:
- Solo hay 2 entidades de dos rectángulos, 2 entidades de tres rectángulos y 1 entidad de cuatro rectángulos. La lógica detrás de esto es que estamos observando la diferencia entre los rectángulos resaltados, no explícitamente el color o la luminancia ni nada por el estilo.
- No podemos definir el tipo de característica A como un bloque de píxeles de 1x1; debe tener al menos 1x2 píxeles. Además, el tipo D debe tener al menos 2x2 píxeles, y esta regla se aplica de acuerdo con las otras características.
- No podemos definir el tipo de característica A como un bloque de píxeles de 1x3 ya que el píxel del medio no se puede dividir y restarlo de sí mismo es idéntico a un bloque de píxeles de 1x2; este tipo de característica solo se define para anchos pares. Además, el ancho del tipo de característica C debe ser divisible por 3, y esta regla se aplica de acuerdo con las otras características.
- No podemos definir una característica con una anchura y / o altura de 0. Por lo tanto, iterate X y Y a 24 menos el tamaño de la característica.
Según estas suposiciones, he contado el conjunto exhaustivo:
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++;
}
}
}
}
}
El resultado es 162,336 .
La única forma que encontré para aproximarme a las "más de 180.000" de las que hablan Viola & Jones es descartando la suposición número 4 e introduciendo errores en el código. Esto implica cambiar cuatro líneas respectivamente a:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
El resultado es entonces 180.625 . (Tenga en cuenta que esto evitará que las funciones toquen la parte derecha y / o la parte inferior de la subestructura).
Ahora, por supuesto, la pregunta: ¿se han equivocado en su implementación? ¿Tiene algún sentido considerar entidades con una superficie de cero? ¿O lo estoy viendo de forma incorrecta?