00001
00061 #ifndef __FACE_RECOGNIZER_H__
00062 #define __FACE_RECOGNIZER_H__
00063
00064 #ifdef __LINUX__
00065 #include <cob_people_detection/abstract_face_recognizer.h>
00066 #include <cob_people_detection/face_normalizer.h>
00067 #include <cob_people_detection/face_recognizer_algorithms.h>
00068 #else
00069 #include "cob_vision/cob_vision_ipa_utils/common/include/cob_vision_ipa_utils/MathUtils.h"
00070 #include "cob_vision/cob_sensor_fusion/common/include/cob_sensor_fusion/ColoredPointCloud.h"
00071 #endif
00072
00073
00074 #include <opencv2/opencv.hpp>
00075
00076
00077 #include <boost/thread/mutex.hpp>
00078 #include <boost/thread/locks.hpp>
00079 #include "boost/filesystem/path.hpp"
00080 #include "boost/lexical_cast.hpp"
00081
00082 #include <algorithm>
00083 namespace ipa_PeopleDetector
00084 {
00085
00086 class FaceRecognizer: public AbstractFaceRecognizer
00087 {
00088 public:
00089
00091 FaceRecognizer(void);
00092 ~FaceRecognizer(void);
00093
00099 virtual unsigned long init(std::string data_directory, int norm_size, bool norm_illumination, bool norm_align, bool norm_extreme_illumination, int metric, bool debug,
00100 std::vector<std::string>& identification_labels_to_recognize, int subs_meth, int feature_dim, bool use_unknown_thresh, bool use_depth);
00101
00107 virtual unsigned long initTraining(std::string data_directory, int norm_size, bool norm_illumination, bool norm_align, bool norm_extreme_illumination, bool debug,
00108 std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps, bool use_depth);
00109
00117 virtual unsigned long addFace(cv::Mat& color_image, cv::Mat& depth_image, cv::Rect& face_bounding_box, cv::Rect& head_bounding_box, std::string label,
00118 std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00119
00124 virtual unsigned long updateFaceLabels(std::string old_label, std::string new_label);
00125
00130 virtual unsigned long updateFaceLabel(int index, std::string new_label);
00131
00136 virtual unsigned long deleteFaces(std::string label, std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00137
00142 virtual unsigned long deleteFace(int index, std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00143
00147 virtual unsigned long saveTrainingData(std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00148 virtual unsigned long saveTrainingData(std::vector<cv::Mat>& face_images);
00149
00153 virtual unsigned long trainRecognitionModel(std::vector<std::string>& identification_labels_to_train);
00154
00157 virtual unsigned long saveRecognitionModel();
00158
00162 virtual unsigned long loadRecognitionModel(std::vector<std::string>& identification_labels_to_recognize);
00163
00164 enum Metrics
00165 {
00166 EUCLIDEAN, MAHALANOBIS, MAHALANOBISCOSINE
00167 };
00168
00169 protected:
00170
00177 virtual unsigned long recognizeFace(cv::Mat& color_image, std::vector<cv::Rect>& face_coordinates, std::vector<std::string>& identification_labels);
00178 virtual unsigned long recognizeFace(cv::Mat& color_image, cv::Mat& depth_image, std::vector<cv::Rect>& face_coordinates, std::vector<std::string>& identification_labels);
00179
00186 virtual unsigned long convertAndResize(cv::Mat& img, cv::Mat& resized, cv::Rect& face, cv::Size new_size);
00187
00192 virtual unsigned long loadTrainingData(std::vector<cv::Mat>& face_images, std::vector<std::string>& identification_labels_to_train);
00193 virtual unsigned long loadTrainingData(std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps, std::vector<std::string>& identification_labels_to_train);
00194
00198 void assertDirectories(boost::filesystem::path& data_directory);
00199
00200
00201 std::vector<std::string> depth_str_labels;
00202 std::vector<std::string> depth_str_labels_unique;
00203 std::vector<int> depth_num_labels;
00204
00205 FaceNormalizer face_normalizer_;
00206
00207 ipa_PeopleDetector::FaceRecognizerBaseClass* eff_depth;
00208 ipa_PeopleDetector::FaceRecognizerBaseClass* eff_color;
00209 std::vector<int> m_label_num;
00210 int m_rec_method;
00211 std::vector<bool> dm_exist;
00212 bool m_depth_mode;
00213 ipa_PeopleDetector::Method m_subs_meth;
00214 bool m_use_unknown_thresh;
00215 unsigned long trainFaceRecognition(ipa_PeopleDetector::FaceRecognizerBaseClass* eff, std::vector<cv::Mat>& data, std::vector<int>& labels);
00216
00217
00218
00219
00220 std::vector<cv::Mat> m_eigenvectors;
00221 IplImage** m_eigenvectors_ipl;
00222 cv::Mat m_eigenvalues;
00223 cv::Mat m_average_image;
00224 cv::Mat m_projected_training_faces;
00225 std::vector<std::string> m_face_labels;
00226 cv::Mat m_face_class_average_projections;
00227 std::vector<std::string> m_current_label_set;
00228 #if CV_MAJOR_VERSION == 2
00229 cv::SVM m_face_classifier;
00230 #else
00231
00232 cv::Ptr<cv::ml::SVM> m_face_classifier;
00233 #endif
00234 boost::filesystem::path m_data_directory;
00235
00236
00237 boost::mutex m_data_mutex;
00238
00239
00240 int m_norm_size;
00241 int m_eigenvectors_per_person;
00242 double m_threshold_facespace;
00243 double m_threshold_unknown;
00244 int m_metric;
00245 bool m_debug;
00246
00247 int m_feature_dim;
00248 };
00249
00250 }
00251
00252 #endif // __FACE_RECOGNIZER_H__