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

Posted

技术标签:

【中文标题】如何测量 C++ 和 OpenCV 中 KNN 分类器训练的训练时间?【英文标题】:How to measure the trainign time of KNN classifier training in C++ and OpenCV? 【发布时间】:2015-06-17 01:01:20 【问题描述】:

我将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 秒。 提前致谢。

【问题讨论】:

也许确实需要大约0s,你打印时间以微秒为单位怎么样,即time = 1000.0f * ((float) (end - start)) / CLOCKS_PER_SEC; 结果也是0。startend总是相等的! time 的类型是什么?你能展示你的完整代码吗? 我已经更新了问题。 KnnClassifier.train 使用 GPU 吗? 【参考方案1】:

如果可用 (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";  

【讨论】:

除了使用C++11还有什么办法吗? 您知道培训过程需要多长时间吗? clock() 的问题在于它的粒度很差,如果进程花费不到 20 毫秒(尽管这完全独立于架构),那么它可能会报告运行时间为 0。有可用的库,例如 boost 的 @987654321 @,虽然我对他们没有经验。【参考方案2】:

这个问题很老,但我认为发布的答案不是使用 OpenCV 时应该使用的答案。

为了测量操作的时间,OpenCV 提供了执行此操作的函数。您可以咨询official documentation for that。 这是要编写的代码:

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;

【讨论】:

以上是关于如何测量 C++ 和 OpenCV 中 KNN 分类器训练的训练时间?的主要内容,如果未能解决你的问题,请参考以下文章

书写数字识别(C++ KNN openCV)

如何在python中测量knn分类器的准确性

图像c ++,opencv中均匀性/同质性的测量

KNN算法的实现

如何使openCV背景减法KNN算法持续更长时间,跟踪一个没有移动的前景对象

KNN算法介绍