如何测量 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。start
和end
总是相等的!
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 分类器训练的训练时间?的主要内容,如果未能解决你的问题,请参考以下文章