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?
fuente
x < size
tiene que ver con el supuesto n. ° 4: quiero que la función permanezca dentro del subtrama, pero que tenga una dimensión de al menos 1x1. En cuanto a si la dimensión de la característica no debe extenderse fuera del bastidor auxiliar, bueno, quizás eso también sea una suposición.x < size - 1
, por lo que no hay ganancia.Respuestas:
Al mirar más de cerca, su código me parece correcto; lo que hace que uno se pregunte si los autores originales tuvieron un error de uno en uno. ¡Supongo que alguien debería ver cómo lo implementa OpenCV!
No obstante, una sugerencia para facilitar la comprensión es cambiar el orden de los bucles for revisando primero todos los tamaños y luego recorriendo las ubicaciones posibles según el tamaño:
con los mismos resultados que el anterior
162336
Para verificarlo, probé el caso de una ventana 4x4 y verifiqué manualmente todos los casos (fácil de contar ya que las formas 1x2 / 2x1 y 1x3 / 3x1 son las mismas solo giradas 90 grados):
fuente
todas. Todavía hay cierta confusión en los artículos de Viola y Jones.
En su documento CVPR'01 se indica claramente que
En el artículo IJCV'04 se dice exactamente lo mismo. En total, 4 características . Pero, curiosamente, esta vez afirmaron que el conjunto de funciones exhaustivo es 45396. Esa no parece ser la versión final. Aquí supongo que se introdujeron algunas restricciones adicionales, como min_width, min_height, relación ancho / alto e incluso posición.
Tenga en cuenta que ambos documentos se pueden descargar en su página web .
fuente
Al no haber leído todo el documento, la redacción de su cita me llama la atención.
"El conjunto de características del rectángulo está demasiado completo" "Conjunto exhaustivo"
Me suena como una trampa, donde espero que el escritor del artículo continúe con una explicación de cómo reducen el espacio de búsqueda a un conjunto más efectivo, por ejemplo, eliminando casos triviales como rectángulos con cero. área de superficie.
editar: o usar algún tipo de algoritmo de aprendizaje automático, como sugiere el resumen. Un conjunto exhaustivo implica todas las posibilidades, no solo las "razonables".
fuente
No hay garantía de que cualquier autor de un artículo sea correcto en todas sus suposiciones y hallazgos. Si cree que el supuesto n. ° 4 es válido, mantenga ese supuesto y pruebe su teoría. Puede tener más éxito que los autores originales.
fuente
Muy buena observación, pero implícitamente podrían poner cero en el marco de 24x24, o "desbordar" y comenzar a usar los primeros píxeles cuando se sale de los límites, como en los cambios de rotación, o como Breton dijo que podrían considerar algunas características como "características triviales". y luego deséchelos con AdaBoost.
Además, escribí versiones de Python y Matlab de su código para poder probar el código yo mismo (más fácil de depurar y seguir para mí) y así los publico aquí si alguien los encuentra útiles en algún momento.
Pitón:
Matlab:
fuente
En su artículo original de 2001, solo afirman que se utilizan tres tipos de características:
también
Dado que cada tipo tiene dos orientaciones, es razonable suponer que utilizan 6 características en total (al menos para el cálculo del número total de características): 2 características de dos rectángulos, 2 características de tres rectángulos y 2 características de cuatro rectángulos. Con esta suposición, hay más de 180.000 funciones:
Si descarta un tipo de características de cuatro rectángulos (que parece ser el caso en su publicación posterior), entonces el número total de características es 162,336.
fuente