Skip to content

Commit f344de4

Browse files
committed
first push for sp
1 parent 2cfb0ac commit f344de4

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed

modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,49 @@ class CV_EXPORTS_W MotionSaliencyBinWangApr2014 : public MotionSaliency
302302

303303
};
304304

305+
/** @brief the Deep Gaze 1 Saliency approach from
306+
307+
This method use the convolution layers of the pretrained AlexNet, linear combination, center bias and softmax to generate saliency map
308+
*/
309+
class CV_EXPORTS_W DiscriminantSaliency : public MotionSaliency
310+
{
311+
private:
312+
Size imgProcessingSize;
313+
unsigned hiddenSpaceDimension;
314+
unsigned centerSize;
315+
unsigned windowSize;
316+
unsigned patchSize;
317+
unsigned temporalSize;
318+
public:
319+
struct DT
320+
{
321+
Mat A;
322+
Mat C;
323+
Mat Q;
324+
Mat R;
325+
Mat S;
326+
Mat MU;
327+
double VAR;
328+
};
329+
DiscriminantSaliency();
330+
virtual ~DiscriminantSaliency();
331+
CV_WRAP static Ptr<DeepGaze1> create()
332+
{
333+
return makePtr<DeepGaze1>();
334+
}
335+
CV_WRAP bool computeSaliency( InputArray image, OutputArray saliencyMap )
336+
{
337+
if( image.empty() )
338+
return false;
339+
return computeSaliencyImpl( image, saliencyMap );
340+
}
341+
void dynamicTextureEstimator( const Mat, DT& );
342+
protected:
343+
bool computeSaliencyImpl( InputArray image, OutputArray saliencyMap );
344+
std::vector<Mat> saliencyMapGenerator( const std::vector<Mat> );
345+
double KLdivDT( const Mat, const DT&, const DT& );
346+
};
347+
305348
/************************************ Specific Objectness Specialized Classes ************************************/
306349

