subspace_analysis_fuerte.h
Go to the documentation of this file.
00001 #ifndef SSA_H_
00002 #define SSA_H_
00003 
00004 #include<iostream>
00005 #include<opencv/cv.h>
00006 #include<opencv/highgui.h>
00007 #include<opencv/ml.h>
00008 #include<fstream>
00009 #include<ostream>
00010 #include<limits>
00011 
00012 #include<math.h>
00013 // Base class for SubSpace Analysis(SSA)
00014 //
00015 //
00016 namespace SubspaceAnalysis
00017 {
00018 
00019 void dump_matrix(cv::Mat& mat, std::string filename);
00020 void condense_labels(std::vector<int>& labels);
00021 
00022 void error_prompt(std::string fct, std::string desc);
00023 void unique_elements(std::vector<int> & vec, int& unique_elements, std::vector<int>& distinct_vec);
00024 void unique_elements(cv::Mat & mat, int& unique_elements, std::vector<int>& distinct_vec);
00025 
00026 void mat_info(cv::Mat& mat);
00027 
00028 template<class T>
00029 void process_labels(std::vector<T> src_vec, cv::Mat& dst_labels)
00030 {
00031 
00032         dst_labels = cv::Mat::zeros(1, src_vec.size(), CV_32FC1);
00033         dst_labels -= 1;
00034         bool unique;
00035         for (int i = 0; i < src_vec.size(); ++i)
00036         {
00037                 unique = true;
00038                 for (int j = 0; j < dst_labels.rows; j++)
00039                 {
00040                         if (i == 0)
00041                         {
00042                                 break;
00043                         }
00044                         else if (src_vec[i] == src_vec[j])
00045                         {
00046                                 unique = false;
00047                                 dst_labels.at<float>(i) = dst_labels.at<float>(j);
00048                                 break;
00049                         }
00050                         else
00051                                 continue;
00052                 }
00053                 if (unique == true)
00054                         dst_labels.at<float>(i) = (float)i;
00055         }
00056 
00057 }
00058 enum Classifier
00059 {
00060         CLASS_DIFS, CLASS_SVM, CLASS_KNN, CLASS_RF
00061 };
00062 
00063 enum Method
00064 {
00065         METH_FISHER, METH_EIGEN, METH_IFLDA, METH_OCV_FISHER
00066 };
00067 
00068 //Baseclass for Fisherfaces and Eigenfaces
00069 class XFaces
00070 {
00071 public:
00072         XFaces() :
00073                 trained(false), svm_trained_(false), knn_trained_(false), rf_trained_(false)
00074         {
00075         }
00076         ;
00077 
00078         virtual ~XFaces()
00079         {
00080         }
00081         ;
00082         // TODO: temporary fix - use this one for sqare sized input images
00083         void retrieve(std::vector<cv::Mat>& out_eigenvectors, cv::Mat& out_eigenvalues, cv::Mat& out_avg, cv::Mat& out_proj_model_data);
00084         void retrieve(std::vector<cv::Mat>& out_eigenvectors, cv::Mat& out_eigenvalues, cv::Mat& out_avg, cv::Mat& out_proj_model_data, cv::Size output_dim);
00085         void getModel(cv::Mat& out_eigenvectors, cv::Mat& out_eigenvalues, cv::Mat& out_avg, cv::Mat& out_proj_model_data);
00086         //void classify(cv::Mat& src_mat,int& class_index);
00087         void classify(cv::Mat& coeff_arr, Classifier method, int& class_index);
00088         void projectToSubspace(cv::Mat& probe_mat, cv::Mat& coeff_arr, double& DFFS);
00089         void releaseModel();
00090         bool verifyClassification(cv::Mat& sample, int& index);
00091         bool saveModel(std::string path);
00092         bool loadModel(cv::Mat& eigenvec_arr, cv::Mat& eigenval_arr, cv::Mat& proj_model, cv::Mat& avg_arr, std::vector<int>& label_vec, bool use_unknown_thresh);
00093         bool loadModelFromFile(std::string path, bool use_unknown_thresh);
00094         bool trained;
00095 
00096 protected:
00097         void project(cv::Mat& src_mat, cv::Mat& proj_mat, cv::Mat& avg_mat, cv::Mat& coeff_mat);
00098         void reconstruct(cv::Mat& coeffs, cv::Mat& proj_mat, cv::Mat& avg, cv::Mat& rec_im);
00099         void calcDataMat(std::vector<cv::Mat>& input_data, cv::Mat& data_mat);
00100         void calcDFFS(cv::Mat& orig_mat, cv::Mat& recon_mat, cv::Mat& avg, std::vector<double>& DFFS);
00101         void calcDIFS(cv::Mat& probe_mat, int& minDIFSindex, double& minDIFS, cv::Mat& minDIFScoeffs);
00102         void mat2arr(cv::Mat& src_mat, cv::Mat& dst_mat);
00103         void calc_threshold(cv::Mat& data, double& thresh);
00104         void calc_threshold(cv::Mat& data, std::vector<cv::Mat>& thresh);
00105 
00106         //data
00107         int ss_dim_;
00108         cv::Mat eigenvector_arr_;
00109         cv::Mat eigenvalue_arr_;
00110         cv::Mat avg_arr_;
00111         cv::Mat model_data_arr_;
00112         cv::Mat proj_model_data_arr_;
00113         cv::Mat model_label_arr_;
00114 
00115         int num_classes_;
00116         std::vector<int> unique_labels_;
00117 
00118         std::vector<cv::Mat> thresholds_;
00119         bool use_unknown_thresh_;
00120         double thresh_;
00121         cv::Mat class_centers_;
00122 
00123         //classification flags
00124         CvSVM svm_;
00125         bool svm_trained_;
00126 
00127         CvKNearest knn_;
00128         bool knn_trained_;
00129 
00130         CvRTrees rf_;
00131         bool rf_trained_;
00132 };
00133 
00134 //Baseclass for PCA LDA
00135 class SSA
00136 {
00137 
00138 public:
00139         SSA()
00140         {
00141         }
00142         ;
00143 
00144         virtual ~SSA()
00145         {
00146         }
00147         ;
00148         void calcDataMat(std::vector<cv::Mat>& input_data, cv::Mat& data_mat);
00149         void calcDataMatMean(cv::Mat& data, cv::Mat& mean_row);
00150         void decompose();
00151         void decompose(cv::Mat& data_mat);
00152         void decompose2(cv::Mat& data_mat);
00153         //Interface methods
00154         void retrieve(cv::Mat& proj, cv::Mat& avg, cv::Mat& proj_model_data);
00155 
00156         cv::Mat eigenvals;
00157         cv::Mat eigenvecs;
00158         cv::Mat mean;
00159         int ss_dim_;
00160 };
00161 
00162 class LDA: public SSA
00163 {
00164 
00165 public:
00166         LDA()
00167         {
00168         }
00169         ;
00170         LDA(cv::Mat& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00171         virtual ~LDA()
00172         {
00173         }
00174         ;
00175 
00176         void calcClassMean(cv::Mat& data_mat, std::vector<int>& label_vec, cv::Mat& class_mean_arr, int& num_classes);
00177         void calcClassMean(cv::Mat& data_mat, cv::Mat& label_mat, cv::Mat& class_mean_arr, int& num_classes);
00178         virtual void calcProjMatrix(cv::Mat& data_arr, std::vector<int>& label_vec);
00179 
00180         int num_classes_;
00181         std::vector<int> unique_labels_;
00182 
00183         cv::Mat class_mean_arr;
00184 };
00185 
00186 class ILDA: public LDA
00187 {
00188 public:
00189         ILDA()
00190         {
00191         }
00192         ;
00193         ILDA(cv::Mat& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00194         virtual ~ILDA()
00195         {
00196         }
00197         ;
00198 
00199         virtual void calcProjMatrix(cv::Mat& data_arr, std::vector<int>& label_vec);
00200 
00201 };
00202 
00203 class PCA: public SSA
00204 {
00205 public:
00206         PCA()
00207         {
00208         }
00209         ;
00210         PCA(cv::Mat& input_data, int& ss_dim);
00211         virtual ~PCA()
00212         {
00213         }
00214         ;
00215         virtual void calcProjMatrix(cv::Mat& data);
00216 };
00217 
00218 class Eigenfaces: public XFaces
00219 {
00220 public:
00221         Eigenfaces()
00222         {
00223         }
00224         ;
00225         virtual ~Eigenfaces()
00226         {
00227         }
00228         ;
00229 
00230         bool init(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim);
00231         void meanCoeffs(cv::Mat& coeffs, std::vector<int>& label_vec, cv::Mat& mean_coeffs);
00232 
00233 protected:
00234         SubspaceAnalysis::PCA pca_;
00235 };
00236 
00237 class Fisherfaces: public XFaces
00238 {
00239 public:
00240         Fisherfaces()
00241         {
00242         }
00243         ;
00244         virtual ~Fisherfaces()
00245         {
00246         }
00247         ;
00248 
00249         bool init(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec);
00250 
00251 protected:
00252         //void calcDIFS(cv::Mat& probe_mat,std::vector<double>& DFFS);
00253         SubspaceAnalysis::PCA pca_;
00254         SubspaceAnalysis::LDA lda_;
00255 };
00256 class FishEigFaces: public XFaces
00257 {
00258 public:
00259         FishEigFaces();
00260         virtual ~FishEigFaces()
00261         {
00262         }
00263         ;
00264         //old interface TODO change to new
00265         bool init(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim);
00266         bool init(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim, Method method);
00267         bool init(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim, Method method, bool fallback, bool use_unknown_thresh);
00268 
00269         bool trainModel(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim);
00270         bool trainModel(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim, Method method);
00271         bool trainModel(std::vector<cv::Mat>& img_vec, std::vector<int>& label_vec, int& red_dim, Method method, bool fallback, bool use_unknown_thresh);
00272 
00273 protected:
00274         SubspaceAnalysis::PCA pca_;
00275         SubspaceAnalysis::LDA lda_;
00276         bool fallback_;
00277 };
00278 
00279 }
00280 ;
00281 #endif


cob_people_detection
Author(s): Richard Bormann , Thomas Zwölfer
autogenerated on Fri Aug 28 2015 10:24:13