Пример в формате OpenCV createsamples

Я пытаюсь запустить createsamples пример из библиотеки OpenCV. Я могу загружать по одному изображению за раз, и, похоже, он работает нормально. Однако, когда я пытаюсь загрузить в коллекцию изображений, я получаю ошибку разбора. Я не уверен, что это что-то в моем файле коллекции, которое недействительно или если я чего-то не хватает в другом месте. Ниже приведен точный формат моего текстового документа.

текстовый документ детали:

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

вызов командной строки:

-info "C:UserssebDesktopLearning SamplesTargetTarget.txt" -num 10 -vec "C:UserssebDesktopLearning SamplesTargetTarget.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20

любая помощь очень признателен.

4 ответов


ошибка синтаксического анализа заключается в том, что если не указать количество образцов POS-изображений, которые вы хотите создать, createsamples будет использовать значение по умолчанию, равное 1000. Но если текстовый документ аннотации содержит менее 1000 ограничивающих полей объектов, вы получите ошибку синтаксического анализа. Вы все еще можете использовать .файл vec для каскада обучения. Единственная проблема заключается в том, что информация о номер неправильный. Есть два способа исправить это.

  1. вы вручную подсчитываете количество ограничивающих полей объекта в текстовом документе. И укажите значение, меньшее или равное номеру для опции " - num" например, createsamples-info xxxxx.txt-vec pos.vec-num [значение]

  2. вы можете пересмотреть OPENCV_ROOT_DIR / modules/haartraining / createsamples.СРР. Если параметр-num не указан, задайте число выборок pos как число ограничивающих полей объекта в текстовом документе

фрагмент кода : В createsamples.СРР инт Нум = 0;

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

Я изо всех сил пытался достать opencv_createsamples для работы на моей машине windows, и он просто работал успешно. Я думал, что опубликую детали, чтобы помочь кому-то еще. Я использую opencv 2.4.8 on Windows 7.

во-первых, я обнаружил, что мне нужно использовать opencv_createsamples.exe файл в каталоге, который указан в моей переменной path как OPENCV_DIR. Я не мог скопировать exe файл в более удобное место.

Я создал подкаталог text_classifier в этом каталоге для моих изображений и моих текстовых файлов. Я использовал это команда в командной строке:

F:\Apps\opencv\build\x64\vc10\bin > opencv_createsamples.exe-vec text_classifier\text_binary_desc-информация text_classifier\positive_examples.txt-num 146-w 1350-h 900-bg text_classifier\negative_samples.txt

обратите внимание, что мне пришлось перечислить количество выбранных областей на изображениях (-num 146). Я также перечислил ширину и высоту положительных образцов.

внутри файла positive_examples.txt, I необходимо иметь файлы, перечисленные так:

text_positives_clean\1839_Boettiger_001.JPG 1 708 35 471 793

другими словами, файлы должны были быть перечислены относительно файла positive_examples.txt, а не относительно exe-файла (opencv_createsamples.исполняемый.) Когда я попытался перечислить файлы относительно exe, такие как:

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

затем я получена ошибка: невозможно открыть изображение: text_classifier\text_classifier\text_positives_clean\1839_Boettiger_001.Формат JPG

затем я заметил, что моя специальная автоматизированная система создания этого файла каким-то образом пропустила загрузку некоторых файлов в каталог, поэтому были файлы, перечисленные в positive_examples.txt, которых не было в каталоге. Exe просто упал, если он нашел что-то, перечисленное в positive_examples.txt, которого не было в каталоге. Я заполнил пробелы в изображении справочник.

затем я получил странную ошибку: не удалось открыть изображение: 129

я обнаружил, что совершил эту ошибку:

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

вы заметили, что количество выбранных областей, указанных здесь, равно 1 (число только после "JPG"), в то время как количество выбранных областей действительно 3? Так opencv_createsamples.exe попытался открыть следующий вещь, которую он нашел как изображение, т. е. "129", после получения одной выбранной области. И она снова упала.

Я поменял 1 к 3. Затем я получил ошибку разбора, которая фактически дала мне номер строки в моих positive_examples.txt-файл. Я пошел к этой строке и обнаружил, что одна из моих записей не имеет пространства между выбранными областями, например:

949 315 157 67131 30 513 806

я исправил это, добавив пространство, и, наконец, exe сделал все мои 146 образцов. Юху!

надеюсь, это кому-то поможет. :-)


Target1.JPG - это должен быть относительный путь к createsamples.исполняемый. Не целиться.формат txt.

я протестировал его на своей машине и получил такие результаты:

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**

одна из причин может быть из-за файла info.

/ home / mine / Face detector image / позитивы/*.формат JPG

убедитесь, что в имени папки не должно быть места. как показано выше "изображение детектора лица", это должно быть какое-то другое имя, например" изображения " или любая вещь без пространства в нем.

переименуйте папку по ее исходному пути, а также в .информационный файл.

Ура!!