-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSVR_dynamic_lin_regressors.cpp
129 lines (111 loc) · 5.43 KB
/
SVR_dynamic_lin_regressors.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright (C) 2015, University of Cambridge,
// all rights reserved.
//
// THIS SOFTWARE IS PROVIDED “AS IS” FOR ACADEMIC USE ONLY AND ANY EXPRESS
// OR IMPLIED WARRANTIES WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY.
// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Notwithstanding the license granted herein, Licensee acknowledges that certain components
// of the Software may be covered by so-called “open source” software licenses (“Open Source
// Components”), which means any software licenses approved as open source licenses by the
// Open Source Initiative or any substantially similar licenses, including without limitation any
// license that, as a condition of distribution of the software licensed under such license,
// requires that the distributor make the software available in source code format. Licensor shall
// provide a list of Open Source Components for a particular version of the Software upon
// Licensee’s request. Licensee will comply with the applicable terms of such licenses and to
// the extent required by the licenses covering Open Source Components, the terms of such
// licenses will apply in lieu of the terms of this Agreement. To the extent the terms of the
// licenses applicable to Open Source Components prohibit any of the restrictions in this
// License Agreement with respect to such Open Source Component, such restrictions will not
// apply to such Open Source Component. To the extent the terms of the licenses applicable to
// Open Source Components require Licensor to make an offer to provide source code or
// related information in connection with the Software, such offer is hereby made. Any request
// for source code or related information should be directed to [email protected]
// Licensee acknowledges receipt of notices for the Open Source Components for the initial
// delivery of the Software.
// * Any publications arising from the use of this software, including but
// not limited to academic journal and conference publications, technical
// reports and manuals, must cite one of the following works:
//
// Tadas Baltrusaitis, Marwa Mahmoud, and Peter Robinson.
// Cross-dataset learning and person-specific normalisation for automatic Action Unit detection
// Facial Expression Recognition and Analysis Challenge 2015,
// IEEE International Conference on Automatic Face and Gesture Recognition, 2015
//
///////////////////////////////////////////////////////////////////////////////
#include "SVR_dynamic_lin_regressors.h"
#include "CLM_core.h"
using namespace FaceAnalysis;
void SVR_dynamic_lin_regressors::Read(std::ifstream& stream, const std::vector<std::string>& au_names)
{
if(this->means.empty())
{
CLMTracker::ReadMatBin(stream, this->means);
}
else
{
Mat_<double> m_tmp;
CLMTracker::ReadMatBin(stream, m_tmp);
if(cv::norm(m_tmp - this->means > 0.00001))
{
cout << "Something went wrong with the SVR dynamic regressors" << endl;
}
}
Mat_<double> support_vectors_curr;
CLMTracker::ReadMatBin(stream, support_vectors_curr);
double bias;
stream.read((char *)&bias, 8);
// Add a column vector to the matrix of support vectors (each column is a support vector)
if(!this->support_vectors.empty())
{
cv::transpose(this->support_vectors, this->support_vectors);
cv::transpose(support_vectors_curr, support_vectors_curr);
this->support_vectors.push_back(support_vectors_curr);
cv::transpose(this->support_vectors, this->support_vectors);
cv::transpose(this->biases, this->biases);
this->biases.push_back(cv::Mat_<double>(1, 1, bias));
cv::transpose(this->biases, this->biases);
}
else
{
this->support_vectors.push_back(support_vectors_curr);
this->biases.push_back(cv::Mat_<double>(1, 1, bias));
}
for(size_t i=0; i < au_names.size(); ++i)
{
this->AU_names.push_back(au_names[i]);
}
}
// Prediction using the HOG descriptor
void SVR_dynamic_lin_regressors::Predict(std::vector<double>& predictions, std::vector<std::string>& names, const cv::Mat_<double>& fhog_descriptor, const cv::Mat_<double>& geom_params, const cv::Mat_<double>& running_median, const cv::Mat_<double>& running_median_geom)
{
if(AU_names.size() > 0)
{
Mat_<double> preds;
if(fhog_descriptor.cols == this->means.cols)
{
preds = (fhog_descriptor - this->means - running_median) * this->support_vectors + this->biases;
}
else
{
Mat_<double> input;
cv::hconcat(fhog_descriptor, geom_params, input);
Mat_<double> run_med;
cv::hconcat(running_median, running_median_geom, run_med);
preds = (input - this->means - run_med) * this->support_vectors + this->biases;
}
for(MatIterator_<double> pred_it = preds.begin(); pred_it != preds.end(); ++pred_it)
{
predictions.push_back(*pred_it);
}
names = this->AU_names;
}
}