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


cob_people_detection
Author(s): Richard Bormann , Thomas Zwölfer
autogenerated on Mon May 6 2019 02:32:06