mrgloom 242 Жалоба Опубликовано May 14, 2015 Как оценить хорошо ли натренировался каскад? 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. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 15, 2015 На счёт ошибки не скажу, а объём потребляемой памятии раньше можно было ограничить параметров командной строки. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 15, 2015 я так понял что precalcValBufSize[Mb] : 1024 precalcIdxBufSize[Mb] : 1024 это не вся память ,а только память под буферы. p.s. LBP не только быстрее, но потребляет памяти меньше чем HAAR. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 15, 2015 я так понял что это не вся память ,а только память под буферы. p.s. LBP не только быстрее, но потребляет памяти меньше чем HAAR. Это разумеется. Процесс не может контролировать выделение памяти сторонних модулей, а также своих автоматических структур. Но указанные ограничения определяют основной объём потребляемой при обучении памяти. Мне это было важно, т.к. однажды арендовался сервер с всего 4 Гб памяти, на котором надо было запускать одновременно тренировку нескольких каскадов. Тренировка длилась больше 10 дней, цена ошибки была недёшева. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано June 8, 2015 по сорцам нашел, что этот ворнинг получается когда у нас в 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах