Example #1
0
int main(int argc, char **argv)
{
    int nMedoids = 2;
    int nData = 10000;
    int nDim = 8;

    int *medoids = new int(nMedoids);
    int *assignment = new int(nMedoids);

    cv::Mat training_data(nData,nDim,CV_32F);
    cv::randu(training_data,cv::Scalar(0),cv::Scalar(256));

    cvflann::UniqueRandom random_indices(nData);

    for(int i=0; i < nMedoids; i++)
    {
        // Do some checks later
        //medoids[i] = rand() % nData; //random_indices.next();
        medoids[i] = random_indices.next();
    }

    kmedoids_wrapper((float *)training_data.data, &medoids[0], &assignment[0], nData, nMedoids, nDim);

    //PlotClusters(training_data, &medoids[0], &assignment[0], nData, nMedoids);
   
    delete[] medoids;
    delete[] assignment;
}
inline
void
cv_dist_vector_GrassBC::svm_train()
{
  
  int n_actions = actions.n_rows;
  int n_test = 150 - 1;  //Problem with Run-Side_001_dim14 
  int n_dim = n_test -1;
  int k = 0;
  
  field <std::string> action_seq_names (150,3);  ///From the dataset description (150)
  
  for (int act=0; act<n_actions; ++act)
  {
    std::stringstream  ss_folders;
    ss_folders << path_dataset << actions (act) << "/list_folders.txt";
    field <std::string> list_folders;
    list_folders.load( ss_folders.str() );
    int n_folders = list_folders.n_rows;
    //cout <<  actions (act) << endl;
    //list_folders.print();
    for (int i=0; i< n_folders; ++i)
    {
      
      std::ostringstream ss_action;
      ss_action << act;
      action_seq_names(k,0) = actions(act); //Action
      action_seq_names(k,1) = list_folders(i); //Video Sequence
      action_seq_names(k,2) = ss_action.str();; //Action index
      k++;
    }
  }
  
  
  //****************************************
  #pragma omp parallel for 
  for (int seq_ts=0; seq_ts<action_seq_names.n_rows; ++seq_ts) 
  {
    //cout << seq_ts << endl;
    std::string action_name_ts = action_seq_names(seq_ts,0);   
    std::string folder_n_ts    = action_seq_names(seq_ts,1);
    
    if (!(action_name_ts=="Run-Side" && folder_n_ts=="001"))
    {
      
      fmat training_data;
      fvec lab;
      training_data.zeros(n_dim,n_test);
      lab.zeros(n_test);
      int k = 0;
      
      for (int seq_tr=0; seq_tr<action_seq_names.n_rows; ++seq_tr) //Problem with Run-Side_001_dim14 
      {
	std::string action_name_tr = action_seq_names(seq_tr,0);   
	std::string folder_n_tr    = action_seq_names(seq_tr,1);
	int act_tr  = atoi( action_seq_names(seq_tr,2).c_str() );
	
	if (!(action_name_tr=="Run-Side" && folder_n_tr=="001"))
	{
	  fvec dist_vector;
	  std::stringstream load_vec_dist;
	  load_vec_dist << "./GrassBC/dist_vector_" << action_name_tr << "_" <<  folder_n_tr << "_dim" << dim  << "_p" << p  << ".h5";
	  dist_vector.load( load_vec_dist.str() );
	  training_data.col(k) = dist_vector;
	  lab(k) = act_tr;
	  ++k;
	}
      }


	
	//Training the model with OpenCV
	//#pragma omp critical
	//cout << "Using SVM to train run " << seq_ts+1 << endl;
	//cout << "Preparing data to train the data" << endl;
	cv::Mat cvMatTraining(n_test, n_dim, CV_32FC1);
	float fl_labels[n_test] ;
	
	//cout << "Preparing data" << endl;
	for (uword m=0; m<n_test; ++m)
	{
	  for (uword d=0; d<n_dim; ++d)
	  {
	    cvMatTraining.at<float>(m,d) = training_data(d,m); 
	    //cout << " OpenCV: " << cvMatTraining.at<float>(m,d) << " - Arma: " <<training_data(d,m); 
	  }
	  fl_labels[m] = lab(m);
	  //cout <<" OpenCVLabel: " <<  fl_labels[m] << " ArmaLabel: " << labels(m) << endl;
	}
	
	cv::Mat cvMatLabels(n_test, 1, CV_32FC1,fl_labels );
	
	//cout << "Setting parameters" << endl;
	CvSVMParams params;
	params.svm_type    = CvSVM::C_SVC;
	params.kernel_type = CvSVM::LINEAR; 
	//params.gamma = 1;
	params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER,  (int)1e7, 1e-6);
	//params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
	
	// Train the SVM
	//cout << "...Training" << endl;
	CvSVM SVM;
	SVM.train( cvMatTraining , cvMatLabels, cv::Mat(), cv::Mat(), params);
	#pragma omp critical
	{
	std::stringstream save_svm_model;
	save_svm_model << "./svm_models/GrassBC_run_" << seq_ts+1;
	//cout << "Saving" << endl;
	SVM.save( save_svm_model.str().c_str() );
	}
      }
    }
  }
Example #3
0
//Main function
int main ( int argc, char *argv[] )
{
	
	//---  VARIABLES ---//
	//saving database descriptors
	cv::Mat training_descriptors;
	//for measuring processing time
	clock_t t;	
	// --- ---//
	std::cout << std::endl;
	std::cout << "+++ BOW FOR DATA SET +++" << std::endl;
	std::cout << TRAIN_PATH << std::endl;

	//--- DESCRIPTORS EXTRACTION ---//
	std::string train_path = TRAIN_PATH;
	//read descriptors from file
	std::cout << "*** TRAIN DESCRIPTORS INFO ***" << std::endl;
	cv::FileStorage fstore_descrip(DESCRIP_MAT_NAME, cv::FileStorage::READ);
	std::cout << "No Documents: " << (int)fstore_descrip["noDocuments"] << std::endl;
	std::cout << "No Classes: " << (int)fstore_descrip["noClasses"] << std::endl;
	std::cout << "No total descriptors: " << (int)fstore_descrip["totalDescriptors"] << std::endl;
	std::cout << "No max desrcriptors in an image: " << (int)fstore_descrip["maxDescriptors"] << std::endl;
	std::cout << "Descriptors processing time: " << (float)fstore_descrip["procTime"] << std::endl;
	std::cout << std::endl;
	fstore_descrip["matDescriptors"] >> training_descriptors;
	fstore_descrip.release();
	

	//--- BUILD A DICTIONARY ---//
	cv::TermCriteria tc(CV_TERMCRIT_ITER,100,0.001);
	int cluster_attempts = 1;
	int dictionary_size = atoi(argv[1]);
	std::cout << "*** BOW DICTIONARY INFO ***" << std::endl;
	std::cout << "Dictionary size: " << dictionary_size << std::endl; 
	cv::BOWKMeansTrainer bowTrainer(dictionary_size,tc,cluster_attempts, cv::KMEANS_PP_CENTERS);

	bowTrainer.add(training_descriptors);
	t = clock();
	cv::Mat my_dictionary = bowTrainer.cluster();
	t = clock()-t;
	std::cout << "Dictionary processing time:" << std::endl;
	std::cout << t << " clicks " << ((float)t)/CLOCKS_PER_SEC << " seconds" << std::endl;
	std::cout << std::endl;
	//--- ---//

	//--- NAIVE BAYES FOR CLASSIFICATION ---//
	cv::NormalBayesClassifier nb_classifier;
	cv::Mat training_data(0,dictionary_size,CV_32FC1);
	cv::Mat labels(0,1,CV_32FC1);

	//set the dictionary to bow descriptor extractor
	bowDE.setVocabulary(my_dictionary);

	std::cout << "*** CLASSIFIER TRAINING ***" << std::endl;
	bow_encode(fs::path(train_path),training_data,labels);
	// +++ for debugging - can  be commented +++//
	std::cout << training_data.size() << " * " << labels.size() << std::endl;
	if(training_data.type() == CV_32FC1)
	{std::cout << "training data matrix accepted" << std::endl;}
	if(labels.type() == CV_32FC1)
	{std::cout << "labels matrix accepted" << std::endl;}
	// +++ +++ //

	t = clock();
	nb_classifier.train(training_data,labels,cv::Mat(),cv::Mat(),false);
	t = clock() - t;
	nb_classifier.save("nbModel_flavia_leaves_a.yml","nbModel_flavia_leaves_a");
	std::cout << " Training processing time:" << std::endl;
	std::cout << t << " clicks " << ((float)t)/CLOCKS_PER_SEC << " seconds" << std::endl;
	std::cout << std::endl;
	
	//if you already have a classifier uncomment the next line and comment the all the
	//Classifier Training section
	//nb_classifier.load("nbModel_flavia_leaves_b.yml","nbModel_flavia_leaves_b");
	//std::cout << "Classfier model loaded"<< std::endl;

	//--- ---//

	//--- BOW ENCODING OF TEST SET AND EVALUATION ---//
	cv::Mat ground_truth(0,1,CV_32FC1);
	cv::Mat eval_data(0,dictionary_size,CV_32FC1);
	cv::Mat results;
	std::string test_path = TEST_PATH;
	double accuRate = 0.;

	std::cout << "*** CLASSIFIER EVALUATION ***" << std::endl;
	bow_encode(fs::path(test_path),eval_data,ground_truth);
	t = clock();
	nb_classifier.predict(eval_data,&results);	
	t = clock()-t;
	std::cout << " Classifier evaluation time:" << std::endl;
	std::cout << t << " clicks " << ((float)t)/CLOCKS_PER_SEC << " seconds" << std::endl;

	accuRate = 1. -( (double) cv::countNonZero(ground_truth - results) / eval_data.rows);
	std::cout << "Accuracy rate: " << accuRate << std::endl;
	std::cout << "Classifier Results" << std::endl;
	std::cout << results << std::endl << std::endl;
	
	

	return 0;
}				/* ----------  end of function main  ---------- */