bool BAG::loadModelFromFile(fstream &file){ clear(); UINT ensembleSize = 0; if(!file.is_open()) { errorLog << "loadModelFromFile(string filename) - Could not open file to load model" << endl; return false; } std::string word; file >> word; //Check to see if we should load a legacy file if( word == "GRT_BAG_MODEL_FILE_V1.0" ){ return loadLegacyModelFromFile( file ); } //Find the file type header if(word != "GRT_BAG_MODEL_FILE_V2.0"){ errorLog << "loadModelFromFile(string filename) - Could not find Model File Header" << endl; return false; } //Load the base settings from the file if( !Classifier::loadBaseSettingsFromFile(file) ){ errorLog << "loadModelFromFile(string filename) - Failed to load base settings from file!" << endl; return false; } if( trained ){ //Load the ensemble size file >> word; if(word != "EnsembleSize:"){ errorLog << "loadModelFromFile(string filename) - Could not find the EnsembleSize!" << endl; return false; } file >> ensembleSize; //Load the weights weights.resize( ensembleSize ); file >> word; if(word != "Weights:"){ errorLog << "loadModelFromFile(string filename) - Could not find the Weights!" << endl; return false; } for(UINT i=0; i<ensembleSize; i++){ file >> weights[i]; } //Load the classifier types vector< string > classifierTypes( ensembleSize ); file >> word; if(word != "ClassifierTypes:"){ errorLog << "loadModelFromFile(string filename) - Could not find the ClassifierTypes!" << endl; return false; } for(UINT i=0; i<ensembleSize; i++){ file >> classifierTypes[i]; } //Load the ensemble file >> word; if(word != "Ensemble:"){ errorLog << "loadModelFromFile(string filename) - Could not find the Ensemble!" << endl; return false; } ensemble.resize(ensembleSize,NULL); for(UINT i=0; i<ensembleSize; i++){ ensemble[i] = createInstanceFromString( classifierTypes[i] ); if( ensemble[i] == NULL ){ errorLog << "loadModelFromFile(string filename) - Could not create a new classifier instance from the classifierType: " << classifierTypes[i] << endl; clearEnsemble(); return false; } if( !ensemble[i]->loadModelFromFile( file ) ){ errorLog << "loadModelFromFile(string filename) - Failed to load ensemble classifier: " << i << endl; clearEnsemble(); return false; } } //Recompute the null rejection thresholds recomputeNullRejectionThresholds(); //Resize the prediction results to make sure it is setup for realtime prediction maxLikelihood = DEFAULT_NULL_LIKELIHOOD_VALUE; bestDistance = DEFAULT_NULL_DISTANCE_VALUE; classLikelihoods.resize(numClasses,DEFAULT_NULL_LIKELIHOOD_VALUE); classDistances.resize(numClasses,DEFAULT_NULL_DISTANCE_VALUE); } return true; }
bool BAG::loadModelFromFile(fstream &file){ trained = false; numFeatures = 0; numClasses = 0; classLabels.clear(); clearEnsemble(); UINT ensembleSize = 0; if(!file.is_open()) { errorLog << "loadModelFromFile(string filename) - Could not open file to load model" << endl; return false; } std::string word; //Find the file type header file >> word; if(word != "GRT_BAG_MODEL_FILE_V1.0"){ errorLog << "loadModelFromFile(string filename) - Could not find Model File Header" << endl; return false; } file >> word; if(word != "Trained:"){ errorLog << "loadModelFromFile(string filename) - Could not find Trained Header" << endl; return false; } file >> trained; file >> word; if(word != "NumFeatures:"){ errorLog << "loadModelFromFile(string filename) - Could not find NumFeatures!" << endl; return false; } file >> numFeatures; file >> word; if(word != "NumClasses:"){ errorLog << "loadModelFromFile(string filename) - Could not find NumClasses!" << endl; return false; } file >> numClasses; file >> word; if(word != "UseScaling:"){ errorLog << "loadModelFromFile(string filename) - Could not find UseScaling!" << endl; return false; } file >> useScaling; file >> word; if(word != "UseNullRejection:"){ errorLog << "loadModelFromFile(string filename) - Could not find UseNullRejection!" << endl; return false; } file >> useNullRejection; ///Read the ranges if needed if( useScaling ){ //Resize the ranges buffer ranges.resize(numFeatures); file >> word; if(word != "Ranges:"){ errorLog << "loadModelFromFile(string filename) - Could not find the Ranges!" << endl; return false; } for(UINT n=0; n<ranges.size(); n++){ file >> ranges[n].minValue; file >> ranges[n].maxValue; } } //Resize the buffer classLabels.resize(numClasses); //Load the class labels file >> word; if(word != "ClassLabels:"){ errorLog << "loadModelFromFile(string filename) - Could not find the ClassLabels!" << endl; return false; } for(UINT i=0; i<numClasses; i++){ file >> classLabels[i]; } //Load the ensemble size file >> word; if(word != "EnsembleSize:"){ errorLog << "loadModelFromFile(string filename) - Could not find the EnsembleSize!" << endl; return false; } file >> ensembleSize; if( ensembleSize > 0 ){ //Load the weights weights.resize( ensembleSize ); file >> word; if(word != "Weights:"){ errorLog << "loadModelFromFile(string filename) - Could not find the Weights!" << endl; return false; } for(UINT i=0; i<ensembleSize; i++){ file >> weights[i]; } //Load the classifier types vector< string > classifierTypes( ensembleSize ); file >> word; if(word != "ClassifierTypes:"){ errorLog << "loadModelFromFile(string filename) - Could not find the ClassifierTypes!" << endl; return false; } for(UINT i=0; i<ensembleSize; i++){ file >> classifierTypes[i]; } //Load the ensemble file >> word; if(word != "Ensemble:"){ errorLog << "loadModelFromFile(string filename) - Could not find the Ensemble!" << endl; return false; } ensemble.resize(ensembleSize,NULL); for(UINT i=0; i<ensembleSize; i++){ ensemble[i] = createInstanceFromString( classifierTypes[i] ); if( ensemble[i] == NULL ){ errorLog << "loadModelFromFile(string filename) - Could not create a new classifier instance from the classifierType: " << classifierTypes[i] << endl; clearEnsemble(); return false; } if( !ensemble[i]->loadModelFromFile( file ) ){ errorLog << "loadModelFromFile(string filename) - Failed to load ensemble classifier: " << i << endl; clearEnsemble(); return false; } } }