diff --git a/openbr/plugins/metadata/stopwatch.cpp b/openbr/plugins/metadata/stopwatch.cpp index 93f662d..44613d9 100644 --- a/openbr/plugins/metadata/stopwatch.cpp +++ b/openbr/plugins/metadata/stopwatch.cpp @@ -14,6 +14,11 @@ * limitations under the License. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#include +using namespace cv; + +#include + #include namespace br @@ -32,10 +37,9 @@ class StopWatchTransform : public MetaTransform BR_PROPERTY(QString, description, "Identity") br::Transform *transform; - mutable QMutex mutex; - mutable long miliseconds; - mutable long images; - mutable long pixels; + mutable QAtomicInt milliseconds; + mutable QAtomicInt images; + mutable QAtomicInt pixels; public: StopWatchTransform() @@ -46,9 +50,9 @@ public: private: void reset() { - miliseconds = 0; - images = 0; - pixels = 0; + milliseconds.fetchAndStoreOrdered(0); + images.fetchAndStoreOrdered(0); + pixels.fetchAndStoreOrdered(0); } void init() @@ -58,7 +62,22 @@ private: void train(const QList &data) { + QTime watch; + watch.start(); + transform->train(data); + + milliseconds.fetchAndAddOrdered((int)watch.elapsed()); + images.fetchAndAddOrdered(data.size()); + + // compute the total number of pixels we processed + foreach(const TemplateList &list, data) { + foreach(const Template &t, list) { + foreach(const cv::Mat &m, t) { + pixels.fetchAndAddOrdered(m.rows*m.cols); + } + } + } } void project(const Template &src, Template &dst) const @@ -67,11 +86,11 @@ private: watch.start(); transform->project(src, dst); - QMutexLocker locker(&mutex); - miliseconds += watch.elapsed(); - images++; - foreach (const cv::Mat &m, src) - pixels += (m.rows * m.cols); + milliseconds.fetchAndAddOrdered(watch.elapsed()); + images.fetchAndAddOrdered(1); + foreach (const cv::Mat &m, src) { + pixels.fetchAndAddOrdered(m.rows * m.cols); + } } void finalize(TemplateList &) @@ -81,15 +100,24 @@ private: "\tTemplates/s: %g\n" "\tPixels/s: %g\n", qPrintable(description), - miliseconds / 1000.0, - images * 1000.0 / miliseconds, - pixels * 1000.0 / miliseconds); + milliseconds / 1000.0, + images * 1000.0 / milliseconds, + pixels * 1000.0 / milliseconds); reset(); } void store(QDataStream &stream) const { transform->store(stream); + + qDebug("\nTraining Profile for \"%s\"\n" + "\tSeconds: %g\n" + "\tTemplates/s: %g\n" + "\tPixels/s: %g\n", + qPrintable(description), + milliseconds / 1000.0, + images * 1000.0 / milliseconds, + pixels * 1000.0 / milliseconds); } void load(QDataStream &stream)