mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-21 06:11:09 +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)
|
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;
|
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++)
|
for (int k = 0; k < (int)eForModel.size(); k++)
|
||||||
{
|
{
|
||||||
double sr = detector->Sr(eForModel[k]);
|
double sr = detector->Sr(eForModel[k]);
|
||||||
@@ -226,6 +231,80 @@ namespace cv
|
|||||||
detector->classifiers[i].integrate(eForEnsemble[k], isPositive);
|
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 )
|
if( negativeIntoModel > 0 )
|
||||||
dfprintf((stdout, "negativeIntoModel = %d ", negativeIntoModel));
|
dfprintf((stdout, "negativeIntoModel = %d ", negativeIntoModel));
|
||||||
|
@@ -58,6 +58,7 @@ namespace cv
|
|||||||
void setBoudingBox(Rect2d boundingBox){ boundingBox_ = boundingBox; }
|
void setBoudingBox(Rect2d boundingBox){ boundingBox_ = boundingBox; }
|
||||||
void integrateRelabeled(Mat& img, Mat& imgBlurred, const std::vector<TLDDetector::LabeledPatch>& patches);
|
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 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_; }
|
Size getMinSize(){ return minSize_; }
|
||||||
void printme(FILE* port = stdout);
|
void printme(FILE* port = stdout);
|
||||||
Ptr<TLDDetector> detector;
|
Ptr<TLDDetector> detector;
|
||||||
|
@@ -202,10 +202,10 @@ bool TrackerTLDImpl::updateImpl(const Mat& image, Rect2d& boundingBox)
|
|||||||
tldModel->integrateRelabeled(imageForDetector, image_blurred, detectorResults);
|
tldModel->integrateRelabeled(imageForDetector, image_blurred, detectorResults);
|
||||||
//dprintf(("%d relabeled by nExpert\n", negRelabeled));
|
//dprintf(("%d relabeled by nExpert\n", negRelabeled));
|
||||||
pExpert.additionalExamples(examplesForModel, examplesForEnsemble);
|
pExpert.additionalExamples(examplesForModel, examplesForEnsemble);
|
||||||
tldModel->integrateAdditional(examplesForModel, examplesForEnsemble, true);
|
tldModel->ocl_integrateAdditional(examplesForModel, examplesForEnsemble, true);
|
||||||
examplesForModel.clear(); examplesForEnsemble.clear();
|
examplesForModel.clear(); examplesForEnsemble.clear();
|
||||||
nExpert.additionalExamples(examplesForModel, examplesForEnsemble);
|
nExpert.additionalExamples(examplesForModel, examplesForEnsemble);
|
||||||
tldModel->integrateAdditional(examplesForModel, examplesForEnsemble, false);
|
tldModel->ocl_integrateAdditional(examplesForModel, examplesForEnsemble, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user