2011-07-01 11 views
8

Estoy tratando de ejecutar el ejemplo createsamples de la biblioteca OpenCV. Puedo cargar una imagen a la vez y parece funcionar bien. Sin embargo, cuando intento cargar una colección de imágenes obtengo un error de análisis. No estoy seguro de si es algo en mi archivo de colección que no es válido o si me falta algo en otro lugar. A continuación se muestra el formato exacto de mi documento de texto.OpenCV crea ejemplos ejemplo

detalles del documento de texto:

Target1.JPG 1 0 0 1296 1152 
Target2.jpg 1 0 0 1890 709 

Comando llamada de línea:

-info "C:\Users\seb\Desktop\Learning Samples\Target\Target.txt" -num 10 -vec "C:\Users\seb\Desktop\Learning Samples\Target\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20 

Cualquier ayuda es muy apreciada.

+0

¿Podría pasar toda la llamada de línea de comando? – red1ynx

+0

He editado la pregunta para incluir la línea de comando como se especifica. También el archivo de texto está en el mismo directorio que las imágenes. – Seb

Respuesta

7

El error de análisis se debe a que, cuando no se especifica el número de muestras de imagen de punto de venta que desea generar, los createsamples utilizarán el valor predeterminado que es 1000. Pero si su documento de texto de anotación contiene menos de 1000 cuadros de objetos delimitadores, obtendrá el error de análisis. Todavía puede usar el archivo .vec para la cascada de entrenamiento. El único problema es que la información del número es incorrecta. Hay dos formas de arreglarlo.

  1. Cuenta manualmente el número de cuadros delimitadores de objetos en el documento de texto. Y especifique el valor menor o igual que el número para la opción "-num" , p. createsamples -info xxxxx.txt -vec pos.vec -num [value]

  2. Puede revisar OPENCV_ROOT_DIR/modules/haartraining/createsamples.cpp. Cuando no se especifica el -num, establecer el número de muestras de punto de venta como el número de cajas de objeto de delimitación en el documento de texto

fragmento de código: En createsamples.cpp int num = 0;

En cvsamples.cpp

void icvWriteVecHeader(FILE* file, int count, int width, int height) 
{ 
    int vecsize; 
    short tmp; 

    fseek (file , 0 , SEEK_SET); 

    /* number of samples */ 
    fwrite(&count, sizeof(count), 1, file); 
    /* vector size */ 
    vecsize = width * height; 
    fwrite(&vecsize, sizeof(vecsize), 1, file); 
    /* min/max values */ 
    tmp = 0; 
    fwrite(&tmp, sizeof(tmp), 1, file); 
    fwrite(&tmp, sizeof(tmp), 1, file); 

    fseek (file , 0 , SEEK_END); 
} 

int cvCreateTrainingSamplesFromInfo(const char* infoname, const char* vecfilename, 
            int num, 
            int showsamples, 
            int winwidth, int winheight) 
{ 
    char fullname[PATH_MAX]; 
    char* filename; 

    FILE* info; 
    FILE* vec; 
    IplImage* src=0; 
    IplImage* sample; 
    int line; 
    int error; 
    int i; 
    int x, y, width, height; 
    int total; 

    assert(infoname != NULL); 
    assert(vecfilename != NULL); 

    total = 0; 
    if(!icvMkDir(vecfilename)) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to create directory hierarchy: %s\n", vecfilename); 
#endif /* CV_VERBOSE */ 

     return total; 
    } 

    info = fopen(infoname, "r"); 
    if(info == NULL) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to open file: %s\n", infoname); 
#endif /* CV_VERBOSE */ 

     return total; 
    } 

    vec = fopen(vecfilename, "wb"); 
    if(vec == NULL) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to open file: %s\n", vecfilename); 
