Перейти к содержимому
Compvision.ru
mrgloom

Анализ логов opencv_traincascade

Recommended Posts

Как оценить хорошо ли натренировался каскад?
Train dataset for temp stage can not be filled. Branch training terminated

 

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

 
Как оценить требуемую память в пике? Вроде программа занимала ~ 1.4 Gb.
 
p.s. выскакивает странное предупреждение, хотя папка пуста. (использовал 2.4.10)
Training parameters are loaded from the parameter file in data folder!
Please empty the data folder if you want to use your own set of parameters.

 

 

 
opencv_traincascade -data data/cascade/experiment1 -vec data/pos_80_80_all.vec -bg data/neg/neg.txt -numPos 98 -numNeg 10000
-numStages 10 -precalcValBufSize 1024 -precalcIdxBufSize 1024 -featureType LBP -w 80 -h 80
 
Training parameters are loaded from the parameter file in data folder!
Please empty the data folder if you want to use your own set of parameters.
PARAMETERS:
cascadeDirName: data/cascade/experiment1
vecFileName: data/pos_80_80_all.vec
bgFileName: data/neg/neg.txt
numPos: 98
numNeg: 10000
numStages: 10
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
stageType: BOOST
featureType: LBP
sampleWidth: 80
sampleHeight: 80
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
 
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   98 : 98
NEG count : acceptanceRatio    10000 : 1
Precalculation time: 12.951
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        1|
+----+---------+---------+
|   4|        1|    0.258|
+----+---------+---------+
END>
Training until now has taken 0 days 1 hours 38 minutes 2 seconds.
 
===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   98 : 98
NEG count : acceptanceRatio    10000 : 0.257566
Precalculation time: 13.466
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        1|
+----+---------+---------+
|   4|        1|   0.2202|
+----+---------+---------+
END>
Training until now has taken 0 days 3 hours 23 minutes 30 seconds.
 
===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   98 : 98
NEG count : acceptanceRatio    10000 : 0.0570969
Precalculation time: 12.91
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        1|
+----+---------+---------+
|   4|        1|   0.1442|
+----+---------+---------+
END>
Training until now has taken 0 days 4 hours 56 minutes 0 seconds.
 
===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   98 : 98
NEG count : acceptanceRatio    10000 : 0.00820192
Precalculation time: 11.31
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 6 hours 9 minutes 53 seconds.
 
===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   98 : 98
Train dataset for temp stage can not be filled. Branch training terminated.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На счёт ошибки не скажу, а объём потребляемой памятии раньше можно было ограничить параметров командной строки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так понял что 

precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024

 

 

это не вся память ,а только память под буферы.

 

p.s. LBP не только быстрее, но потребляет памяти меньше чем HAAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так понял что 

 

это не вся память ,а только память под буферы.

 

p.s. LBP не только быстрее, но потребляет памяти меньше чем HAAR.

Это разумеется. Процесс не может контролировать выделение памяти сторонних модулей, а также своих автоматических структур. Но указанные ограничения определяют основной объём потребляемой при обучении памяти. Мне это было важно, т.к. однажды арендовался сервер с всего 4 Гб памяти, на котором надо было запускать одновременно тренировку нескольких каскадов. Тренировка длилась больше 10 дней, цена ошибки была недёшева.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

по сорцам нашел, что этот ворнинг получается когда у нас в  CvCascadeClassifier::updateTrainingSet negCount = 0 который приходит из CvCascadeClassifier::fillPassedSamples, а там видимо imgReader.getNeg не может получить очередное негативное изображение, но какая концептуальная интерпретация этого непонятно.

 

вот этот кусок еще странный, т.к. в консоль это не выводилось ни разу.

if( predict( i ) == 1.0F )
{
getcount++;
printf("%s current samples: %d\r", isPositive ? "POS":"NEG", getcount);
break;
}

https://github.com/Itseez/opencv/blob/be9c6bdd67d6646a56d181de4eec03643bb6706e/apps/traincascade/cascadeclassifier.cpp

 

 

похоже еще в master и в 2.4.10 отличаются эти куски кода

 

 

master

int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, int64& consumed )
{
    int getcount = 0;
    Mat img(cascadeParams.winSize, CV_8UC1);
    for( int i = first; i < first + count; i++ )
    {
        for( ; ; )
        {
            bool isGetImg = isPositive ? imgReader.getPos( img ) :
                                           imgReader.getNeg( img );
            if( !isGetImg )
                return getcount;
            consumed++;


            featureEvaluator->setImage( img, isPositive ? 1 : 0, i );
            if( predict( i ) == 1.0F )
            {
                getcount++;
                printf("%s current samples: %d\r", isPositive ? "POS":"NEG", getcount);
                break;
            }
        }
    }
    return getcount;
}

2.4.10

int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, double minimumAcceptanceRatio, int64& consumed )
{
    int getcount = 0;
    Mat img(cascadeParams.winSize, CV_8UC1);
    for( int i = first; i < first + count; i++ )
    {
        for( ; ; )
        {
            if( consumed != 0 && ((double)getcount+1)/(double)(int64)consumed <= minimumAcceptanceRatio )
                return getcount;


            bool isGetImg = isPositive ? imgReader.getPos( img ) :
                                           imgReader.getNeg( img );
            if( !isGetImg )
                return getcount;
            consumed++;


            featureEvaluator->setImage( img, isPositive ? 1 : 0, i );
            if( predict( i ) == 1.0F )
            {
                getcount++;
                printf("%s current samples: %d\r", isPositive ? "POS":"NEG", getcount);
                break;
            }
        }
    }
    return getcount;
}

так что может сработало условие 

(double)getcount+1)/(double)(int64)consumed <= minimumAcceptanceRatio

 

https://github.com/Itseez/opencv/pull/2900

https://github.com/vpisarev/opencv/commit/5947519ff47da40caa2610216c701e1de6dcbffc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×