From 52c50b4ff3389e06846aec77479c7cf11dcddd7c Mon Sep 17 00:00:00 2001 From: Tadas Baltrusaitis Date: Wed, 8 Mar 2017 11:46:50 -0500 Subject: [PATCH 1/3] - Fixing the issue with gaze not tracking properly in video and landmark modes. - Fixing the simscale/simalign bug --- .gitignore | 3 + .travis.yml | 1 + appveyor.yml | 1 + exe/FeatureExtraction/FeatureExtraction.cpp | 32 +- lib/local/FaceAnalyser/include/FaceAnalyser.h | 273 +++++++++--------- lib/local/FaceAnalyser/src/FaceAnalyser.cpp | 141 ++++----- lib/local/FaceAnalyser/src/Face_utils.cpp | 24 +- .../src/LandmarkDetectorModel.cpp | 5 +- .../Demos/feature_extraction_demo_img_seq.m | 2 +- .../Gaze Experiments/mpii_1500_errs.mat | Bin 11721 -> 11721 bytes 10 files changed, 226 insertions(+), 256 deletions(-) diff --git a/.gitignore b/.gitignore index 04fad1c..94adde9 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,6 @@ exe/Recording/Debug/ lib/3rdParty/dlib/Debug/ lib/local/FaceAnalyser/Debug/ lib/local/LandmarkDetector/Debug/ +matlab_runners/Head Pose Experiments/experiments/biwi_out/ +matlab_runners/Head Pose Experiments/experiments/bu_out/ +matlab_runners/Head Pose Experiments/experiments/ict_out/ diff --git a/.travis.yml b/.travis.yml index 76b6e2b..fde65bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -75,4 +75,5 @@ script: - ../build/bin/FaceLandmarkImg -inroot ../videos -f Obama.jpg -outroot data -of obama.txt -op obama.3d -oi obama.bmp -multi_view 1 -wild -q - ../build/bin/FaceLandmarkVidMulti -inroot ../videos -f multi_face.avi -outroot output -ov multi_face.avi -q - ../build/bin/FeatureExtraction -f "../videos/1815_01_008_tony_blair.avi" -outroot output_features -ov blair.avi -of "1815_01_008_tony_blair.txt" -simalign aligned -ov feat_test.avi -hogalign hog_test.dat -q + - ../build/bin/FeatureExtraction -f "../videos/1815_01_008_tony_blair.avi" -outroot output_features -simsize 200 -simscale 0.5 -ov blair.avi -of "1815_01_008_tony_blair.txt" -simalign aligned -ov feat_test.avi -hogalign hog_test.dat -q - ../build/bin/FaceLandmarkVid -inroot ../videos -f 1815_01_008_tony_blair.avi -f 0188_03_021_al_pacino.avi -f 0217_03_006_alanis_morissette.avi -outroot output_data -ov 1.avi -ov 2.avi -ov 3.avi -q diff --git a/appveyor.yml b/appveyor.yml index dcba59b..5c90d1f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -25,4 +25,5 @@ test_script: - cmd: if exist "../videos" (FaceLandmarkImg.exe -inroot ../videos -f obama.jpg -outroot out_data -of obama.pts -op obama.3d -oi obama.bmp -q) else (FaceLandmarkImg.exe -inroot ../../videos -f obama.jpg -outroot out_data -of obama.pts -op obama.3d -oi obama.bmp -q) - cmd: if exist "../videos" (FaceLandmarkVidMulti.exe -inroot ../videos -f multi_face.avi -ov multi_face.avi -q) else (FaceLandmarkVidMulti.exe -inroot ../../videos -f multi_face.avi -ov multi_face.avi -q) - cmd: if exist "../videos" (FeatureExtraction.exe -f "../videos/1815_01_008_tony_blair.avi" -outroot output_features -of "1815_01_008_tony_blair.txt" -simalign aligned -ov feat_track.avi -hogalign hog_test.dat -q) else (FeatureExtraction.exe -f "../../videos/1815_01_008_tony_blair.avi" -outroot output_features -of "1815_01_008_tony_blair.txt" -simalign aligned -ov feat_track.avi -hogalign hog_test.dat -q) + - cmd: if exist "../videos" (FeatureExtraction.exe -f "../videos/1815_01_008_tony_blair.avi" -outroot output_features -of "1815_01_008_tony_blair.txt" -simalign aligned -simsize 200 -simscale 0.5 -ov feat_track.avi -hogalign hog_test.dat -q) else (FeatureExtraction.exe -f "../../videos/1815_01_008_tony_blair.avi" -outroot output_features -of "1815_01_008_tony_blair.txt" -simalign aligned -simsize 200 -simscale 0.5 -ov feat_track.avi -hogalign hog_test.dat -q) - cmd: if exist "../videos" (FaceLandmarkVid.exe -f "../videos/1815_01_008_tony_blair.avi" -ov track.avi -q) else (FaceLandmarkVid.exe -f "../../videos/1815_01_008_tony_blair.avi" -ov track.avi -q) diff --git a/exe/FeatureExtraction/FeatureExtraction.cpp b/exe/FeatureExtraction/FeatureExtraction.cpp index 2c67b6c..ea8e6be 100644 --- a/exe/FeatureExtraction/FeatureExtraction.cpp +++ b/exe/FeatureExtraction/FeatureExtraction.cpp @@ -308,9 +308,9 @@ int main (int argc, char **argv) vector output_similarity_align; vector output_hog_align_files; - double sim_scale = 0.7; + double sim_scale = -1; int sim_size = 112; - bool grayscale = false; + bool grayscale = false; bool video_output = false; bool dynamic = true; // Indicates if a dynamic AU model should be used (dynamic is useful if the video is long enough to include neutral expressions) int num_hog_rows; @@ -321,13 +321,13 @@ int main (int argc, char **argv) bool output_2D_landmarks = true; bool output_3D_landmarks = true; bool output_model_params = true; - bool output_pose = true; + bool output_pose = true; bool output_AUs = true; bool output_gaze = true; get_output_feature_params(output_similarity_align, output_hog_align_files, sim_scale, sim_size, grayscale, verbose, dynamic, output_2D_landmarks, output_3D_landmarks, output_model_params, output_pose, output_AUs, output_gaze, arguments); - + // Used for image masking string tri_loc; boost::filesystem::path tri_loc_path = boost::filesystem::path("model/tris_68_full.txt"); @@ -391,7 +391,10 @@ int main (int argc, char **argv) } // Creating a face analyser that will be used for AU extraction - FaceAnalysis::FaceAnalyser face_analyser(vector(), 0.7, 112, 112, au_loc, tri_loc); + // Make sure sim_scale is proportional to sim_size if not set + if (sim_scale == -1) sim_scale = sim_size * (0.7 / 112.0); + + FaceAnalysis::FaceAnalyser face_analyser(vector(), sim_scale, sim_size, sim_size, au_loc, tri_loc); while(!done) // this is not a for loop as we might also be reading from a webcam { @@ -593,7 +596,7 @@ int main (int argc, char **argv) } if(hog_output_file.is_open()) { - FaceAnalysis::Extract_FHOG_descriptor(hog_descriptor, sim_warped_img, num_hog_rows, num_hog_cols); + face_analyser.GetLatestHOG(hog_descriptor, num_hog_rows, num_hog_cols); if(visualise_hog && !det_parameters.quiet_mode) { @@ -615,13 +618,13 @@ int main (int argc, char **argv) pose_estimate = LandmarkDetector::GetCorrectedPoseCamera(face_model, fx, fy, cx, cy); } - if(hog_output_file.is_open()) + if (hog_output_file.is_open()) { output_HOG_frame(&hog_output_file, detection_success, hog_descriptor, num_hog_rows, num_hog_cols); } // Write the similarity normalised output - if(!output_similarity_align.empty()) + if (!output_similarity_align.empty()) { if (sim_warped_img.channels() == 3 && grayscale) @@ -630,18 +633,18 @@ int main (int argc, char **argv) } char name[100]; - - // output the frame number - std::sprintf(name, "frame_det_%06d.bmp", frame_count); + + // Filename is based on frame number + std::sprintf(name, "frame_det_%06d.bmp", frame_count + 1); // Construct the output filename boost::filesystem::path slash("/"); - + std::string preferredSlash = slash.make_preferred().string(); - + string out_file = output_similarity_align[f_n] + preferredSlash + string(name); bool write_success = imwrite(out_file, sim_warped_img); - + if (!write_success) { cout << "Could not output similarity aligned image image" << endl; @@ -1206,6 +1209,7 @@ void get_output_feature_params(vector &output_similarity_aligned, vector } + // Can process images via directories creating a separate output file per directory void get_image_input_output_params_feats(vector > &input_image_files, bool& as_video, vector &arguments) { diff --git a/lib/local/FaceAnalyser/include/FaceAnalyser.h b/lib/local/FaceAnalyser/include/FaceAnalyser.h index e5bd9f8..f55d455 100644 --- a/lib/local/FaceAnalyser/include/FaceAnalyser.h +++ b/lib/local/FaceAnalyser/include/FaceAnalyser.h @@ -74,184 +74,183 @@ namespace FaceAnalysis { -class FaceAnalyser{ + class FaceAnalyser { -public: + public: - enum RegressorType{ SVR_appearance_static_linear = 0, SVR_appearance_dynamic_linear = 1, SVR_dynamic_geom_linear = 2, SVR_combined_linear = 3, SVM_linear_stat = 4, SVM_linear_dyn = 5, SVR_linear_static_seg = 6, SVR_linear_dynamic_seg =7}; + enum RegressorType { SVR_appearance_static_linear = 0, SVR_appearance_dynamic_linear = 1, SVR_dynamic_geom_linear = 2, SVR_combined_linear = 3, SVM_linear_stat = 4, SVM_linear_dyn = 5, SVR_linear_static_seg = 6, SVR_linear_dynamic_seg = 7 }; - // Constructor from a model file (or a default one if not provided - // TODO scale width and height should be read in as part of the model as opposed to being here? - FaceAnalyser(vector orientation_bins = vector(), double scale = 0.7, int width = 112, int height = 112, std::string au_location = "AU_predictors/AU_all_best.txt", std::string tri_location = "model/tris_68_full.txt"); + // Constructor from a model file (or a default one if not provided + // TODO scale width and height should be read in as part of the model as opposed to being here? + FaceAnalyser(vector orientation_bins = vector(), double scale = 0.7, int width = 112, int height = 112, std::string au_location = "AU_predictors/AU_all_best.txt", std::string tri_location = "model/tris_68_full.txt"); - void AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CLNF& clnf, double timestamp_seconds, bool online = false, bool visualise = true); + void AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CLNF& clnf, double timestamp_seconds, bool online = false, bool visualise = true); - // If the features are extracted manually (shouldn't really be used) - void PredictAUs(const cv::Mat_& hog_features, const cv::Mat_& geom_features, const LandmarkDetector::CLNF& clnf_model, bool online); + // If the features are extracted manually (shouldn't really be used) + void PredictAUs(const cv::Mat_& hog_features, const cv::Mat_& geom_features, const LandmarkDetector::CLNF& clnf_model, bool online); - cv::Mat GetLatestHOGDescriptorVisualisation(); + cv::Mat GetLatestHOGDescriptorVisualisation(); - double GetCurrentTimeSeconds(); - - // Grab the current predictions about AUs from the face analyser - std::vector> GetCurrentAUsClass() const; // AU presence - std::vector> GetCurrentAUsReg() const; // AU intensity - std::vector> GetCurrentAUsCombined() const; // Both presense and intensity + double GetCurrentTimeSeconds(); - // A standalone call for predicting AUs from a static image, the first element in the pair represents occurence the second intensity - // This call is useful for detecting action units in images - std::pair>, std::vector>> PredictStaticAUs(const cv::Mat& frame, const LandmarkDetector::CLNF& clnf, bool visualise = true); + // Grab the current predictions about AUs from the face analyser + std::vector> GetCurrentAUsClass() const; // AU presence + std::vector> GetCurrentAUsReg() const; // AU intensity + std::vector> GetCurrentAUsCombined() const; // Both presense and intensity - void Reset(); + // A standalone call for predicting AUs from a static image, the first element in the pair represents occurence the second intensity + // This call is useful for detecting action units in images + std::pair>, std::vector>> PredictStaticAUs(const cv::Mat& frame, const LandmarkDetector::CLNF& clnf, bool visualise = true); - void GetLatestHOG(cv::Mat_& hog_descriptor, int& num_rows, int& num_cols); - void GetLatestAlignedFace(cv::Mat& image); - - void GetLatestNeutralHOG(cv::Mat_& hog_descriptor, int& num_rows, int& num_cols); - - cv::Mat_ GetTriangulation(); + void Reset(); - cv::Mat_ GetLatestAlignedFaceGrayscale(); - - void GetGeomDescriptor(cv::Mat_& geom_desc); + void GetLatestHOG(cv::Mat_& hog_descriptor, int& num_rows, int& num_cols); + void GetLatestAlignedFace(cv::Mat& image); - void ExtractCurrentMedians(vector& hog_medians, vector& face_image_medians, vector& orientations); + void GetLatestNeutralHOG(cv::Mat_& hog_descriptor, int& num_rows, int& num_cols); - // Grab the names of AUs being predicted - std::vector GetAUClassNames() const; // Presence - std::vector GetAURegNames() const; // Intensity + cv::Mat_ GetTriangulation(); - // Identify if models are static or dynamic (useful for correction and shifting) - std::vector GetDynamicAUClass() const; // Presence - std::vector> GetDynamicAUReg() const; // Intensity + void GetGeomDescriptor(cv::Mat_& geom_desc); + + // Grab the names of AUs being predicted + std::vector GetAUClassNames() const; // Presence + std::vector GetAURegNames() const; // Intensity + + // Identify if models are static or dynamic (useful for correction and shifting) + std::vector GetDynamicAUClass() const; // Presence + std::vector> GetDynamicAUReg() const; // Intensity - void ExtractAllPredictionsOfflineReg(vector>>& au_predictions, vector& confidences, vector& successes, vector& timestamps, bool dynamic); - void ExtractAllPredictionsOfflineClass(vector>>& au_predictions, vector& confidences, vector& successes, vector& timestamps, bool dynamic); + void ExtractAllPredictionsOfflineReg(vector>>& au_predictions, vector& confidences, vector& successes, vector& timestamps, bool dynamic); + void ExtractAllPredictionsOfflineClass(vector>>& au_predictions, vector& confidences, vector& successes, vector& timestamps, bool dynamic); -private: + // Helper function for post-processing AU output files + void FaceAnalyser::PostprocessOutputFile(string output_file, bool dynamic); - // Where the predictions are kept - std::vector> AU_predictions_reg; - std::vector> AU_predictions_class; + private: - std::vector> AU_predictions_combined; + // Where the predictions are kept + std::vector> AU_predictions_reg; + std::vector> AU_predictions_class; - // Keeping track of AU predictions over time (useful for post-processing) - vector timestamps; - std::map> AU_predictions_reg_all_hist; - std::map> AU_predictions_class_all_hist; - std::vector confidences; - std::vector valid_preds; + std::vector> AU_predictions_combined; - int frames_tracking; + // Keeping track of AU predictions over time (useful for post-processing) + vector timestamps; + std::map> AU_predictions_reg_all_hist; + std::map> AU_predictions_class_all_hist; + std::vector confidences; + std::vector valid_preds; - // Cache of intermediate images - cv::Mat_ aligned_face_grayscale; - cv::Mat aligned_face; - cv::Mat hog_descriptor_visualisation; + int frames_tracking; - // Private members to be used for predictions - // The HOG descriptor of the last frame - cv::Mat_ hog_desc_frame; - int num_hog_rows; - int num_hog_cols; + // Cache of intermediate images + cv::Mat aligned_face_for_au; + cv::Mat aligned_face_for_output; + cv::Mat hog_descriptor_visualisation; - // Keep a running median of the hog descriptors and a aligned images - cv::Mat_ hog_desc_median; - cv::Mat_ face_image_median; + // Private members to be used for predictions + // The HOG descriptor of the last frame + cv::Mat_ hog_desc_frame; + int num_hog_rows; + int num_hog_cols; - // Use histograms for quick (but approximate) median computation - // Use the same for - vector > hog_desc_hist; + // Keep a running median of the hog descriptors and a aligned images + cv::Mat_ hog_desc_median; + cv::Mat_ face_image_median; - // This is not being used at the moment as it is a bit slow - vector > face_image_hist; - vector face_image_hist_sum; + // Use histograms for quick (but approximate) median computation + // Use the same for + vector > hog_desc_hist; - vector head_orientations; + // This is not being used at the moment as it is a bit slow + vector > face_image_hist; + vector face_image_hist_sum; - int num_bins_hog; - double min_val_hog; - double max_val_hog; - vector hog_hist_sum; - int view_used; + vector head_orientations; - // The geometry descriptor (rigid followed by non-rigid shape parameters from CLNF) - cv::Mat_ geom_descriptor_frame; - cv::Mat_ geom_descriptor_median; - - int geom_hist_sum; - cv::Mat_ geom_desc_hist; - int num_bins_geom; - double min_val_geom; - double max_val_geom; - - // Using the bounding box of previous analysed frame to determine if a reset is needed - cv::Rect_ face_bounding_box; - - // The AU predictions internally - std::vector> PredictCurrentAUs(int view); - std::vector> PredictCurrentAUsClass(int view); + int num_bins_hog; + double min_val_hog; + double max_val_hog; + vector hog_hist_sum; + int view_used; - // special step for online (rather than offline AU prediction) - std::vector> CorrectOnlineAUs(std::vector> predictions_orig, int view, bool dyn_shift = false, bool dyn_scale = false, bool update_track = true, bool clip_values = false); + // The geometry descriptor (rigid followed by non-rigid shape parameters from CLNF) + cv::Mat_ geom_descriptor_frame; + cv::Mat_ geom_descriptor_median; - void ReadAU(std::string au_location); + int geom_hist_sum; + cv::Mat_ geom_desc_hist; + int num_bins_geom; + double min_val_geom; + double max_val_geom; - void ReadRegressor(std::string fname, const vector& au_names); + // Using the bounding box of previous analysed frame to determine if a reset is needed + cv::Rect_ face_bounding_box; - // A utility function for keeping track of approximate running medians used for AU and emotion inference using a set of histograms (the histograms are evenly spaced from min_val to max_val) - // Descriptor has to be a row vector - // TODO this duplicates some other code - void UpdateRunningMedian(cv::Mat_& histogram, int& hist_sum, cv::Mat_& median, const cv::Mat_& descriptor, bool update, int num_bins, double min_val, double max_val); - void ExtractMedian(cv::Mat_& histogram, int hist_count, cv::Mat_& median, int num_bins, double min_val, double max_val); - - // The linear SVR regressors - SVR_static_lin_regressors AU_SVR_static_appearance_lin_regressors; - SVR_dynamic_lin_regressors AU_SVR_dynamic_appearance_lin_regressors; - - // The linear SVM classifiers - SVM_static_lin AU_SVM_static_appearance_lin; - SVM_dynamic_lin AU_SVM_dynamic_appearance_lin; + // The AU predictions internally + std::vector> PredictCurrentAUs(int view); + std::vector> PredictCurrentAUsClass(int view); - // The AUs predicted by the model are not always 0 calibrated to a person. That is they don't always predict 0 for a neutral expression - // Keeping track of the predictions we can correct for this, by assuming that at least "ratio" of frames are neutral and subtract that value of prediction, only perform the correction after min_frames - void UpdatePredictionTrack(cv::Mat_& prediction_corr_histogram, int& prediction_correction_count, vector& correction, const vector>& predictions, double ratio=0.25, int num_bins = 200, double min_val = -3, double max_val = 5, int min_frames = 10); - void GetSampleHist(cv::Mat_& prediction_corr_histogram, int prediction_correction_count, vector& sample, double ratio, int num_bins = 200, double min_val = 0, double max_val = 5); + // special step for online (rather than offline AU prediction) + std::vector> CorrectOnlineAUs(std::vector> predictions_orig, int view, bool dyn_shift = false, bool dyn_scale = false, bool update_track = true, bool clip_values = false); - void PostprocessPredictions(); + void ReadAU(std::string au_location); - vector> au_prediction_correction_histogram; - vector au_prediction_correction_count; + void ReadRegressor(std::string fname, const vector& au_names); - // Some dynamic scaling (the logic is that before the extreme versions of expression or emotion are shown, - // it is hard to tell the boundaries, this allows us to scale the model to the most extreme seen) - // They have to be view specific - vector> dyn_scaling; - - // Keeping track of predictions for summary stats - cv::Mat_ AU_prediction_track; - cv::Mat_ geom_desc_track; + // A utility function for keeping track of approximate running medians used for AU and emotion inference using a set of histograms (the histograms are evenly spaced from min_val to max_val) + // Descriptor has to be a row vector + // TODO this duplicates some other code + void UpdateRunningMedian(cv::Mat_& histogram, int& hist_sum, cv::Mat_& median, const cv::Mat_& descriptor, bool update, int num_bins, double min_val, double max_val); + void ExtractMedian(cv::Mat_& histogram, int hist_count, cv::Mat_& median, int num_bins, double min_val, double max_val); - double current_time_seconds; + // The linear SVR regressors + SVR_static_lin_regressors AU_SVR_static_appearance_lin_regressors; + SVR_dynamic_lin_regressors AU_SVR_dynamic_appearance_lin_regressors; - // Used for face alignment - cv::Mat_ triangulation; - double align_scale; - int align_width; - int align_height; + // The linear SVM classifiers + SVM_static_lin AU_SVM_static_appearance_lin; + SVM_dynamic_lin AU_SVM_dynamic_appearance_lin; - // Useful placeholder for renormalizing the initial frames of shorter videos - int max_init_frames = 3000; - vector> hog_desc_frames_init; - vector> geom_descriptor_frames_init; - vector views; - bool postprocessed = false; - int frames_tracking_succ = 0; + // The AUs predicted by the model are not always 0 calibrated to a person. That is they don't always predict 0 for a neutral expression + // Keeping track of the predictions we can correct for this, by assuming that at least "ratio" of frames are neutral and subtract that value of prediction, only perform the correction after min_frames + void UpdatePredictionTrack(cv::Mat_& prediction_corr_histogram, int& prediction_correction_count, vector& correction, const vector>& predictions, double ratio = 0.25, int num_bins = 200, double min_val = -3, double max_val = 5, int min_frames = 10); + void GetSampleHist(cv::Mat_& prediction_corr_histogram, int prediction_correction_count, vector& sample, double ratio, int num_bins = 200, double min_val = 0, double max_val = 5); -}; - //=========================================================================== + void PostprocessPredictions(); + + vector> au_prediction_correction_histogram; + vector au_prediction_correction_count; + + // Some dynamic scaling (the logic is that before the extreme versions of expression or emotion are shown, + // it is hard to tell the boundaries, this allows us to scale the model to the most extreme seen) + // They have to be view specific + vector> dyn_scaling; + + // Keeping track of predictions for summary stats + cv::Mat_ AU_prediction_track; + cv::Mat_ geom_desc_track; + + double current_time_seconds; + + // Used for face alignment + cv::Mat_ triangulation; + double align_scale; + int align_width; + int align_height; + + // Useful placeholder for renormalizing the initial frames of shorter videos + int max_init_frames = 3000; + vector> hog_desc_frames_init; + vector> geom_descriptor_frames_init; + vector views; + bool postprocessed = false; + int frames_tracking_succ = 0; + + }; + //=========================================================================== } #endif diff --git a/lib/local/FaceAnalyser/src/FaceAnalyser.cpp b/lib/local/FaceAnalyser/src/FaceAnalyser.cpp index d32c823..757d3f2 100644 --- a/lib/local/FaceAnalyser/src/FaceAnalyser.cpp +++ b/lib/local/FaceAnalyser/src/FaceAnalyser.cpp @@ -226,7 +226,7 @@ void FaceAnalyser::GetLatestHOG(cv::Mat_& hog_descriptor, int& num_rows, void FaceAnalyser::GetLatestAlignedFace(cv::Mat& image) { - image = this->aligned_face.clone(); + image = this->aligned_face_for_output.clone(); } void FaceAnalyser::GetLatestNeutralHOG(cv::Mat_& hog_descriptor, int& num_rows, int& num_cols) @@ -267,57 +267,22 @@ int GetViewId(const vector orientations_all, const cv::Vec3d& orienta } -void FaceAnalyser::ExtractCurrentMedians(vector& hog_medians, vector& face_image_medians, vector& orientations) -{ - - orientations = this->head_orientations; - - for(size_t i = 0; i < orientations.size(); ++i) - { - cv::Mat_ median_face(this->face_image_median.rows, this->face_image_median.cols, 0.0); - cv::Mat_ median_hog(this->hog_desc_median.rows, this->hog_desc_median.cols, 0.0); - - ExtractMedian(this->face_image_hist[i], this->face_image_hist_sum[i], median_face, 256, 0, 255); - ExtractMedian(this->hog_desc_hist[i], this->hog_hist_sum[i], median_hog, this->num_bins_hog, 0, 1); - - // Add the HOG sample - hog_medians.push_back(median_hog.clone()); - - // For the face image need to convert it to suitable format - cv::Mat_ aligned_face_cols_uchar; - median_face.convertTo(aligned_face_cols_uchar, CV_8U); - - cv::Mat aligned_face_uchar; - if(aligned_face.channels() == 1) - { - aligned_face_uchar = cv::Mat(aligned_face.rows, aligned_face.cols, CV_8U, aligned_face_cols_uchar.data); - } - else - { - aligned_face_uchar = cv::Mat(aligned_face.rows, aligned_face.cols, CV_8UC3, aligned_face_cols_uchar.data); - } - - face_image_medians.push_back(aligned_face_uchar.clone()); - - } -} - std::pair>, std::vector>> FaceAnalyser::PredictStaticAUs(const cv::Mat& frame, const LandmarkDetector::CLNF& clnf, bool visualise) { - + // First align the face - AlignFaceMask(aligned_face, frame, clnf, triangulation, true, align_scale, align_width, align_height); - + AlignFaceMask(aligned_face_for_au, frame, clnf, triangulation, true, 0.7, 112, 112); + // Extract HOG descriptor from the frame and convert it to a useable format cv::Mat_ hog_descriptor; - Extract_FHOG_descriptor(hog_descriptor, aligned_face, this->num_hog_rows, this->num_hog_cols); + Extract_FHOG_descriptor(hog_descriptor, aligned_face_for_au, this->num_hog_rows, this->num_hog_cols); // Store the descriptor hog_desc_frame = hog_descriptor; cv::Vec3d curr_orient(clnf.params_global[1], clnf.params_global[2], clnf.params_global[3]); int orientation_to_use = GetViewId(this->head_orientations, curr_orient); - + // Geom descriptor and its median geom_descriptor_frame = clnf.params_local.t(); @@ -325,11 +290,11 @@ std::pair>, std::vector locs = clnf.pdm.princ_comp * geom_descriptor_frame.t(); cv::hconcat(locs.t(), geom_descriptor_frame.clone(), geom_descriptor_frame); - - // First convert the face image to double representation as a row vector - cv::Mat_ aligned_face_cols(1, aligned_face.cols * aligned_face.rows * aligned_face.channels(), aligned_face.data, 1); - cv::Mat_ aligned_face_cols_double; - aligned_face_cols.convertTo(aligned_face_cols_double, CV_64F); + + // First convert the face image to double representation as a row vector, TODO rem + //cv::Mat_ aligned_face_cols(1, aligned_face_for_au.cols * aligned_face_for_au.rows * aligned_face_for_au.channels(), aligned_face_for_au.data, 1); + //cv::Mat_ aligned_face_cols_double; + //aligned_face_cols.convertTo(aligned_face_cols_double, CV_64F); // Visualising the median HOG if (visualise) @@ -361,29 +326,34 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL frames_tracking++; // First align the face if tracking was successfull - if(clnf_model.detection_success) + if (clnf_model.detection_success) { - AlignFaceMask(aligned_face, frame, clnf_model, triangulation, true, align_scale, align_width, align_height); - } - else - { - aligned_face = cv::Mat(align_height, align_width, CV_8UC3); - aligned_face.setTo(0); - } - if(aligned_face.channels() == 3) - { - cv::cvtColor(aligned_face, aligned_face_grayscale, CV_BGR2GRAY); + // The aligned face requirement for AUs + AlignFaceMask(aligned_face_for_au, frame, clnf_model, triangulation, true, 0.7, 112, 112); + + // If the output requirement matches use the already computed one, else compute it again + if (align_scale == 0.7 && align_width == 112 && align_height == 112) + { + aligned_face_for_output = aligned_face_for_au.clone(); + } + else + { + AlignFaceMask(aligned_face_for_output, frame, clnf_model, triangulation, true, align_scale, align_width, align_height); + } } else { - aligned_face_grayscale = aligned_face.clone(); + aligned_face_for_output = cv::Mat(align_height, align_width, CV_8UC3); + aligned_face_for_au = cv::Mat(112, 112, CV_8UC3); + aligned_face_for_output.setTo(0); + aligned_face_for_au.setTo(0); } // Extract HOG descriptor from the frame and convert it to a useable format cv::Mat_ hog_descriptor; - Extract_FHOG_descriptor(hog_descriptor, aligned_face, this->num_hog_rows, this->num_hog_cols); - + Extract_FHOG_descriptor(hog_descriptor, aligned_face_for_au, this->num_hog_rows, this->num_hog_cols); + // Store the descriptor hog_desc_frame = hog_descriptor; @@ -425,41 +395,38 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL frames_tracking_succ++; // A small speedup - if(frames_tracking % 2 == 1) + if (frames_tracking % 2 == 1) { UpdateRunningMedian(this->hog_desc_hist[orientation_to_use], this->hog_hist_sum[orientation_to_use], this->hog_desc_median, hog_descriptor, update_median, this->num_bins_hog, this->min_val_hog, this->max_val_hog); this->hog_desc_median.setTo(0, this->hog_desc_median < 0); - } + } // Geom descriptor and its median geom_descriptor_frame = clnf_model.params_local.t(); - - if(!clnf_model.detection_success) + + if (!clnf_model.detection_success) { geom_descriptor_frame.setTo(0); } // Stack with the actual feature point locations (without mean) cv::Mat_ locs = clnf_model.pdm.princ_comp * geom_descriptor_frame.t(); - + cv::hconcat(locs.t(), geom_descriptor_frame.clone(), geom_descriptor_frame); - + // A small speedup - if(frames_tracking % 2 == 1) + if (frames_tracking % 2 == 1) { UpdateRunningMedian(this->geom_desc_hist, this->geom_hist_sum, this->geom_descriptor_median, geom_descriptor_frame, update_median, this->num_bins_geom, this->min_val_geom, this->max_val_geom); } - // First convert the face image to double representation as a row vector - cv::Mat_ aligned_face_cols(1, aligned_face.cols * aligned_face.rows * aligned_face.channels(), aligned_face.data, 1); - cv::Mat_ aligned_face_cols_double; - aligned_face_cols.convertTo(aligned_face_cols_double, CV_64F); - - // TODO get rid of this completely as it takes too long? - //UpdateRunningMedian(this->face_image_hist[orientation_to_use], this->face_image_hist_sum[orientation_to_use], this->face_image_median, aligned_face_cols_double, update_median, 256, 0, 255); + // First convert the face image to double representation as a row vector, TODO rem? + //cv::Mat_ aligned_face_cols(1, aligned_face.cols * aligned_face.rows * aligned_face.channels(), aligned_face.data, 1); + //cv::Mat_ aligned_face_cols_double; + //aligned_face_cols.convertTo(aligned_face_cols_double, CV_64F); // Visualising the median HOG - if(visualise) + if (visualise) { FaceAnalysis::Visualise_FHOG(hog_descriptor, num_hog_rows, num_hog_cols, hog_descriptor_visualisation); } @@ -468,9 +435,9 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL AU_predictions_reg = PredictCurrentAUs(orientation_to_use); std::vector> AU_predictions_reg_corrected; - if(online) + if (online) { - AU_predictions_reg_corrected = CorrectOnlineAUs(AU_predictions_reg, orientation_to_use, true, false, clnf_model.detection_success); + AU_predictions_reg_corrected = CorrectOnlineAUs(AU_predictions_reg, orientation_to_use, true, false, clnf_model.detection_success, true); } // Add the reg predictions to the historic data @@ -479,7 +446,7 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL // Find the appropriate AU (if not found add it) // Only add if the detection was successful - if(clnf_model.detection_success) + if (clnf_model.detection_success) { AU_predictions_reg_all_hist[AU_predictions_reg[au].first].push_back(AU_predictions_reg[au].second); } @@ -488,7 +455,7 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL AU_predictions_reg_all_hist[AU_predictions_reg[au].first].push_back(0); } } - + AU_predictions_class = PredictCurrentAUsClass(orientation_to_use); for (size_t au = 0; au < AU_predictions_class.size(); ++au) @@ -496,7 +463,7 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL // Find the appropriate AU (if not found add it) // Only add if the detection was successful - if(clnf_model.detection_success) + if (clnf_model.detection_success) { AU_predictions_class_all_hist[AU_predictions_class[au].first].push_back(AU_predictions_class[au].second); } @@ -505,9 +472,9 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL AU_predictions_class_all_hist[AU_predictions_class[au].first].push_back(0); } } - - if(online) + + if (online) { AU_predictions_reg = AU_predictions_reg_corrected; } @@ -524,15 +491,13 @@ void FaceAnalyser::AddNextFrame(const cv::Mat& frame, const LandmarkDetector::CL this->current_time_seconds = timestamp_seconds; view_used = orientation_to_use; - + bool success = clnf_model.detection_success; confidences.push_back(clnf_model.detection_certainty); valid_preds.push_back(success); timestamps.push_back(timestamp_seconds); - - } void FaceAnalyser::GetGeomDescriptor(cv::Mat_& geom_desc) @@ -1101,12 +1066,6 @@ vector> FaceAnalyser::PredictCurrentAUsClass(int view) return predictions; } - -cv::Mat_ FaceAnalyser::GetLatestAlignedFaceGrayscale() -{ - return aligned_face_grayscale.clone(); -} - cv::Mat FaceAnalyser::GetLatestHOGDescriptorVisualisation() { return hog_descriptor_visualisation; diff --git a/lib/local/FaceAnalyser/src/Face_utils.cpp b/lib/local/FaceAnalyser/src/Face_utils.cpp index 52e0094..b6d4eb5 100644 --- a/lib/local/FaceAnalyser/src/Face_utils.cpp +++ b/lib/local/FaceAnalyser/src/Face_utils.cpp @@ -221,19 +221,19 @@ namespace FaceAnalysis destination_landmarks.col(1) = destination_landmarks.col(1) + warp_matrix(1,2); // Move the eyebrows up to include more of upper face - destination_landmarks.at(0,1) -= 30; - destination_landmarks.at(16,1) -= 30; + destination_landmarks.at(0,1) -= (30/0.7)*sim_scale; + destination_landmarks.at(16,1) -= (30 / 0.7)*sim_scale; - destination_landmarks.at(17,1) -= 30; - destination_landmarks.at(18,1) -= 30; - destination_landmarks.at(19,1) -= 30; - destination_landmarks.at(20,1) -= 30; - destination_landmarks.at(21,1) -= 30; - destination_landmarks.at(22,1) -= 30; - destination_landmarks.at(23,1) -= 30; - destination_landmarks.at(24,1) -= 30; - destination_landmarks.at(25,1) -= 30; - destination_landmarks.at(26,1) -= 30; + destination_landmarks.at(17,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(18,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(19,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(20,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(21,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(22,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(23,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(24,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(25,1) -= (30 / 0.7)*sim_scale; + destination_landmarks.at(26,1) -= (30 / 0.7)*sim_scale; destination_landmarks = cv::Mat(destination_landmarks.t()).reshape(1, 1).t(); diff --git a/lib/local/LandmarkDetector/src/LandmarkDetectorModel.cpp b/lib/local/LandmarkDetector/src/LandmarkDetectorModel.cpp index f4e0707..cc3ed32 100644 --- a/lib/local/LandmarkDetector/src/LandmarkDetectorModel.cpp +++ b/lib/local/LandmarkDetector/src/LandmarkDetectorModel.cpp @@ -366,6 +366,9 @@ void CLNF::Read(string main_location) // The other module locations should be defined as relative paths from the main model boost::filesystem::path root = boost::filesystem::path(main_location).parent_path(); + // Assume no eye model, unless read-in + eye_model = false; + // The main file contains the references to other files while (!locations.eof()) { @@ -387,6 +390,7 @@ void CLNF::Read(string main_location) location = location.substr(0, location.size()-1); } + // append to root location = (root / location).string(); if (module.compare("LandmarkDetector") == 0) @@ -536,7 +540,6 @@ void CLNF::Read(string main_location) tracking_initialised = false; model_likelihood = -10; // very low detection_certainty = 1; // very uncertain - eye_model = false; // Initialising default values for the rest of the variables diff --git a/matlab_runners/Demos/feature_extraction_demo_img_seq.m b/matlab_runners/Demos/feature_extraction_demo_img_seq.m index d551304..9d72344 100644 --- a/matlab_runners/Demos/feature_extraction_demo_img_seq.m +++ b/matlab_runners/Demos/feature_extraction_demo_img_seq.m @@ -35,7 +35,7 @@ for i=1:numel(in_dirs) command = cat(2, command, ['-asvid -fdir "' in_dirs{i} '" -of "' outputFile '" ']); - command = cat(2, command, [' -simalign "' outputDir_aligned '" -hogalign "' outputHOG_aligned '"']); + command = cat(2, command, [' -simalign "' outputDir_aligned '" -simsize 200 -hogalign "' outputHOG_aligned '"']); end diff --git a/matlab_runners/Gaze Experiments/mpii_1500_errs.mat b/matlab_runners/Gaze Experiments/mpii_1500_errs.mat index 7b726db24f24ac86ff36288f1200286402b4b5a5..e006f70e0d276b53850ac21e7d8dbfef7061da8d 100644 GIT binary patch delta 41 wcmX>ZeKLB2i9~p6ih^%qk%EDRf}w$xp{bRzv4W9-q4~r><%tQb8%siU0Th}HS^xk5 delta 41 wcmX>ZeKLB2i9|?7se)Hxo`Qj?f}x?6p}Ccbxq^{_q4~r><%tQb8%siU0TwR|X#fBK From 179afdcabcf4758e97a1acc24f76be8a6148a890 Mon Sep 17 00:00:00 2001 From: Tadas Baltrusaitis Date: Wed, 8 Mar 2017 11:53:25 -0500 Subject: [PATCH 2/3] Sample scaled images. --- imgs/frame_det_000000_112x112_0.7.bmp | Bin 0 -> 37686 bytes imgs/frame_det_000001_112x112_0.5.bmp | Bin 0 -> 37686 bytes imgs/frame_det_000001_200x200_0.7.bmp | Bin 0 -> 120054 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 imgs/frame_det_000000_112x112_0.7.bmp create mode 100644 imgs/frame_det_000001_112x112_0.5.bmp create mode 100644 imgs/frame_det_000001_200x200_0.7.bmp diff --git a/imgs/frame_det_000000_112x112_0.7.bmp b/imgs/frame_det_000000_112x112_0.7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9bb5fefbd05dbb18d3f9a513732de528cba8ea2b GIT binary patch literal 37686 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�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 literal 0 HcmV?d00001 diff --git a/imgs/frame_det_000001_112x112_0.5.bmp b/imgs/frame_det_000001_112x112_0.5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5b0bfc6ff8aa16c368f0d4305d61f7ca38829dd7 GIT binary patch literal 37686 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 literal 0 HcmV?d00001 diff --git a/imgs/frame_det_000001_200x200_0.7.bmp b/imgs/frame_det_000001_200x200_0.7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fddb315df0acaafc5005c5fcf30c38975ce04836 GIT binary patch literal 120054 zcmeFacXXupbtUNeYmR3|mc#h0JhR@j>v6VLv$8E&5@m{#NClG3?q&xxa?UvyD(9SY zLKQ*Cw!zXa~1P-6T;S)G~0*6oF@Cp1fp1`X`?4K2}e_F);c_H()64vV_%%7KVe_F_V zrI7KXJm!z{=s(P%zLZOUF^fj7x%3zE=-i&^yVXHmYBMfr7j28UncKid;HS|vPIB{)&ZKUFQt zt{3MuN%NbeIgPU1W_fmlEW1H|rdFC&r^;^7oT=Aj)~ip~sWKXLZ`P>J)TvI_C{Nd` zGU}8ks^xE1%TCwGvl?U>wUUflaYn5mvr%%YR`5m{_a}w)mvY)(%;|U`i}L*(>i4oK z-v!=sI{w-I4Tpcwm+1){uNJ;pBR*9p&T5k7Hpudu6}iod!Zuw&i$1^Ikl$|3X*Fdx zo3dKW+3l8`HfwgfHM7NfrrDC&Y&+FrIo)VH(`?RYHlAuS;CixAf1*KmvO#~k(QvX( zcdAyCQK!jjQoUI#$!b<)H%P&IuNF~X&hPkcR{M9e+rO7dc_Et$fW43fq|v`j59aV| z`KLUAH!4NPYsANEL}%*6IgRpy7FA)Jrl4I{M6ndmItysdJZe`ytt+42LxSnfrMZik zo@{D&4z;_0;mW7?;+jY6$?oXMqI6|ZoM+k`neC2@7TYP@bab7e*fLwqr<;w469jd} zj3&d0dexhCijy_s%m!gb9rx$Ow3mRWOzPj9ZvRdu?Yo)O?`F}yl|lJVCiS24PdfZP zzq%)IvPOzjb+lS~v|60iC@pN)me7rbRBJK4tB3)>^c1l?MQm>YyRU%LSHuk#^ZaGJ zKnXuk$_tk9gT)+w0jsZ!8!E-?f?x?ZP{j5j@>xE-UcmI`(prT}v->jCLt`=p~@lRB8f0ozrVpjVLXWGA;0S2Rf zFN^v@CW^84U)^&${G0!=PvCf!^jM|jSheV6wFvc3QM;~`VJTsEmvG!ATz4toU&;>^ z3&Ul?NV&AXLfK!X7_5>GR7&GDQrzG=P$MI+)Zkv+Unw4_62&Wp{T1SPxhPu950whS zMcfdeSj6)q^0<>-xIlE^vD1{!lWq3X&8Cwrrc=$DlXa?7b@Jm?!qYW^ zlQozMIt|f!4B!`ANxK2C4SziS_M+i@j3-Sb-G@b-6SjN(3jEe z)dEk2G*B)HmrG*h(pZH&Uad^jD3i77p+@aUy*AaP9cfUF)+>h_)nj$aRFi77K|R{2 z9&OQ%H>pM%)FbuERHGtQBTH1t5*3m}8PF(;S4juU#QkN$XbC@3!V4Ai0=Wzjpf8K= z$)UTmX&%5Vi_(3D+IgB{JKbW+Y%!gz*CI0>tCrv_nNce|QOP@A#y(cc{z)G7huLl4 zKhyg6S#5upMFWrh5+B>)U-dtI0;g*gh!b`4V>MEI!nADr z5TB`?Xj6?fsmJP-Kw7FsnW|L{S4tBVqJc8eV2QB5NDwXKgTz9GY+p9rm&5dBP(9gn z&l!5p8LA_j?gYAyH5pGg=}$GFwwEDJREysz=e}ObJzB~+UdcUC1)+m|w3PiyLC24B zX)k6`UO00oR{T%D>0jtCWHc&HHONlZNlwxM^JLL_GpXHYXpYlumdrLYj*zDswa07aZ&b;TR>@wg6uwq2e4||S zY8n5va^C9|+@qB|0PJ`f=d}{%>&1tn>lX^5|LzYz-KaWQuRPr-�H3u9IZe%Svhb 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 literal 0 HcmV?d00001 From 1c546298b8407ea909bb2db53922ae9eb7c8b33e Mon Sep 17 00:00:00 2001 From: Tadas Baltrusaitis Date: Wed, 8 Mar 2017 14:25:13 -0500 Subject: [PATCH 3/3] A small fix for linux compilation. --- exe/FeatureExtraction/FeatureExtraction.cpp | 119 +---------------- lib/local/FaceAnalyser/include/FaceAnalyser.h | 2 +- lib/local/FaceAnalyser/src/FaceAnalyser.cpp | 120 +++++++++++++++++- 3 files changed, 122 insertions(+), 119 deletions(-) diff --git a/exe/FeatureExtraction/FeatureExtraction.cpp b/exe/FeatureExtraction/FeatureExtraction.cpp index ea8e6be..ca4ea97 100644 --- a/exe/FeatureExtraction/FeatureExtraction.cpp +++ b/exe/FeatureExtraction/FeatureExtraction.cpp @@ -717,10 +717,10 @@ int main (int argc, char **argv) output_file.close(); - if(output_files.size() > 0 && output_AUs) + if (output_files.size() > 0 && output_AUs) { cout << "Postprocessing the Action Unit predictions" << endl; - post_process_output_file(face_analyser, output_files[f_n], dynamic); + face_analyser.PostprocessOutputFile(output_files[f_n], dynamic); } // Reset the models for the next video face_analyser.Reset(); @@ -744,121 +744,6 @@ int main (int argc, char **argv) return 0; } -// Allows for post processing of the AU signal -void post_process_output_file(FaceAnalysis::FaceAnalyser& face_analyser, string output_file, bool dynamic) -{ - - vector certainties; - vector successes; - vector timestamps; - vector>> predictions_reg; - vector>> predictions_class; - - // Construct the new values to overwrite the output file with - face_analyser.ExtractAllPredictionsOfflineReg(predictions_reg, certainties, successes, timestamps, dynamic); - face_analyser.ExtractAllPredictionsOfflineClass(predictions_class, certainties, successes, timestamps, dynamic); - - int num_class = predictions_class.size(); - int num_reg = predictions_reg.size(); - - // Extract the indices of writing out first - vector au_reg_names = face_analyser.GetAURegNames(); - std::sort(au_reg_names.begin(), au_reg_names.end()); - vector inds_reg; - - // write out ar the correct index - for (string au_name : au_reg_names) - { - for (int i = 0; i < num_reg; ++i) - { - if (au_name.compare(predictions_reg[i].first) == 0) - { - inds_reg.push_back(i); - break; - } - } - } - - vector au_class_names = face_analyser.GetAUClassNames(); - std::sort(au_class_names.begin(), au_class_names.end()); - vector inds_class; - - // write out ar the correct index - for (string au_name : au_class_names) - { - for (int i = 0; i < num_class; ++i) - { - if (au_name.compare(predictions_class[i].first) == 0) - { - inds_class.push_back(i); - break; - } - } - } - // Read all of the output file in - vector output_file_contents; - - std::ifstream infile(output_file); - string line; - - while (std::getline(infile, line)) - output_file_contents.push_back(line); - - infile.close(); - - // Read the header and find all _r and _c parts in a file and use their indices - std::vector tokens; - boost::split(tokens, output_file_contents[0], boost::is_any_of(",")); - - int begin_ind = -1; - - for (size_t i = 0; i < tokens.size(); ++i) - { - if (tokens[i].find("AU") != string::npos && begin_ind == -1) - { - begin_ind = i; - break; - } - } - int end_ind = begin_ind + num_class + num_reg; - - // Now overwrite the whole file - std::ofstream outfile(output_file, ios_base::out); - // Write the header - outfile << output_file_contents[0].c_str() << endl; - - // Write the contents - for (int i = 1; i < (int)output_file_contents.size(); ++i) - { - std::vector tokens; - boost::split(tokens, output_file_contents[i], boost::is_any_of(",")); - - outfile << tokens[0]; - - for (int t = 1; t < (int)tokens.size(); ++t) - { - if (t >= begin_ind && t < end_ind) - { - if(t - begin_ind < num_reg) - { - outfile << ", " << predictions_reg[inds_reg[t - begin_ind]].second[i - 1]; - } - else - { - outfile << ", " << predictions_class[inds_class[t - begin_ind - num_reg]].second[i - 1]; - } - } - else - { - outfile << ", " << tokens[t]; - } - } - outfile << endl; - } - - -} - void prepareOutputFile(std::ofstream* output_file, bool output_2D_landmarks, bool output_3D_landmarks, bool output_model_params, bool output_pose, bool output_AUs, bool output_gaze, int num_landmarks, int num_model_modes, vector au_names_class, vector au_names_reg) diff --git a/lib/local/FaceAnalyser/include/FaceAnalyser.h b/lib/local/FaceAnalyser/include/FaceAnalyser.h index f55d455..f4d262d 100644 --- a/lib/local/FaceAnalyser/include/FaceAnalyser.h +++ b/lib/local/FaceAnalyser/include/FaceAnalyser.h @@ -127,7 +127,7 @@ namespace FaceAnalysis void ExtractAllPredictionsOfflineClass(vector>>& au_predictions, vector& confidences, vector& successes, vector& timestamps, bool dynamic); // Helper function for post-processing AU output files - void FaceAnalyser::PostprocessOutputFile(string output_file, bool dynamic); + void PostprocessOutputFile(string output_file, bool dynamic); private: diff --git a/lib/local/FaceAnalyser/src/FaceAnalyser.cpp b/lib/local/FaceAnalyser/src/FaceAnalyser.cpp index 757d3f2..5de97f7 100644 --- a/lib/local/FaceAnalyser/src/FaceAnalyser.cpp +++ b/lib/local/FaceAnalyser/src/FaceAnalyser.cpp @@ -1257,4 +1257,122 @@ void FaceAnalyser::ReadRegressor(std::string fname, const vector& au_nam double FaceAnalyser::GetCurrentTimeSeconds() { return current_time_seconds; -} \ No newline at end of file +} + +// Allows for post processing of the AU signal +void FaceAnalyser::PostprocessOutputFile(string output_file, bool dynamic) +{ + + vector certainties; + vector successes; + vector timestamps; + vector>> predictions_reg; + vector>> predictions_class; + + // Construct the new values to overwrite the output file with + ExtractAllPredictionsOfflineReg(predictions_reg, certainties, successes, timestamps, dynamic); + ExtractAllPredictionsOfflineClass(predictions_class, certainties, successes, timestamps, dynamic); + + int num_class = predictions_class.size(); + int num_reg = predictions_reg.size(); + + // Extract the indices of writing out first + vector au_reg_names = GetAURegNames(); + std::sort(au_reg_names.begin(), au_reg_names.end()); + vector inds_reg; + + // write out ar the correct index + for (string au_name : au_reg_names) + { + for (int i = 0; i < num_reg; ++i) + { + if (au_name.compare(predictions_reg[i].first) == 0) + { + inds_reg.push_back(i); + break; + } + } + } + + vector au_class_names = GetAUClassNames(); + std::sort(au_class_names.begin(), au_class_names.end()); + vector inds_class; + + // write out ar the correct index + for (string au_name : au_class_names) + { + for (int i = 0; i < num_class; ++i) + { + if (au_name.compare(predictions_class[i].first) == 0) + { + inds_class.push_back(i); + break; + } + } + } + // Read all of the output file in + vector output_file_contents; + + std::ifstream infile(output_file); + string line; + + while (std::getline(infile, line)) + output_file_contents.push_back(line); + + infile.close(); + + // Read the header and find all _r and _c parts in a file and use their indices + std::vector tokens; + boost::split(tokens, output_file_contents[0], boost::is_any_of(",")); + + int begin_ind = -1; + + for (size_t i = 0; i < tokens.size(); ++i) + { + if (tokens[i].find("AU") != string::npos && begin_ind == -1) + { + begin_ind = i; + break; + } + } + int end_ind = begin_ind + num_class + num_reg; + + // Now overwrite the whole file + std::ofstream outfile(output_file, ios_base::out); + // Write the header + outfile << std::setprecision(4); + outfile << output_file_contents[0].c_str() << endl; + + // Write the contents + for (int i = 1; i < (int)output_file_contents.size(); ++i) + { + std::vector tokens; + boost::split(tokens, output_file_contents[i], boost::is_any_of(",")); + + boost::trim(tokens[0]); + outfile << tokens[0]; + + for (int t = 1; t < (int)tokens.size(); ++t) + { + if (t >= begin_ind && t < end_ind) + { + if (t - begin_ind < num_reg) + { + outfile << ", " << predictions_reg[inds_reg[t - begin_ind]].second[i - 1]; + } + else + { + outfile << ", " << predictions_class[inds_class[t - begin_ind - num_reg]].second[i - 1]; + } + } + else + { + boost::trim(tokens[t]); + outfile << ", " << tokens[t]; + } + } + outfile << endl; + } + + +}