#endif /* CV_VERBOSE */ 

     fclose(info); 

     return total; 
    } 

    sample = cvCreateImage(cvSize(winwidth, winheight), IPL_DEPTH_8U, 1); 

    icvWriteVecHeader(vec, num, sample->width, sample->height); 

    if(showsamples) 
    { 
     cvNamedWindow("Sample", CV_WINDOW_AUTOSIZE); 
    } 

    strcpy(fullname, infoname); 
    filename = strrchr(fullname, '\\'); 
    if(filename == NULL) 
    { 
     filename = strrchr(fullname, '/'); 
    } 
    if(filename == NULL) 
    { 
     filename = fullname; 
    } 
    else 
    { 
     filename++; 
    } 

    while (num<=0 || total<num) 
    { 
     int count; 

     error = (fscanf(info, "%s %d", filename, &count) != 2); 
     if(!error) 
     { 
      src = cvLoadImage(fullname, 0); 
      error = (src == NULL); 
      if(error) 
      { 

#if CV_VERBOSE 
       fprintf(stderr, "Unable to open image: %s\n", fullname); 
#endif /* CV_VERBOSE */ 
      } 
     } 
     else 
      if (num <= 0) break; 

     for(i = 0; i < count; i++, total++) 
     { 
      error = (fscanf(info, "%d %d %d %d", &x, &y, &width, &height) != 4); 
      if(error) break; 
      cvSetImageROI(src, cvRect(x, y, width, height)); 
      cvResize(src, sample, width >= sample->width && 
         height >= sample->height ? CV_INTER_AREA : CV_INTER_LINEAR); 

      if(showsamples) 
      { 
       cvShowImage("Sample", sample); 
       if(cvWaitKey(0) == 27) 
       { 
        showsamples = 0; 
       } 
      } 
      icvWriteVecSample(vec, sample); 

         if (num > 0 && total >= num) break; 
     } 

     if (num<=0) 
      icvWriteVecHeader(vec, total, sample->width, sample->height); 

     if(src) 
     { 
      cvReleaseImage(&src); 
     } 

     if(error) 
     { 

#if CV_VERBOSE 
      fprintf(stderr, "%s(%d) : parse error", infoname, line); 
#endif /* CV_VERBOSE */ 

      break; 
     } 

     } 

    if(sample) 
    { 
     cvReleaseImage(&sample); 
    } 

    fclose(vec); 
    fclose(info); 

    return total; 
} 
+0

Acabo de volver a esto y decidí modificar el archivo fuente.Gracias por explicarme esto. – Seb

+0

hola Seb, ¿cómo obtuviste los archivos createsamples.exe? Estoy usando opencv 2.2 pero no pude encontrar createSamples.exe u otros archivos .exe necesarios para el entrenamiento del haar – MMH

+0

hola @Yiqun Hu, ¿sabe cuánto tardaría un clasificador en entrenar en 600 imágenes, utilizando haartraining y gentleboost? ¡cualquier idea vaga aproximada sería tremendamente útil! – user961627

0

Target1.JPG - debe ser una ruta relativa a createsamples.exe. No a Target.txt.

que he probado en mi máquina y consiguió estos resultados:

d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release>opencv_createsamples.exe -info "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat" -num 10 -vec "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20 
Info file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat 
Img file name: (NULL) 
Vec file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec 
BG file name: (NULL) 
Num: 10 
BG color: 0 
BG threshold: 0 
Invert: FALSE 
Max intensity deviation: 100 
Max x angle: 0.6 
Max y angle: 0 
Max z angle: 0.3 
Show samples: FALSE 
Width: 20 
Height: 20 
Create training samples from images collection... 
d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat(3) : parse errorDone. **Created 2 samples** 
+0

Entonces, ¿qué necesitaría cambiar el archivo de información de texto o los argumentos de línea de comando? La razón por la que pregunto es que cuando estoy depurando puedo ver que toma la ubicación del archivo txt y lo reemplaza con la ubicación del archivo de imagen. Si trato de hacer la ubicación completa del directorio C, se agrega al nombre completo, en cuyo caso obtengo "C: \ Users \ seb \ Desktop \ Learning_Samples \ Target \ C: \ Users \ seb \ Desktop \ Learning_Samples \ Target \ Target .JPG " – Seb