307350
/**
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// This file is part of OpenCV project.
2+
// It is subject to the license terms in the LICENSE file found in the top-level directory
3+
// of this distribution and at http://opencv.org/license.html.
4+
5+
#include <opencv2/imgproc.hpp>
6+
#include <opencv2/highgui.hpp>
7+
#include "precomp.hpp"
8+
#include <vector>
9+
#include <functional>
10+
#include <cmath>
11+
#include <string>
12+
#include <iostream>
13+
#include <cstdlib>
14+
#include <algorithm>
15+
#include <utility>
16+
#include <numeric>
17+
#include <fstream>
18+
19+
20+
21+
using namespace std;
22+
using namespace cv;
23+
using namespace cv::saliency;
24+
25+
namespace cv
26+
{
27+
namespace saliency
28+
{
29+
DiscriminantSaliency::DiscriminantSaliency()
30+
{
31+
imgProcessingSize = Size(127, 127);
32+
hiddenSpaceDimension = 10;
33+
centerSize = 16;
34+
windowSize = 96;
35+
patchSize = 8;
36+
temporalSize = 11;
37+
CV_Assert( hiddenSpaceDimension <= temporalSize && temporalSize <= (unsigned)imgProcessingSize.width * imgProcessingSize.height );
38+
}
39+
40+
DiscriminantSaliency::~DiscriminantSaliency(){}
41+
42+
bool DiscriminantSaliency::computeSaliencyImpl( InputArray image, OutputArray saliencyMap )
43+
{
44+
return true;
45+
}
46+
47+
vector<Mat> DiscriminantSaliency::saliencyMapGenerator( const std::vector<Mat> img_sq)
48+
{
49+
50+
return img_sq;
51+
}
52+
53+
double DiscriminantSaliency::KLdivDT( const Mat img_sq, DT& para_c, DT& para_w )
54+
{
55+
Mat MU_c = para_c.MU.clone();//1
56+
Mat MU_w = para_w.MU.clone();//1
57+
Mat S_c = para_c.S.clone();//1
58+
Mat S_w = para_w.S.clone();//1
59+
Mat Beta = ((para_w.S.inv()) + Mat::ones(para_w.S.size(), CV_64F) / (para_w.VAR)).inv();//1
60+
Mat Omega = -1 * para_w.Q.inv() * para_w.A;//const
61+
Mat Theta = (para_w.S.inv()) + (para_w.A.t()) * (para_w.Q.inv()) * (para_w.A);//const
62+
Mat Vc = para_w.C.t() * para_c.C * MU_c - MU_w;//1
63+
64+
Mat U_w = para_w.A * para_w.S;//2
65+
Mat H = Theta + Mat::ones(Theta.size(), CV_64F) / (para_w.VAR) - Omega.t() * Beta * Omega;//2
66+
Mat G = -1 * Beta * Omega;//2
67+
MU_c *= para_c.A;//2
68+
MU_w *= para_w.A;//2
69+
S_c = para_c.A * S_c * para_c.A.t() + para_c.Q;
70+
S_w = para_w.A * S_w * para_w.A.t() + para_w.Q;
71+
/*Beta =
72+
73+
74+
for ( unsigned i = 1; i < img_sq.size[1]; i++)
75+
{
76+
77+
}
78+
Mat Zc
79+
80+
Mat Gama*/
81+
return 0;
82+
}
83+
84+
void DiscriminantSaliency::dynamicTextureEstimator( const Mat img_sq, DT& para )
85+
{
86+
87+
unsigned tau = img_sq.size[1]; //row represents pixel location and column represents temporal location
88+
Mat me( img_sq.size[0], 1, CV_64F, Scalar::all(0.0) );
89+
Mat temp( img_sq.size[0], img_sq.size[1], CV_64F, Scalar::all(0.0) );
90+
Mat X, V, B, W, Y;
91+
92+
for ( unsigned i = 0; i < tau; i++ )
93+
{
94+
me += img_sq.col(i) / tau;
95+
}
96+
temp += me * Mat::ones(1, tau, CV_64F) * (-1);
97+
temp += img_sq;
98+
Y = temp.clone();
99+
100+
SVD s = SVD(temp, SVD::MODIFY_A);
101+
para.C = s.u.colRange(0, hiddenSpaceDimension);
102+
para.C = para.C.clone();
103+
X = Mat::diag(s.w.rowRange(0, hiddenSpaceDimension)) * s.vt.rowRange(0, hiddenSpaceDimension);
104+
para.A = (X.colRange(1, tau) * (X.colRange(0, tau - 1)).inv());
105+
para.A = para.A.clone();
106+
107+
V = (X.colRange(1, tau) - para.A * X.colRange(0, tau - 1));
108+
V = V.clone();
109+
SVD sv = SVD(V, SVD::MODIFY_A);
110+
B = sv.u * Mat::diag(sv.w) / sqrt(tau - 1);
111+
para.Q = (B * B.t());
112+
para.Q = para.Q.clone();
113+
114+
W = (Y - para.C * X);
115+
W = W.clone();
116+
SVD sw = SVD(W, SVD::MODIFY_A);
117+
B = sw.u * Mat::diag(sw.w) / sqrt(tau - 1);
118+
para.R = (B * B.t());
119+
para.R = para.R.clone();
120+
para.VAR = (trace(para.R) / para.R.size[0])[0];
121+
122+
para.MU = Mat( hiddenSpaceDimension, 1, CV_64F, Scalar::all(0.0) );
123+
for (unsigned i = 0; i < tau; i++ )
124+
{
125+
para.MU += X.col(i) / tau;
126+
}
127+
para.S = (X - para.MU * Mat::ones(1, tau, CV_64F)) * ((X - para.MU * Mat::ones(1, tau, CV_64F)).t()) / (tau - 1);
128+
para.S = para.S.clone();
129+
}
130+
131+
}
132+
}

0 commit comments

Comments
 (0)