diff --git a/modules/tracking/src/tldModel.cpp b/modules/tracking/src/tldModel.cpp index 59b621845..442b2fc5d 100644 --- a/modules/tracking/src/tldModel.cpp +++ b/modules/tracking/src/tldModel.cpp @@ -196,6 +196,11 @@ namespace cv void TrackerTLDModel::integrateAdditional(const std::vector >& eForModel, const std::vector >& eForEnsemble, bool isPositive) { int positiveIntoModel = 0, negativeIntoModel = 0, positiveIntoEnsemble = 0, negativeIntoEnsemble = 0; + if ((int)eForModel.size() == 0) return; + + int64 e1, e2; + double t; + e1 = getTickCount(); for (int k = 0; k < (int)eForModel.size(); k++) { double sr = detector->Sr(eForModel[k]); @@ -226,6 +231,80 @@ namespace cv detector->classifiers[i].integrate(eForEnsemble[k], isPositive); } } + e2 = getTickCount(); + t = (e2 - e1) / getTickFrequency() * 1000; + printf("Integrate Additional: %fms\n", t); + /* + if( negativeIntoModel > 0 ) + dfprintf((stdout, "negativeIntoModel = %d ", negativeIntoModel)); + if( positiveIntoModel > 0 ) + dfprintf((stdout, "positiveIntoModel = %d ", positiveIntoModel)); + if( negativeIntoEnsemble > 0 ) + dfprintf((stdout, "negativeIntoEnsemble = %d ", negativeIntoEnsemble)); + if( positiveIntoEnsemble > 0 ) + dfprintf((stdout, "positiveIntoEnsemble = %d ", positiveIntoEnsemble)); + dfprintf((stdout, "\n"));*/ + } + + void TrackerTLDModel::ocl_integrateAdditional(const std::vector >& eForModel, const std::vector >& eForEnsemble, bool isPositive) + { + int positiveIntoModel = 0, negativeIntoModel = 0, positiveIntoEnsemble = 0, negativeIntoEnsemble = 0; + if ((int)eForModel.size() == 0) return; + + int64 e1, e2; + double t; + e1 = getTickCount(); + + //Prepare batch of patches + int numOfPatches = (int)eForModel.size(); + Mat_ stdPatches(numOfPatches, 225); + double *resultSr = new double[numOfPatches]; + double *resultSc = new double[numOfPatches]; + + uchar *patchesData = stdPatches.data; + for (int i = 0; i < numOfPatches; i++) + { + uchar *stdPatchData = eForModel[i].data; + for (int j = 0; j < 225; j++) + patchesData[225 * i + j] = stdPatchData[j]; + } + + //Calculate Sr and Sc batches + detector->ocl_batchSrSc(stdPatches, resultSr, resultSc, numOfPatches); + + for (int k = 0; k < (int)eForModel.size(); k++) + { + double sr = resultSr[k]; + if ((sr > THETA_NN) != isPositive) + { + if (isPositive) + { + positiveIntoModel++; + pushIntoModel(eForModel[k], true); + } + else + { + negativeIntoModel++; + pushIntoModel(eForModel[k], false); + } + } + double p = 0; + for (int i = 0; i < (int)detector->classifiers.size(); i++) + p += detector->classifiers[i].posteriorProbability(eForEnsemble[k].data, (int)eForEnsemble[k].step[0]); + p /= detector->classifiers.size(); + if ((p > ENSEMBLE_THRESHOLD) != isPositive) + { + if (isPositive) + positiveIntoEnsemble++; + else + negativeIntoEnsemble++; + for (int i = 0; i < (int)detector->classifiers.size(); i++) + detector->classifiers[i].integrate(eForEnsemble[k], isPositive); + } + } + e2 = getTickCount(); + t = (e2 - e1) / getTickFrequency() * 1000; + printf("Integrate Additional OCL: %fms\n", t); /* if( negativeIntoModel > 0 ) dfprintf((stdout, "negativeIntoModel = %d ", negativeIntoModel)); diff --git a/modules/tracking/src/tldModel.hpp b/modules/tracking/src/tldModel.hpp index ea11d17d8..be9141a54 100644 --- a/modules/tracking/src/tldModel.hpp +++ b/modules/tracking/src/tldModel.hpp @@ -58,6 +58,7 @@ namespace cv void setBoudingBox(Rect2d boundingBox){ boundingBox_ = boundingBox; } void integrateRelabeled(Mat& img, Mat& imgBlurred, const std::vector& patches); void integrateAdditional(const std::vector >& eForModel, const std::vector >& eForEnsemble, bool isPositive); + void ocl_integrateAdditional(const std::vector >& eForModel, const std::vector >& eForEnsemble, bool isPositive); Size getMinSize(){ return minSize_; } void printme(FILE* port = stdout); Ptr detector; diff --git a/modules/tracking/src/tldTracker.cpp b/modules/tracking/src/tldTracker.cpp index f95b3e2f1..e9d10bd37 100644 --- a/modules/tracking/src/tldTracker.cpp +++ b/modules/tracking/src/tldTracker.cpp @@ -202,10 +202,10 @@ bool TrackerTLDImpl::updateImpl(const Mat& image, Rect2d& boundingBox) tldModel->integrateRelabeled(imageForDetector, image_blurred, detectorResults); //dprintf(("%d relabeled by nExpert\n", negRelabeled)); pExpert.additionalExamples(examplesForModel, examplesForEnsemble); - tldModel->integrateAdditional(examplesForModel, examplesForEnsemble, true); + tldModel->ocl_integrateAdditional(examplesForModel, examplesForEnsemble, true); examplesForModel.clear(); examplesForEnsemble.clear(); nExpert.additionalExamples(examplesForModel, examplesForEnsemble); - tldModel->integrateAdditional(examplesForModel, examplesForEnsemble, false); + tldModel->ocl_integrateAdditional(examplesForModel, examplesForEnsemble, false); } else {