2009-06-11 9 views
6

En los archivos de cascada de OpenCV, ¿cuáles son los valores "izquierdo" y "derecho", y cómo se refiere esto al valor "umbral"? ¡Gracias!¿Qué significan los valores "izquierdo" y "correcto" en los archivos xml de Haar Cascade?

Sólo como referencia, aquí es la estructura de los archivos:

<haarcascade_frontalface_alt type_id="opencv-haar-classifier"> 
    <size>20 20</size> 
    <stages> 
    <_> 
     <!-- stage 0 --> 
     <trees> 
     <_> 
      <!-- tree 0 --> 
      <_> 
      <!-- root node --> 
      <feature> 
       <rects> 
       <_>3 7 14 4 -1.</_> 
       <_>3 9 14 2 2.</_></rects> 
       <tilted>0</tilted></feature> 
      <threshold>4.0141958743333817e-003</threshold> 
      <left_val>0.0337941907346249</left_val> 
      <right_val>0.8378106951713562</right_val></_></_> 
     <_> 
+0

lo que no left_node1/left_node y medios right_node1/right_node? Lo vi en muchos clasificadores descargados de Internet, pero no puedo entender qué significan. –

Respuesta

2

La "izquierda" y "derecha" se refieren a los valores de gradiente de una forma particular. Estas formas particulares no son específicamente un rectángulo izquierdo y un rectángulo derecho. En cambio, solo se refiere a las secciones de una configuración particular (a veces más de una sección si hay más de 2). Hay un diagrama en el documento de David Haar que ayuda a explicar esto.

Aquí es una representación ASCII (= está lleno, - sin relleno):

==== ==-- =--= 
==== ==-- =--= 
---- ==-- =--= 
---- ==-- =--= 

En general, la nomenclatura es mala convención. En cambio, debería llamarse "degradado superior", "degradado inferior" (2), "degradado a la izquierda", "degradado a la derecha" (2), "degradado a la izquierda", "degradado centro", "degradado inferior" (3), respectivamente. Las formas giradas, de borde y otras se deben nombrar para identificar de manera única las secciones.

0

A mi entender, el artículo original es Detección rápida de objetos utilizando una cascada impulsada de características simples por Paul Viola y Michael Jones. Se basa en características similares a Haar, de ahí el nombre. Sugiero agarrarlo del IEEE website. (Si no tiene una cuenta, comprobar las otras versiones en Google Scholar.)

Los clasificadores se describen también en detección de características faciales utilizando Haar clasificadores (Wilson, Fernández). Puede encontrarlo en el ACM website o en el CSA website.

2

En el código fuente de OpenCV, encontrará cvhaar.cpp que da una idea de cómo funciona Haar Cascade. Desafortunadamente, esto no es esencialmente comentario, ni la documentación ayuda mucho. Aquí está mi entendimiento de cómo funciona.

En la función icvEvalHidHaarClassifier(), la suma se calcula para las características de un solo CvHidHaarTreeNode.

Si esta suma es menor que el umbral, se sigue el nodo "left" y el proceso se repite. De lo contrario, se sigue el nodo "derecho", repitiendo nuevamente. Esto se refleja en la siguiente declaración:

idx = sum < t ? node->left : node->right; 

El bucle se rompe cuando el nodo o "izquierda" "derecho" es un valor negativo. En este caso, la suma ya no se calcula para esta característica, pero el valor de umbral para esa característica se devuelve como resultado del clasificador.

Puse "izquierda" y "derecha" entre comillas porque, como dices, no tienen nada que ver con la posición de la función. En cambio, reflejan la forma en que la cascada "cae": debajo del umbral, la cascada cae a la izquierda, por encima del umbral, cae a la derecha.

Regresemos ahora a la representación de estos nodos.En el XML, verá la representación de los nodos no como índices, sino como valores:

<left_val>0.0337941907346249</left_val> 
<right_val>0.8378106951713562</right_val> 

Estos números están en el nodo hecho nombres de ordenador que son el uso de cvGetFileNodeByName(). No sé exactamente cómo funciona esto dentro de OpenCV, pero ahora espero que al menos tengas una mejor idea de cómo funciona la cascada.

2

Paul, ¿en serio?

creo, que left_val/right_val utilizado como:

sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val) 
+0

Refactorizaron algunas cosas desde mi respuesta, pero es efectivamente lo mismo; cuando la suma de las características baja del umbral, cae a la izquierda; de lo contrario, es correcto. –

Cuestiones relacionadas