|
|
|
@ -65,25 +65,6 @@ namespace cv |
|
|
|
|
// Calculate Relative similarity of the patch (NN-Model)
|
|
|
|
|
double TLDDetector::Sr(const Mat_<uchar>& patch) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
int64 e1, e2; |
|
|
|
|
float t; |
|
|
|
|
e1 = getTickCount(); |
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
for (int i = 0; i < (int)(*positiveExamples).size(); i++) |
|
|
|
|
splus = std::max(splus, 0.5 * (NCC((*positiveExamples)[i], patch) + 1.0)); |
|
|
|
|
for (int i = 0; i < (int)(*negativeExamples).size(); i++) |
|
|
|
|
sminus = std::max(sminus, 0.5 * (NCC((*negativeExamples)[i], patch) + 1.0)); |
|
|
|
|
e2 = getTickCount(); |
|
|
|
|
t = (e2 - e1) / getTickFrequency()*1000.0; |
|
|
|
|
printf("Sr: %f\n", t); |
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
return splus / (sminus + splus); |
|
|
|
|
*/ |
|
|
|
|
//int64 e1, e2;
|
|
|
|
|
//float t;
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE); |
|
|
|
|
for (int i = 0; i < *posNum; i++) |
|
|
|
@ -96,9 +77,7 @@ namespace cv |
|
|
|
|
modelSample.data = &(negExp->data[i * 225]); |
|
|
|
|
sminus = std::max(sminus, 0.5 * (NCC(modelSample, patch) + 1.0)); |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Sr CPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
return splus / (sminus + splus); |
|
|
|
@ -106,10 +85,6 @@ namespace cv |
|
|
|
|
|
|
|
|
|
double TLDDetector::ocl_Sr(const Mat_<uchar>& patch) |
|
|
|
|
{ |
|
|
|
|
//int64 e1, e2, e3, e4;
|
|
|
|
|
//double t;
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -134,38 +109,12 @@ namespace cv |
|
|
|
|
*posNum, |
|
|
|
|
*negNum); |
|
|
|
|
|
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Mem Cpy GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
size_t globSize = 1000; |
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
|
|
|
|
|
if (!k.run(1, &globSize, NULL, false)) |
|
|
|
|
printf("Kernel Run Error!!!"); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Kernel Run GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
Mat resNCC = devNCC.getMat(ACCESS_READ); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Read Mem GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
////Compare
|
|
|
|
|
//Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
|
|
|
|
|
//for (int i = 0; i < 200; i+=17)
|
|
|
|
|
//{
|
|
|
|
|
// modelSample.data = &(posExp->data[i * 225]);
|
|
|
|
|
// printf("%f\t%f\n\n", resNCC.at<float>(i), NCC(modelSample, patch));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//for (int i = 0; i < 200; i+=23)
|
|
|
|
|
//{
|
|
|
|
|
// modelSample.data = &(negExp->data[i * 225]);
|
|
|
|
|
// printf("%f\t%f\n", resNCC.at<float>(500+i), NCC(modelSample, patch));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < *posNum; i++) |
|
|
|
|
splus = std::max(splus, 0.5 * (resNCC.at<float>(i) + 1.0)); |
|
|
|
@ -173,10 +122,6 @@ namespace cv |
|
|
|
|
for (int i = 0; i < *negNum; i++) |
|
|
|
|
sminus = std::max(sminus, 0.5 * (resNCC.at<float>(i+500) +1.0)); |
|
|
|
|
|
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Sr GPU: %f\n\n", t);
|
|
|
|
|
|
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
return splus / (sminus + splus); |
|
|
|
@ -184,11 +129,6 @@ namespace cv |
|
|
|
|
|
|
|
|
|
void TLDDetector::ocl_batchSrSc(const Mat_<uchar>& patches, double *resultSr, double *resultSc, int numOfPatches) |
|
|
|
|
{ |
|
|
|
|
//int64 e1, e2, e3, e4;
|
|
|
|
|
//double t;
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
|
|
|
|
|
UMat devPatches = patches.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
UMat devPositiveSamples = posExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
UMat devNegativeSamples = negExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
@ -212,25 +152,13 @@ namespace cv |
|
|
|
|
*negNum, |
|
|
|
|
numOfPatches); |
|
|
|
|
|
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Mem Cpy GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
// 2 -> Pos&Neg
|
|
|
|
|
size_t globSize = 2 * numOfPatches*MAX_EXAMPLES_IN_MODEL; |
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
|
|
|
|
|
if (!k.run(1, &globSize, NULL, true)) |
|
|
|
|
printf("Kernel Run Error!!!"); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Kernel Run GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
Mat posNCC = devPosNCC.getMat(ACCESS_READ); |
|
|
|
|
Mat negNCC = devNegNCC.getMat(ACCESS_READ); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Read Mem GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
//Calculate Srs
|
|
|
|
|
for (int id = 0; id < numOfPatches; id++) |
|
|
|
@ -256,62 +184,11 @@ namespace cv |
|
|
|
|
else |
|
|
|
|
resultSc[id] = spc / (smc + spc); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
////Compare positive NCCs
|
|
|
|
|
/*Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
|
|
|
|
|
Mat_<uchar> patch(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE); |
|
|
|
|
for (int j = 0; j < numOfPatches; j++) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < 1; i++) |
|
|
|
|
{ |
|
|
|
|
modelSample.data = &(posExp->data[i * 225]); |
|
|
|
|
patch.data = &(patches.data[j * 225]); |
|
|
|
|
printf("%f\t%f\n", resultSr[j], Sr(patch)); |
|
|
|
|
printf("%f\t%f\n", resultSc[j], Sc(patch)); |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
//for (int i = 0; i < 200; i+=23)
|
|
|
|
|
//{
|
|
|
|
|
// modelSample.data = &(negExp->data[i * 225]);
|
|
|
|
|
// printf("%f\t%f\n", resNCC.at<float>(500+i), NCC(modelSample, patch));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Sr GPU: %f\n\n", t);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Calculate Conservative similarity of the patch (NN-Model)
|
|
|
|
|
double TLDDetector::Sc(const Mat_<uchar>& patch) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
int64 e1, e2; |
|
|
|
|
float t; |
|
|
|
|
e1 = getTickCount(); |
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
int med = getMedian((*timeStampsPositive)); |
|
|
|
|
for (int i = 0; i < (int)(*positiveExamples).size(); i++) |
|
|
|
|
{ |
|
|
|
|
if ((int)(*timeStampsPositive)[i] <= med) |
|
|
|
|
splus = std::max(splus, 0.5 * (NCC((*positiveExamples)[i], patch) + 1.0)); |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < (int)(*negativeExamples).size(); i++) |
|
|
|
|
sminus = std::max(sminus, 0.5 * (NCC((*negativeExamples)[i], patch) + 1.0)); |
|
|
|
|
e2 = getTickCount(); |
|
|
|
|
t = (e2 - e1) / getTickFrequency()*1000.0; |
|
|
|
|
printf("Sc: %f\n", t); |
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
|
|
|
|
|
return splus / (sminus + splus); |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
//int64 e1, e2;
|
|
|
|
|
//double t;
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE); |
|
|
|
|
int med = getMedian((*timeStampsPositive)); |
|
|
|
@ -328,9 +205,7 @@ namespace cv |
|
|
|
|
modelSample.data = &(negExp->data[i * 225]); |
|
|
|
|
sminus = std::max(sminus, 0.5 * (NCC(modelSample, patch) + 1.0)); |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Sc: %f\n", t);
|
|
|
|
|
|
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
|
|
|
|
@ -339,13 +214,8 @@ namespace cv |
|
|
|
|
|
|
|
|
|
double TLDDetector::ocl_Sc(const Mat_<uchar>& patch) |
|
|
|
|
{ |
|
|
|
|
//int64 e1, e2, e3, e4;
|
|
|
|
|
//float t;
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
double splus = 0.0, sminus = 0.0; |
|
|
|
|
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
|
|
|
|
|
UMat devPatch = patch.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
UMat devPositiveSamples = posExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
UMat devNegativeSamples = negExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
@ -367,37 +237,12 @@ namespace cv |
|
|
|
|
*posNum, |
|
|
|
|
*negNum); |
|
|
|
|
|
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Mem Cpy GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
size_t globSize = 1000; |
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
|
|
|
|
|
if (!k.run(1, &globSize, NULL, false)) |
|
|
|
|
printf("Kernel Run Error!!!"); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Kernel Run GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
Mat resNCC = devNCC.getMat(ACCESS_READ); |
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Read Mem GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
////Compare
|
|
|
|
|
//Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
|
|
|
|
|
//for (int i = 0; i < 200; i+=17)
|
|
|
|
|
//{
|
|
|
|
|
// modelSample.data = &(posExp->data[i * 225]);
|
|
|
|
|
// printf("%f\t%f\n\n", resNCC.at<float>(i), NCC(modelSample, patch));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//for (int i = 0; i < 200; i+=23)
|
|
|
|
|
//{
|
|
|
|
|
// modelSample.data = &(negExp->data[i * 225]);
|
|
|
|
|
// printf("%f\t%f\n", resNCC.at<float>(500+i), NCC(modelSample, patch));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
int med = getMedian((*timeStampsPositive)); |
|
|
|
|
for (int i = 0; i < *posNum; i++) |
|
|
|
@ -407,10 +252,6 @@ namespace cv |
|
|
|
|
for (int i = 0; i < *negNum; i++) |
|
|
|
|
sminus = std::max(sminus, 0.5 * (resNCC.at<float>(i + 500) + 1.0)); |
|
|
|
|
|
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Sc GPU: %f\n\n", t);
|
|
|
|
|
|
|
|
|
|
if (splus + sminus == 0.0) |
|
|
|
|
return 0.0; |
|
|
|
|
return splus / (sminus + splus); |
|
|
|
@ -449,7 +290,6 @@ namespace cv |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//dprintf(("%d rects in res\n", (int)res.size()));
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Detection - returns most probable new target location (Max Sc)
|
|
|
|
@ -469,10 +309,6 @@ namespace cv |
|
|
|
|
std::vector <Mat> resized_imgs, blurred_imgs; |
|
|
|
|
std::vector <Point> varBuffer, ensBuffer; |
|
|
|
|
std::vector <int> varScaleIDs, ensScaleIDs; |
|
|
|
|
//int64 e1, e2;
|
|
|
|
|
//double t;
|
|
|
|
|
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
|
|
|
|
|
//Detection part
|
|
|
|
|
//Generate windows and filter by variance
|
|
|
|
@ -491,10 +327,6 @@ namespace cv |
|
|
|
|
continue; |
|
|
|
|
varBuffer.push_back(Point(dx * i, dy * j)); |
|
|
|
|
varScaleIDs.push_back(scaleID); |
|
|
|
|
|
|
|
|
|
//Debug display candidates after Variance Filter
|
|
|
|
|
double curScale = pow(tld::SCALE_STEP, scaleID); |
|
|
|
|
debugStack[0].push_back(Rect2d(dx * i* curScale, dy * j*curScale, initSize.width*curScale, initSize.height*curScale)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
scaleID++; |
|
|
|
@ -506,12 +338,8 @@ namespace cv |
|
|
|
|
GaussianBlur(resized_imgs[scaleID], tmp, GaussBlurKernelSize, 0.0f); |
|
|
|
|
blurred_imgs.push_back(tmp); |
|
|
|
|
} while (size.width >= initSize.width && size.height >= initSize.height); |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Variance: %d\t%f\n", varBuffer.size(), t);
|
|
|
|
|
|
|
|
|
|
//Encsemble classification
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
for (int i = 0; i < (int)varBuffer.size(); i++) |
|
|
|
|
{ |
|
|
|
|
prepareClassifiers(static_cast<int> (blurred_imgs[varScaleIDs[i]].step[0])); |
|
|
|
@ -520,15 +348,8 @@ namespace cv |
|
|
|
|
ensBuffer.push_back(varBuffer[i]); |
|
|
|
|
ensScaleIDs.push_back(varScaleIDs[i]); |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Ensemble: %d\t%f\n", ensBuffer.size(), t);
|
|
|
|
|
|
|
|
|
|
//printf("varBuffer: %d\n", varBuffer.size());
|
|
|
|
|
//printf("ensBuffer: %d\n", ensBuffer.size());
|
|
|
|
|
|
|
|
|
|
//NN classification
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
for (int i = 0; i < (int)ensBuffer.size(); i++) |
|
|
|
|
{ |
|
|
|
|
LabeledPatch labPatch; |
|
|
|
@ -562,9 +383,6 @@ namespace cv |
|
|
|
|
maxScRect = labPatch.rect; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("NN: %d\t%f\n", patches.size(), t);
|
|
|
|
|
|
|
|
|
|
if (maxSc < 0) |
|
|
|
|
return false; |
|
|
|
@ -590,10 +408,7 @@ namespace cv |
|
|
|
|
std::vector <Mat> resized_imgs, blurred_imgs; |
|
|
|
|
std::vector <Point> varBuffer, ensBuffer; |
|
|
|
|
std::vector <int> varScaleIDs, ensScaleIDs; |
|
|
|
|
//int64 e1, e2;
|
|
|
|
|
//double t;
|
|
|
|
|
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
//Detection part
|
|
|
|
|
//Generate windows and filter by variance
|
|
|
|
|
scaleID = 0; |
|
|
|
@ -622,12 +437,8 @@ namespace cv |
|
|
|
|
GaussianBlur(resized_imgs[scaleID], tmp, GaussBlurKernelSize, 0.0f); |
|
|
|
|
blurred_imgs.push_back(tmp); |
|
|
|
|
} while (size.width >= initSize.width && size.height >= initSize.height); |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Variance: %d\t%f\n", varBuffer.size(), t);
|
|
|
|
|
|
|
|
|
|
//Encsemble classification
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
for (int i = 0; i < (int)varBuffer.size(); i++) |
|
|
|
|
{ |
|
|
|
|
prepareClassifiers((int)blurred_imgs[varScaleIDs[i]].step[0]); |
|
|
|
@ -636,12 +447,8 @@ namespace cv |
|
|
|
|
ensBuffer.push_back(varBuffer[i]); |
|
|
|
|
ensScaleIDs.push_back(varScaleIDs[i]); |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Ensemble: %d\t%f\n", ensBuffer.size(), t);
|
|
|
|
|
|
|
|
|
|
//NN classification
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
//Prepare batch of patches
|
|
|
|
|
int numOfPatches = (int)ensBuffer.size(); |
|
|
|
|
Mat_<uchar> stdPatches(numOfPatches, 225); |
|
|
|
@ -671,9 +478,6 @@ namespace cv |
|
|
|
|
|
|
|
|
|
srValue = resultSr[i]; |
|
|
|
|
|
|
|
|
|
//srValue = Sr(standardPatch);
|
|
|
|
|
//printf("%f\t%f\t\n", srValue, resultSr[i]);
|
|
|
|
|
|
|
|
|
|
////To fix: Check the paper, probably this cause wrong learning
|
|
|
|
|
//
|
|
|
|
|
labPatch.isObject = srValue > THETA_NN; |
|
|
|
@ -697,9 +501,6 @@ namespace cv |
|
|
|
|
maxScRect = labPatch.rect; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//e2 = getTickCount();
|
|
|
|
|
//t = (e2 - e1) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("NN: %d\t%f\n", patches.size(), t);
|
|
|
|
|
|
|
|
|
|
if (maxSc < 0) |
|
|
|
|
return false; |
|
|
|
|