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