如何在C++和OpenCV中测量KNN分类器训练的训练时间

How to measure the trainign time of KNN classifier training in C++ and OpenCV?

本文关键字:KNN 分类器 时间 测量 C++ OpenCV      更新时间:2023-10-16

我正在使用CvKNearest进行KNN分类。我想测量训练所需的时间。这是代码:

#include <time.h>
clock_t start, end;
double time;
start = clock();
KnnClassifier.train( trainData, classes, Mat(), false, 1 );
end = clock();
time = ((float) (end - start)) / CLOCKS_PER_SEC;
cout<<" Training time (s) =   "<<time << "n";  

问题是结果是训练需要 0 秒。提前谢谢。

如果可用(C++11),您可以使用chrono。

#include <chrono>
auto start = std::chrono::system_clock::now();
KnnClassifier.train( trainData, classes, Mat(), false, 1 );
auto end = std::chrono::system_clock::now();
auto time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
cout << " Training time (s) = " << time.count() << "n";  

这个问题很旧,但在我看来,发布的答案不是使用 OpenCV 时应该使用的答案。

为了测量操作的时间,OpenCV提供了函数来做到这一点。您可以为此查阅官方文档。下面是要编写的代码:

double t = (double)getTickCount();
// do something ...
t = ((double)getTickCount() - t)/getTickFrequency();

另一种方法是在OpenCV中使用TickMeter对象。以下是官方文档中TickMeter类的描述:

衡量流逝时间的类。

该类通过计算每个刻度数来计算流逝时间 第二。也就是说,以下代码计算 秒:

TickMeter tm;
tm.start();
// do something ...
tm.stop();
std::cout << tm.getTimeSec();

还可以计算多次运行的平均时间:

TickMeter tm;
for (int i = 0; i < 100; i++)
{
    tm.start();
 // do something ...
    tm.stop();
}
double average_time = tm.getTimeSec() / tm.getCounter();
std::cout << "Average time in second per iteration is: " << average_time << std::endl;