Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/perf/perf_math.cpp
16354 views
1
#include "perf_precomp.hpp"
2
3
namespace opencv_test
4
{
5
using namespace perf;
6
7
namespace {
8
9
typedef perf::TestBaseWithParam<size_t> VectorLength;
10
11
PERF_TEST_P(VectorLength, phase32f, testing::Values(128, 1000, 128*1024, 512*1024, 1024*1024))
12
{
13
size_t length = GetParam();
14
vector<float> X(length);
15
vector<float> Y(length);
16
vector<float> angle(length);
17
18
declare.in(X, Y, WARMUP_RNG).out(angle);
19
20
TEST_CYCLE_N(200) cv::phase(X, Y, angle, true);
21
22
SANITY_CHECK(angle, 5e-5);
23
}
24
25
PERF_TEST_P(VectorLength, phase64f, testing::Values(128, 1000, 128*1024, 512*1024, 1024*1024))
26
{
27
size_t length = GetParam();
28
vector<double> X(length);
29
vector<double> Y(length);
30
vector<double> angle(length);
31
32
declare.in(X, Y, WARMUP_RNG).out(angle);
33
34
TEST_CYCLE_N(200) cv::phase(X, Y, angle, true);
35
36
SANITY_CHECK(angle, 5e-5);
37
}
38
39
typedef perf::TestBaseWithParam< testing::tuple<int, int, int> > KMeans;
40
41
PERF_TEST_P_(KMeans, single_iter)
42
{
43
RNG& rng = theRNG();
44
const int K = testing::get<0>(GetParam());
45
const int dims = testing::get<1>(GetParam());
46
const int N = testing::get<2>(GetParam());
47
const int attempts = 5;
48
49
Mat data(N, dims, CV_32F);
50
rng.fill(data, RNG::UNIFORM, -0.1, 0.1);
51
52
const int N0 = K;
53
Mat data0(N0, dims, CV_32F);
54
rng.fill(data0, RNG::UNIFORM, -1, 1);
55
56
for (int i = 0; i < N; i++)
57
{
58
int base = rng.uniform(0, N0);
59
cv::add(data0.row(base), data.row(i), data.row(i));
60
}
61
62
declare.in(data);
63
64
Mat labels, centers;
65
66
TEST_CYCLE()
67
{
68
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 1, 0),
69
attempts, KMEANS_PP_CENTERS, centers);
70
}
71
72
SANITY_CHECK_NOTHING();
73
}
74
75
PERF_TEST_P_(KMeans, good)
76
{
77
RNG& rng = theRNG();
78
const int K = testing::get<0>(GetParam());
79
const int dims = testing::get<1>(GetParam());
80
const int N = testing::get<2>(GetParam());
81
const int attempts = 5;
82
83
Mat data(N, dims, CV_32F);
84
rng.fill(data, RNG::UNIFORM, -0.1, 0.1);
85
86
const int N0 = K;
87
Mat data0(N0, dims, CV_32F);
88
rng.fill(data0, RNG::UNIFORM, -1, 1);
89
90
for (int i = 0; i < N; i++)
91
{
92
int base = rng.uniform(0, N0);
93
cv::add(data0.row(base), data.row(i), data.row(i));
94
}
95
96
declare.in(data);
97
98
Mat labels, centers;
99
100
TEST_CYCLE()
101
{
102
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
103
attempts, KMEANS_PP_CENTERS, centers);
104
}
105
106
SANITY_CHECK_NOTHING();
107
}
108
109
PERF_TEST_P_(KMeans, with_duplicates)
110
{
111
RNG& rng = theRNG();
112
const int K = testing::get<0>(GetParam());
113
const int dims = testing::get<1>(GetParam());
114
const int N = testing::get<2>(GetParam());
115
const int attempts = 5;
116
117
Mat data(N, dims, CV_32F, Scalar::all(0));
118
119
const int N0 = std::max(2, K * 2 / 3);
120
Mat data0(N0, dims, CV_32F);
121
rng.fill(data0, RNG::UNIFORM, -1, 1);
122
123
for (int i = 0; i < N; i++)
124
{
125
int base = rng.uniform(0, N0);
126
data0.row(base).copyTo(data.row(i));
127
}
128
129
declare.in(data);
130
131
Mat labels, centers;
132
133
TEST_CYCLE()
134
{
135
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
136
attempts, KMEANS_PP_CENTERS, centers);
137
}
138
139
SANITY_CHECK_NOTHING();
140
}
141
142
INSTANTIATE_TEST_CASE_P(/*nothing*/ , KMeans,
143
testing::Values(
144
// K clusters, dims, N points
145
testing::make_tuple(2, 3, 100000),
146
testing::make_tuple(4, 3, 500),
147
testing::make_tuple(4, 3, 1000),
148
testing::make_tuple(4, 3, 10000),
149
testing::make_tuple(8, 3, 1000),
150
testing::make_tuple(8, 16, 1000),
151
testing::make_tuple(8, 64, 1000),
152
testing::make_tuple(16, 16, 1000),
153
testing::make_tuple(16, 32, 1000),
154
testing::make_tuple(32, 16, 1000),
155
testing::make_tuple(32, 32, 1000),
156
testing::make_tuple(100, 2, 1000)
157
)
158
);
159
160
}
161
162
} // namespace
163
164