+0

hi @ red1ynx, pregunta ligeramente fuera de tema, pero aprox. ¿Cuánto tiempo tomaría el entrenamiento en opencv para entrenar un clasificador a partir de 600 imágenes, usando haartraining y gentleboost? alguna idea vaga en absoluto? – user961627

+0

Lo siento @ user961627, no he estado haciendo con opencv durante mucho tiempo. – red1ynx

0

Una de las razones podría ser debido a archivo de información.

/home/minas/imagen/detector de caras positivos/ * .jpg

Asegúrese de que cualquiera del nombre de la carpeta no debe tener espacio en su nombre. como se muestra arriba "imagen del detector facial", este debería ser otro nombre como "imágenes" o cualquier cosa sin espacio en él.

Cambie el nombre de la carpeta a su ruta original como así como en el archivo .info.

¡Salud!

3

Tuve problemas para obtener opencv_createsamples para trabajar en mi máquina de Windows, y simplemente funcionó con éxito. Pensé en publicar los detalles para ayudar a alguien más. Estoy usando opencv 2.4.8 on Windows 7.

Primero, encontré que necesitaba usar el archivo opencv_createsamples.exe en el directorio que figura en mi variable de ruta como OPENCV_DIR. No pude copiar el archivo exe en un lugar más conveniente.

Configuré un subdirectorio text_classifier en este directorio para mis imágenes y mis archivos de texto. He utilizado este comando en la línea de comandos:

F:\Apps\opencv\build\x64\vc10\bin>opencv_createsamples.exe -vec text_classifier\text_binary_desc -info text_classifier\positive_examples.txt -num 146 -w 1350 -h 900 -bg text_classifier\negative_samples.txt

en cuenta que tuviera que lista el número de áreas seleccionadas de las imágenes (-Num 146). También enumeré el ancho y la altura de las muestras positivas.

Dentro de la positive_examples.txt archivo, que necesitaba tener los archivos que aparecen de modo:

text_positives_clean\1839_Boettiger_001.JPG 1 708 35 471 793

En otras palabras, los archivos tuvieron que ser listados en relación con el positive_examples.txt archivo, y no en relación con el archivo exe (opencv_createsamples.exe). Cuando traté enumera los archivos en relación con el exe, tales como:

text_classifier\text_positives_clean\1839_Boettiger_001.JPG 1 708 35 471 793

then I got the error: Unable to open image: text_classifier\text_classifier\text_positives_clean\1839_Boettiger_001.JPG

Entonces me di cuenta de que mi sistema automatizado especial de crear este archivo de alguna manera había perdido la carga de algunos archivos en el directorio, así que había archivos que aparecen en positive_examples .txt que no estaban en el directorio. El exe simplemente se cayó si encontró algo en la lista en positive_examples.txt que no estaba en el directorio. Llené las lagunas en el directorio de la imagen.

Entonces tuve una extraña error: No se puede abrir la imagen: 129

descubrí que había cometido este error:

text_positives_clean\1862_Streckfuss_0006.JPG 1 813 502 382 353 129 46 526 798 682 780 117 67

Qué observa que el número de áreas seleccionadas dicho aquí es 1 (el número justo después de 'JPG'), mientras que el número de áreas seleccionadas es realmente 3? Así que opencv_createsamples.exe intentó abrir lo siguiente que encontró como una imagen, es decir, '129', después de obtener el área seleccionada. Y cayó de nuevo.

Así que cambié el 1 a 3. Luego recibí un error de análisis que realmente me dio un número de línea en mi archivo positive_examples.txt. Fui a esa línea, y se encontró que una de mis entradas no tienen un espacio entre las áreas seleccionadas, tales como:

949 315 157 67131 30 513 806

He arreglado esto, añadiendo el espacio, y finalmente el exe hice todos mis 146 muestras . Yoohoo!

Espero que esto ayude a alguien. :-)