|
7 | 7 |
|
8 | 8 | namespace opencv_test { namespace {
|
9 | 9 |
|
10 |
| -// |
11 |
| -// train on one person, and test against the other |
12 |
| -// |
13 |
| -#define TESTSET_NAMES testing::Values("david","dudek") |
14 |
| - |
15 |
| -const string TRACKING_DIR = "tracking"; |
16 |
| -const string FOLDER_IMG = "data"; |
17 |
| - |
| 10 | +const string FACE_DIR = "face"; |
| 11 | +const int WINDOW_SIZE = 64; |
18 | 12 |
|
19 | 13 | class MaceTest
|
20 | 14 | {
|
21 | 15 | public:
|
22 | 16 |
|
23 |
| - MaceTest(string _video, bool salt); |
| 17 | + MaceTest(bool salt); |
24 | 18 | void run();
|
25 | 19 |
|
26 | 20 | protected:
|
27 |
| - vector<Rect> boxes(const string &fn); |
28 |
| - vector<Mat> samples(const string &name, int N,int off=0); |
29 |
| - int found(const string &vid); |
30 |
| - |
31 | 21 | Ptr<MACE> mace;
|
32 |
| - |
33 |
| - string video; // train |
34 |
| - string vidA; // test |
35 |
| - |
36 |
| - int nSampsTest; |
37 |
| - int nSampsTrain; |
38 |
| - int nStep; |
39 | 22 | bool salt;
|
40 | 23 | };
|
41 | 24 |
|
42 |
| -MaceTest::MaceTest(string _video, bool use_salt) |
| 25 | +MaceTest::MaceTest(bool use_salt) |
43 | 26 | {
|
44 |
| - int Z = 64; // window size |
45 |
| - mace = MACE::create(Z); |
46 |
| - |
47 |
| - video = _video; |
48 |
| - if (video=="david") { vidA="dudek"; } |
49 |
| - if (video=="dudek") { vidA="david"; } |
50 |
| - |
51 |
| - nStep = 2; |
52 |
| - nSampsTest = 5; |
53 |
| - nSampsTrain = 35; |
| 27 | + mace = MACE::create(WINDOW_SIZE); |
54 | 28 | salt = use_salt;
|
55 | 29 | }
|
56 | 30 |
|
57 |
| -vector<Rect> MaceTest::boxes(const string &fn) |
58 |
| -{ |
59 |
| - std::ifstream in(fn.c_str()); |
60 |
| - int x,y,w,h; |
61 |
| - char sep; |
62 |
| - vector<Rect> _boxes; |
63 |
| - while (in.good() && (in >> x >> sep >> y >> sep >> w >> sep >> h)) |
64 |
| - { |
65 |
| - _boxes.push_back( Rect(x,y,w,h) ); |
66 |
| - } |
67 |
| - return _boxes; |
68 |
| -} |
69 |
| - |
70 | 31 | void MaceTest::run()
|
71 | 32 | {
|
72 |
| - vector<Mat> sam_train = samples(video, nSampsTrain, 0); |
73 |
| - if (salt) mace->salt(video); // "owner's" salt with "two factor" |
| 33 | + Rect david1 (125,66,58,56); |
| 34 | + Rect david2 (132,69,73,74); |
| 35 | + Rect detect (199,124,256,274); |
| 36 | + string folder = cvtest::TS::ptr()->get_data_path() + FACE_DIR; |
| 37 | + Mat train = imread(folder + "/david2.jpg", 0); |
| 38 | + Mat tst_p = imread(folder + "/david1.jpg", 0); |
| 39 | + Mat tst_n = imread(folder + "/detect.jpg", 0); |
| 40 | + vector<Mat> sam_train; |
| 41 | + sam_train.push_back( train(Rect(132,69,73,74)) ); |
| 42 | + sam_train.push_back( train(Rect(130,69,73,72)) ); |
| 43 | + sam_train.push_back( train(Rect(134,67,73,74)) ); |
| 44 | + sam_train.push_back( tst_p(Rect(125,66,58,56)) ); |
| 45 | + sam_train.push_back( tst_p(Rect(123,67,55,58)) ); |
| 46 | + sam_train.push_back( tst_p(Rect(125,65,58,60)) ); |
| 47 | + |
| 48 | + if (salt) mace->salt("it's david"); // "owner's" salt |
74 | 49 | mace->train(sam_train);
|
75 |
| - int self_ok = found(video); |
76 |
| - if (salt) mace->salt(vidA); // "other's" salt |
77 |
| - int false_A = found(vidA); |
78 |
| - ASSERT_GE(self_ok, nSampsTest/2); // it may miss positives |
79 |
| - ASSERT_EQ(false_A, 0); // but *absolutely* no false positives allowed. |
| 50 | + bool self_ok = mace->same(train(david2)); |
| 51 | + if (salt) mace->salt("this is a test"); // "other's" salt |
| 52 | + bool false_A = mace->same(tst_n(detect)); |
| 53 | + ASSERT_TRUE(self_ok); |
| 54 | + ASSERT_FALSE(false_A); |
80 | 55 | }
|
81 | 56 |
|
82 |
| -int MaceTest::found(const string &vid) |
83 |
| -{ |
84 |
| - vector<Mat> sam_test = samples(vid, nSampsTest, (1+nStep*nSampsTrain)); |
85 |
| - int hits = 0; |
86 |
| - for (size_t i=0; i<sam_test.size(); i++) |
87 |
| - { |
88 |
| - hits += mace->same(sam_test[i]); |
89 |
| - } |
90 |
| - return hits; |
91 |
| -} |
92 |
| - |
93 |
| -vector<Mat> MaceTest::samples(const string &name, int N, int off) |
94 |
| -{ |
95 |
| - string folder = cvtest::TS::ptr()->get_data_path() + TRACKING_DIR + "/" + name; |
96 |
| - string vid = folder + "/" + FOLDER_IMG + "/" + name + ".webm"; |
97 |
| - string anno = folder + "/gt.txt"; |
98 |
| - vector<Rect> bb = boxes(anno); |
99 |
| - int startFrame = (name=="david") ? 300 : 0; |
100 |
| - VideoCapture c; |
101 |
| - EXPECT_TRUE(c.open(vid)); |
102 |
| - vector<Mat> samps; |
103 |
| - while (samps.size() < size_t(N)) |
104 |
| - { |
105 |
| - int frameNo = startFrame + off; |
106 |
| - c.set(CAP_PROP_POS_FRAMES, frameNo); |
107 |
| - Mat frame; |
108 |
| - c >> frame; |
109 |
| - Rect r = bb[off]; |
110 |
| - off += nStep; |
111 |
| - samps.push_back(frame(r)); |
112 |
| - } |
113 |
| - c.release(); |
114 |
| - return samps; |
115 |
| -} |
116 | 57 |
|
117 |
| -//[TESTDATA] |
118 |
| -PARAM_TEST_CASE(MACE_, string) |
| 58 | +TEST(MACE_, unsalted) |
119 | 59 | {
|
120 |
| - string dataset; |
121 |
| - virtual void SetUp() |
122 |
| - { |
123 |
| - dataset = GET_PARAM(0); |
124 |
| - } |
125 |
| -}; |
126 |
| - |
127 |
| - |
128 |
| -TEST_P(MACE_, unsalted) |
129 |
| -{ |
130 |
| - MaceTest test(dataset, false); test.run(); |
| 60 | + MaceTest test(false); test.run(); |
131 | 61 | }
|
132 |
| -TEST_P(MACE_, salted) |
| 62 | +TEST(MACE_, salted) |
133 | 63 | {
|
134 |
| - MaceTest test(dataset, true); test.run(); |
| 64 | + MaceTest test(true); test.run(); |
135 | 65 | }
|
136 | 66 |
|
137 | 67 |
|
138 |
| -INSTANTIATE_TEST_CASE_P(Face, MACE_, TESTSET_NAMES); |
139 |
| - |
140 | 68 | }} // namespace
|
0 commit comments