mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-20 21:40:49 +08:00
Added OCL version of "integrateAdditional" function
This commit is contained in:
@@ -196,6 +196,11 @@ namespace cv
|
||||
void TrackerTLDModel::integrateAdditional(const std::vector<Mat_<uchar> >& eForModel, const std::vector<Mat_<uchar> >& 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<Mat_<uchar> >& eForModel, const std::vector<Mat_<uchar> >& 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_<uchar> 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));
|
||||
|
@@ -58,6 +58,7 @@ namespace cv
|
||||
void setBoudingBox(Rect2d boundingBox){ boundingBox_ = boundingBox; }
|
||||
void integrateRelabeled(Mat& img, Mat& imgBlurred, const std::vector<TLDDetector::LabeledPatch>& patches);
|
||||
void integrateAdditional(const std::vector<Mat_<uchar> >& eForModel, const std::vector<Mat_<uchar> >& eForEnsemble, bool isPositive);
|
||||
void ocl_integrateAdditional(const std::vector<Mat_<uchar> >& eForModel, const std::vector<Mat_<uchar> >& eForEnsemble, bool isPositive);
|
||||
Size getMinSize(){ return minSize_; }
|
||||
void printme(FILE* port = stdout);
|
||||
Ptr<TLDDetector> detector;
|
||||
|
@@ -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
|
||||
{
|
||||
|
Reference in New Issue
Block a user