Merge branch 'feature/separate_recorder' into develop
This commit is contained in:
commit
843dedc1f3
4 changed files with 3 additions and 342 deletions
|
@ -48,15 +48,6 @@ namespace LandmarkDetector
|
|||
//===========================================================================
|
||||
// Defining a set of useful utility functions to be used within CLNF
|
||||
|
||||
|
||||
//=============================================================================================
|
||||
// Helper functions for parsing the inputs
|
||||
//=============================================================================================
|
||||
void get_video_input_output_params(vector<string> &input_video_file, vector<string> &output_files, string &output_codec, vector<string> &arguments);
|
||||
|
||||
void get_image_input_output_params(vector<string> &input_image_files, vector<string> &output_feature_files, vector<string> &output_pose_files, vector<string> &output_image_files,
|
||||
vector<cv::Rect_<double>> &input_bounding_boxes, vector<string> &arguments);
|
||||
|
||||
//===========================================================================
|
||||
// Fast patch expert response computation (linear model across a ROI) using normalised cross-correlation
|
||||
//===========================================================================
|
||||
|
|
|
@ -40,341 +40,11 @@
|
|||
#include <opencv2/core/core.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
|
||||
// Boost includes
|
||||
#include <filesystem.hpp>
|
||||
#include <filesystem/fstream.hpp>
|
||||
|
||||
using namespace boost::filesystem;
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace LandmarkDetector
|
||||
{
|
||||
|
||||
|
||||
// Useful utility for creating directories for storing the output files
|
||||
void create_directory_from_file(string output_path)
|
||||
{
|
||||
|
||||
// Creating the right directory structure
|
||||
|
||||
// First get rid of the file
|
||||
auto p = path(path(output_path).parent_path());
|
||||
|
||||
if(!p.empty() && !boost::filesystem::exists(p))
|
||||
{
|
||||
bool success = boost::filesystem::create_directories(p);
|
||||
if(!success)
|
||||
{
|
||||
cout << "Failed to create a directory... " << p.string() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Useful utility for creating directories for storing the output files
|
||||
void create_directories(string output_path)
|
||||
{
|
||||
|
||||
// Creating the right directory structure
|
||||
|
||||
// First get rid of the file
|
||||
auto p = path(output_path);
|
||||
|
||||
if(!p.empty() && !boost::filesystem::exists(p))
|
||||
{
|
||||
bool success = boost::filesystem::create_directories(p);
|
||||
if(!success)
|
||||
{
|
||||
cout << "Failed to create a directory... " << p.string() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Extracting the following command line arguments -f, -op, -of, -ov (and possible ordered repetitions)
|
||||
void get_video_input_output_params(vector<string> &input_video_files, vector<string> &output_files, string& output_codec, vector<string> &arguments)
|
||||
{
|
||||
bool* valid = new bool[arguments.size()];
|
||||
|
||||
for(size_t i = 0; i < arguments.size(); ++i)
|
||||
{
|
||||
valid[i] = true;
|
||||
}
|
||||
|
||||
// By default use DIVX codec
|
||||
output_codec = "DIVX";
|
||||
|
||||
string input_root = "";
|
||||
string output_root = "";
|
||||
|
||||
string separator = string(1, boost::filesystem::path::preferred_separator);
|
||||
|
||||
// First check if there is a root argument (so that videos and outputs could be defined more easilly)
|
||||
for(size_t i = 0; i < arguments.size(); ++i)
|
||||
{
|
||||
if (arguments[i].compare("-root") == 0)
|
||||
{
|
||||
input_root = arguments[i + 1] + separator;
|
||||
output_root = arguments[i + 1] + separator;
|
||||
|
||||
// Add the / or \ to the directory
|
||||
i++;
|
||||
}
|
||||
if (arguments[i].compare("-inroot") == 0)
|
||||
{
|
||||
input_root = arguments[i + 1] + separator;
|
||||
i++;
|
||||
}
|
||||
if (arguments[i].compare("-outroot") == 0)
|
||||
{
|
||||
output_root = arguments[i + 1] + separator;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < arguments.size(); ++i)
|
||||
{
|
||||
if (arguments[i].compare("-f") == 0)
|
||||
{
|
||||
input_video_files.push_back(input_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-of") == 0)
|
||||
{
|
||||
output_files.push_back(output_root + arguments[i + 1]);
|
||||
create_directory_from_file(output_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-oc") == 0)
|
||||
{
|
||||
if(arguments[i + 1].length() == 4)
|
||||
output_codec = arguments[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=arguments.size()-1; i >= 0; --i)
|
||||
{
|
||||
if(!valid[i])
|
||||
{
|
||||
arguments.erase(arguments.begin()+i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void get_image_input_output_params(vector<string> &input_image_files, vector<string> &output_feature_files, vector<string> &output_pose_files, vector<string> &output_image_files,
|
||||
vector<cv::Rect_<double>> &input_bounding_boxes, vector<string> &arguments)
|
||||
{
|
||||
bool* valid = new bool[arguments.size()];
|
||||
|
||||
string out_pts_dir, out_pose_dir, out_img_dir;
|
||||
|
||||
string input_root = "";
|
||||
string output_root = "";
|
||||
|
||||
string separator = string(1, boost::filesystem::path::preferred_separator);
|
||||
|
||||
// First check if there is a root argument (so that videos and outputs could be defined more easilly)
|
||||
for (size_t i = 0; i < arguments.size(); ++i)
|
||||
{
|
||||
if (arguments[i].compare("-root") == 0)
|
||||
{
|
||||
input_root = arguments[i + 1] + separator;
|
||||
output_root = arguments[i + 1] + separator;
|
||||
i++;
|
||||
}
|
||||
if (arguments[i].compare("-inroot") == 0)
|
||||
{
|
||||
input_root = arguments[i + 1] + separator;
|
||||
i++;
|
||||
}
|
||||
if (arguments[i].compare("-outroot") == 0)
|
||||
{
|
||||
output_root = arguments[i + 1] + separator;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < arguments.size(); ++i)
|
||||
{
|
||||
valid[i] = true;
|
||||
if (arguments[i].compare("-f") == 0)
|
||||
{
|
||||
input_image_files.push_back(input_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-fdir") == 0)
|
||||
{
|
||||
|
||||
// parse the -fdir directory by reading in all of the .png and .jpg files in it
|
||||
path image_directory (arguments[i+1]);
|
||||
|
||||
try
|
||||
{
|
||||
// does the file exist and is it a directory
|
||||
if (exists(image_directory) && is_directory(image_directory))
|
||||
{
|
||||
|
||||
vector<path> file_in_directory;
|
||||
copy(directory_iterator(image_directory), directory_iterator(), back_inserter(file_in_directory));
|
||||
|
||||
// Sort the images in the directory first
|
||||
sort(file_in_directory.begin(), file_in_directory.end());
|
||||
|
||||
for (vector<path>::const_iterator file_iterator (file_in_directory.begin()); file_iterator != file_in_directory.end(); ++file_iterator)
|
||||
{
|
||||
// Possible image extension .jpg and .png
|
||||
if(file_iterator->extension().string().compare(".jpg") == 0 || file_iterator->extension().string().compare(".png") == 0 || file_iterator->extension().string().compare(".bmp") == 0)
|
||||
{
|
||||
|
||||
|
||||
input_image_files.push_back(file_iterator->string());
|
||||
|
||||
// If there exists a .txt file corresponding to the image, it is assumed that it contains a bounding box definition for a face
|
||||
// [minx, miny, maxx, maxy]
|
||||
path current_file = *file_iterator;
|
||||
path bbox = current_file.replace_extension("txt");
|
||||
|
||||
// If there is a bounding box file push it to the list of bounding boxes
|
||||
if(exists(bbox))
|
||||
{
|
||||
|
||||
std::ifstream in_bbox(bbox.string().c_str(), ios_base::in);
|
||||
|
||||
double min_x, min_y, max_x, max_y;
|
||||
|
||||
in_bbox >> min_x >> min_y >> max_x >> max_y;
|
||||
|
||||
in_bbox.close();
|
||||
|
||||
input_bounding_boxes.push_back(cv::Rect_<double>(min_x, min_y, max_x - min_x, max_y - min_y));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const filesystem_error& ex)
|
||||
{
|
||||
cout << ex.what() << '\n';
|
||||
}
|
||||
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-ofdir") == 0)
|
||||
{
|
||||
out_pts_dir = arguments[i + 1];
|
||||
create_directories(out_pts_dir);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-opdir") == 0)
|
||||
{
|
||||
out_pose_dir = arguments[i + 1];
|
||||
create_directories(out_pose_dir);
|
||||
valid[i] = false;
|
||||
valid[i + 1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-oidir") == 0)
|
||||
{
|
||||
out_img_dir = arguments[i + 1];
|
||||
create_directories(out_img_dir);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-op") == 0)
|
||||
{
|
||||
output_pose_files.push_back(output_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i + 1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-of") == 0)
|
||||
{
|
||||
output_feature_files.push_back(output_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
else if (arguments[i].compare("-oi") == 0)
|
||||
{
|
||||
output_image_files.push_back(output_root + arguments[i + 1]);
|
||||
valid[i] = false;
|
||||
valid[i+1] = false;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
// If any output directories are defined populate them based on image names
|
||||
if(!out_img_dir.empty())
|
||||
{
|
||||
for(size_t i=0; i < input_image_files.size(); ++i)
|
||||
{
|
||||
path image_loc(input_image_files[i]);
|
||||
|
||||
path fname = image_loc.filename();
|
||||
fname = fname.replace_extension("bmp");
|
||||
output_image_files.push_back(out_img_dir + "/" + fname.string());
|
||||
|
||||
}
|
||||
if(!input_image_files.empty())
|
||||
{
|
||||
create_directory_from_file(output_image_files[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if(!out_pts_dir.empty())
|
||||
{
|
||||
for(size_t i=0; i < input_image_files.size(); ++i)
|
||||
{
|
||||
path image_loc(input_image_files[i]);
|
||||
|
||||
path fname = image_loc.filename();
|
||||
fname = fname.replace_extension("pts");
|
||||
output_feature_files.push_back(out_pts_dir + "/" + fname.string());
|
||||
}
|
||||
create_directory_from_file(output_feature_files[0]);
|
||||
}
|
||||
|
||||
if (!out_pose_dir.empty())
|
||||
{
|
||||
for (size_t i = 0; i < input_image_files.size(); ++i)
|
||||
{
|
||||
path image_loc(input_image_files[i]);
|
||||
|
||||
path fname = image_loc.filename();
|
||||
fname = fname.replace_extension("pose");
|
||||
output_pose_files.push_back(out_pose_dir + "/" + fname.string());
|
||||
}
|
||||
create_directory_from_file(output_pose_files[0]);
|
||||
}
|
||||
|
||||
// Make sure the same number of images and bounding boxes is present, if any bounding boxes are defined
|
||||
if(input_bounding_boxes.size() > 0)
|
||||
{
|
||||
assert(input_bounding_boxes.size() == input_image_files.size());
|
||||
}
|
||||
|
||||
// Clear up the argument list
|
||||
for(int i=arguments.size()-1; i >= 0; --i)
|
||||
{
|
||||
if(!valid[i])
|
||||
{
|
||||
arguments.erase(arguments.begin()+i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// Fast patch expert response computation (linear model across a ROI) using normalised cross-correlation
|
||||
//===========================================================================
|
||||
|
|
|
@ -9,9 +9,9 @@ out_loc = './out_bosph/';
|
|||
|
||||
%%
|
||||
if(isunix)
|
||||
executable = '"../../build/bin/FeatureExtraction"';
|
||||
executable = '"../../build/bin/FaceLandmarkImg"';
|
||||
else
|
||||
executable = '"../../x64/Release/FeatureExtraction.exe"';
|
||||
executable = '"../../x64/Release/FaceLandmarkImg.exe"';
|
||||
end
|
||||
|
||||
bosph_dirs = dir([Bosphorus_dir, '/BosphorusDB/BosphorusDB/bs*']);
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
Mean error, median error
|
||||
9.438, 8.611
|
||||
9.428, 8.611
|
||||
|
|
Loading…
Reference in a new issue