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
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
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
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
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
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
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
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
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
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
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