Commit 4f46567ad0b928395702b1f500bdd50525584734

Authored by Scott Klum
1 parent 74cfaa03

More

Showing 1 changed file with 38 additions and 28 deletions
openbr/core/boost.cpp
1 #include <opencv2/imgproc/imgproc.hpp> 1 #include <opencv2/imgproc/imgproc.hpp>
  2 +#include <openbr/core/opencvutils.h>
2 #include <QDebug> 3 #include <QDebug>
3 4
4 #include "boost.h" 5 #include "boost.h"
@@ -132,10 +133,10 @@ static CvMat* cvPreprocessIndexArray( const CvMat* idx_arr, int data_arr_size, b @@ -132,10 +133,10 @@ static CvMat* cvPreprocessIndexArray( const CvMat* idx_arr, int data_arr_size, b
132 133
133 //------------------------------------- FeatureEvaluator --------------------------------------- 134 //------------------------------------- FeatureEvaluator ---------------------------------------
134 135
135 -void FeatureEvaluator::init(Representation *_representation, int _maxSampleCount) 136 +void FeatureEvaluator::init(Representation *_representation, int maxSampleCount)
136 { 137 {
137 representation = _representation; 138 representation = _representation;
138 - cls.create( (int)_maxSampleCount, 1, CV_32FC1 ); 139 + cls.create(maxSampleCount, 1, CV_32FC1);
139 } 140 }
140 141
141 void FeatureEvaluator::setImage(const Template &src, uchar clsLabel, int idx) 142 void FeatureEvaluator::setImage(const Template &src, uchar clsLabel, int idx)
@@ -174,6 +175,8 @@ struct CascadeBoostTrainData : CvDTreeTrainData @@ -174,6 +175,8 @@ struct CascadeBoostTrainData : CvDTreeTrainData
174 virtual void setData(const FeatureEvaluator* _featureEvaluator, 175 virtual void setData(const FeatureEvaluator* _featureEvaluator,
175 int _numSamples, int _precalcValBufSize, int _precalcIdxBufSize, 176 int _numSamples, int _precalcValBufSize, int _precalcIdxBufSize,
176 const CvDTreeParams& _params=CvDTreeParams()); 177 const CvDTreeParams& _params=CvDTreeParams());
  178 +
  179 + void initVarType();
177 void precalculate(); 180 void precalculate();
178 181
179 virtual CvDTreeNode* subsample_data(const CvMat* _subsample_idx); 182 virtual CvDTreeNode* subsample_data(const CvMat* _subsample_idx);
@@ -371,6 +374,19 @@ CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEva @@ -371,6 +374,19 @@ CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEva
371 shared = true; 374 shared = true;
372 set_params( _params ); 375 set_params( _params );
373 max_c_count = MAX( 2, featureEvaluator->getMaxCatCount() ); 376 max_c_count = MAX( 2, featureEvaluator->getMaxCatCount() );
  377 +
  378 + initVarType();
  379 +
  380 + int maxSplitSize = cvAlign(sizeof(CvDTreeSplit) + (MAX(0,max_c_count - 33)/32)*sizeof(int),sizeof(void*));
  381 + int treeBlockSize = MAX((int)sizeof(CvDTreeNode)*8, maxSplitSize);
  382 + treeBlockSize = MAX(treeBlockSize + BlockSizeDelta, MinBlockSize);
  383 + tree_storage = cvCreateMemStorage( treeBlockSize );
  384 + node_heap = cvCreateSet( 0, sizeof(node_heap[0]), sizeof(CvDTreeNode), tree_storage );
  385 + split_heap = cvCreateSet( 0, sizeof(split_heap[0]), maxSplitSize, tree_storage );
  386 +}
  387 +
  388 +void CascadeBoostTrainData::initVarType()
  389 +{
374 var_type = cvCreateMat( 1, var_count + 2, CV_32SC(channels) ); 390 var_type = cvCreateMat( 1, var_count + 2, CV_32SC(channels) );
375 if ( featureEvaluator->getMaxCatCount() > 0 ) 391 if ( featureEvaluator->getMaxCatCount() > 0 )
376 { 392 {
@@ -393,13 +409,6 @@ CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEva @@ -393,13 +409,6 @@ CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEva
393 } 409 }
394 var_type->data.i[var_count] = cat_var_count; 410 var_type->data.i[var_count] = cat_var_count;
395 var_type->data.i[var_count+1] = cat_var_count+1; 411 var_type->data.i[var_count+1] = cat_var_count+1;
396 -  
397 - int maxSplitSize = cvAlign(sizeof(CvDTreeSplit) + (MAX(0,max_c_count - 33)/32)*sizeof(int),sizeof(void*));  
398 - int treeBlockSize = MAX((int)sizeof(CvDTreeNode)*8, maxSplitSize);  
399 - treeBlockSize = MAX(treeBlockSize + BlockSizeDelta, MinBlockSize);  
400 - tree_storage = cvCreateMemStorage( treeBlockSize );  
401 - node_heap = cvCreateSet( 0, sizeof(node_heap[0]), sizeof(CvDTreeNode), tree_storage );  
402 - split_heap = cvCreateSet( 0, sizeof(split_heap[0]), maxSplitSize, tree_storage );  
403 } 412 }
404 413
405 CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEvaluator, 414 CascadeBoostTrainData::CascadeBoostTrainData(const FeatureEvaluator* _featureEvaluator,
@@ -450,15 +459,15 @@ void CascadeBoostTrainData::setData( const FeatureEvaluator* _featureEvaluator, @@ -450,15 +459,15 @@ void CascadeBoostTrainData::setData( const FeatureEvaluator* _featureEvaluator,
450 if (sample_count < 65536) 459 if (sample_count < 65536)
451 is_buf_16u = true; 460 is_buf_16u = true;
452 461
  462 + // 1048576 is the number of bytes in a megabyte
453 numPrecalcVal = min( cvRound((double)_precalcValBufSize*1048576. / (sizeof(float)*sample_count)), var_count ); 463 numPrecalcVal = min( cvRound((double)_precalcValBufSize*1048576. / (sizeof(float)*sample_count)), var_count );
454 - numPrecalcIdx = min( cvRound((double)_precalcIdxBufSize*1048576. /  
455 - ((is_buf_16u ? sizeof(unsigned short) : sizeof (int))*sample_count)), var_count ); 464 + numPrecalcIdx = min( cvRound((double)_precalcIdxBufSize*1048576. / ((is_buf_16u ? sizeof(unsigned short) : sizeof (int))*sample_count)), var_count );
456 465
457 assert( numPrecalcIdx >= 0 && numPrecalcVal >= 0 ); 466 assert( numPrecalcIdx >= 0 && numPrecalcVal >= 0 );
458 467
459 valCache.create( numPrecalcVal, sample_count, CV_32FC1 ); 468 valCache.create( numPrecalcVal, sample_count, CV_32FC1 );
460 var_type = cvCreateMat( 1, var_count + 2, CV_32SC(channels) ); 469 var_type = cvCreateMat( 1, var_count + 2, CV_32SC(channels) );
461 - 470 +
462 if ( featureEvaluator->getMaxCatCount() > 0 ) 471 if ( featureEvaluator->getMaxCatCount() > 0 )
463 { 472 {
464 numPrecalcIdx = 0; 473 numPrecalcIdx = 0;
@@ -480,13 +489,16 @@ void CascadeBoostTrainData::setData( const FeatureEvaluator* _featureEvaluator, @@ -480,13 +489,16 @@ void CascadeBoostTrainData::setData( const FeatureEvaluator* _featureEvaluator,
480 } 489 }
481 var_type->data.i[var_count] = cat_var_count; 490 var_type->data.i[var_count] = cat_var_count;
482 var_type->data.i[var_count+1] = cat_var_count+1; 491 var_type->data.i[var_count+1] = cat_var_count+1;
  492 +
  493 + initVarType();
  494 +
483 work_var_count = ( cat_var_count ? 0 : numPrecalcIdx ) + 1/*cv_lables*/; 495 work_var_count = ( cat_var_count ? 0 : numPrecalcIdx ) + 1/*cv_lables*/;
484 buf_count = 2; 496 buf_count = 2;
485 497
486 buf_size = -1; // the member buf_size is obsolete 498 buf_size = -1; // the member buf_size is obsolete
487 499
488 effective_buf_size = (uint64)(work_var_count + 1)*(uint64)sample_count * buf_count; // this is the total size of "CvMat buf" to be allocated 500 effective_buf_size = (uint64)(work_var_count + 1)*(uint64)sample_count * buf_count; // this is the total size of "CvMat buf" to be allocated
489 - 501 +
490 effective_buf_width = sample_count; 502 effective_buf_width = sample_count;
491 effective_buf_height = work_var_count+1; 503 effective_buf_height = work_var_count+1;
492 if (effective_buf_width >= effective_buf_height) 504 if (effective_buf_width >= effective_buf_height)
@@ -592,6 +604,7 @@ const int* CascadeBoostTrainData::get_sample_indices( CvDTreeNode* n, int* indic @@ -592,6 +604,7 @@ const int* CascadeBoostTrainData::get_sample_indices( CvDTreeNode* n, int* indic
592 indicesBuf[i] = short_values[i]; 604 indicesBuf[i] = short_values[i];
593 cat_values = indicesBuf; 605 cat_values = indicesBuf;
594 } 606 }
  607 +
595 return cat_values; 608 return cat_values;
596 } 609 }
597 610
@@ -682,7 +695,8 @@ void CascadeBoostTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord @@ -682,7 +695,8 @@ void CascadeBoostTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord
682 const int* CascadeBoostTrainData::get_cat_var_data( CvDTreeNode* n, int vi, int* catValuesBuf ) 695 const int* CascadeBoostTrainData::get_cat_var_data( CvDTreeNode* n, int vi, int* catValuesBuf )
683 { 696 {
684 int nodeSampleCount = n->sample_count; 697 int nodeSampleCount = n->sample_count;
685 - int* sampleIndicesBuf = catValuesBuf; // 698 + int* sampleIndicesBuf = catValuesBuf;
  699 +
686 const int* sampleIndices = get_sample_indices(n, sampleIndicesBuf); 700 const int* sampleIndices = get_sample_indices(n, sampleIndicesBuf);
687 701
688 if ( vi < numPrecalcVal ) 702 if ( vi < numPrecalcVal )
@@ -738,9 +752,9 @@ struct FeatureIdxOnlyPrecalc : ParallelLoopBody @@ -738,9 +752,9 @@ struct FeatureIdxOnlyPrecalc : ParallelLoopBody
738 *(idst + fi*sample_count + si) = si; 752 *(idst + fi*sample_count + si) = si;
739 } 753 }
740 if ( is_buf_16u ) 754 if ( is_buf_16u )
741 - icvSortUShAux( udst + fi*sample_count, sample_count, valCachePtr ); 755 + icvSortUShAux( udst + (uint64)fi*sample_count, sample_count, valCachePtr );
742 else 756 else
743 - icvSortIntAux( idst + fi*sample_count, sample_count, valCachePtr ); 757 + icvSortIntAux( idst + (uint64)fi*sample_count, sample_count, valCachePtr );
744 } 758 }
745 } 759 }
746 const FeatureEvaluator* featureEvaluator; 760 const FeatureEvaluator* featureEvaluator;
@@ -810,6 +824,8 @@ void CascadeBoostTrainData::precalculate() @@ -810,6 +824,8 @@ void CascadeBoostTrainData::precalculate()
810 { 824 {
811 int minNum = MIN( numPrecalcVal, numPrecalcIdx); 825 int minNum = MIN( numPrecalcVal, numPrecalcIdx);
812 826
  827 + qDebug() << "Starting precalculation...";
  828 +
813 QTime time; 829 QTime time;
814 time.start(); 830 time.start();
815 831
@@ -931,10 +947,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node ) @@ -931,10 +947,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node )
931 else 947 else
932 { 948 {
933 int *ldst, *rdst; 949 int *ldst, *rdst;
934 - ldst = buf->data.i + left->buf_idx*length_buf_row +  
935 - vi*scount + left->offset;  
936 - rdst = buf->data.i + right->buf_idx*length_buf_row +  
937 - vi*scount + right->offset; 950 + ldst = buf->data.i + left->buf_idx*length_buf_row + (uint64)(vi*scount) + left->offset;
  951 + rdst = buf->data.i + right->buf_idx*length_buf_row + (uint64)(vi*scount) + right->offset;
938 952
939 // split sorted 953 // split sorted
940 for( int i = 0; i < n1; i++ ) 954 for( int i = 0; i < n1; i++ )
@@ -989,10 +1003,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node ) @@ -989,10 +1003,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node )
989 } 1003 }
990 else 1004 else
991 { 1005 {
992 - int *ldst = buf->data.i + left->buf_idx*length_buf_row +  
993 - (workVarCount-1)*scount + left->offset;  
994 - int *rdst = buf->data.i + right->buf_idx*length_buf_row +  
995 - (workVarCount-1)*scount + right->offset; 1006 + int *ldst = buf->data.i + left->buf_idx*length_buf_row + (uint64)(workVarCount-1)*scount + left->offset;
  1007 + int *rdst = buf->data.i + right->buf_idx*length_buf_row + (uint64)(workVarCount-1)*scount + right->offset;
996 1008
997 for( int i = 0; i < n; i++ ) 1009 for( int i = 0; i < n; i++ )
998 { 1010 {
@@ -1040,10 +1052,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node ) @@ -1040,10 +1052,8 @@ void CascadeBoostTree::split_node_data( CvDTreeNode* node )
1040 } 1052 }
1041 else 1053 else
1042 { 1054 {
1043 - int* ldst = buf->data.i + left->buf_idx*length_buf_row +  
1044 - workVarCount*scount + left->offset;  
1045 - int* rdst = buf->data.i + right->buf_idx*length_buf_row +  
1046 - workVarCount*scount + right->offset; 1055 + int* ldst = buf->data.i + left->buf_idx*length_buf_row + (uint64)workVarCount*scount + left->offset;
  1056 + int* rdst = buf->data.i + right->buf_idx*length_buf_row + (uint64)workVarCount*scount + right->offset;
1047 for (int i = 0; i < n; i++) 1057 for (int i = 0; i < n; i++)
1048 { 1058 {
1049 int idx = tempBuf[i]; 1059 int idx = tempBuf[i];