|
|
|
@ -286,192 +286,6 @@ namespace cv |
|
|
|
|
//printf("Sr GPU: %f\n\n", t);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
UMat devNCC(1, 2*MAX_EXAMPLES_IN_MODEL, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ocl::Kernel k; |
|
|
|
|
ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc; |
|
|
|
|
String error; |
|
|
|
|
ocl::Program prog(src, NULL, error); |
|
|
|
|
k.create("NCC", prog); |
|
|
|
|
if (k.empty()) |
|
|
|
|
printf("Kernel create failed!!!\n"); |
|
|
|
|
k.args( |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devPatch), |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devPositiveSamples), |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devNegativeSamples), |
|
|
|
|
ocl::KernelArg::PtrWriteOnly(devNCC), |
|
|
|
|
posNum, |
|
|
|
|
negNum); |
|
|
|
|
|
|
|
|
|
//e4 = getTickCount();
|
|
|
|
|
//t = (e4 - e3) / getTickFrequency()*1000.0;
|
|
|
|
|
//printf("Mem Cpy GPU: %f\n", t);
|
|
|
|
|
|
|
|
|
|
size_t globSize = 1000; |
|
|
|
|
size_t localSize = 128; |
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
if (!k.run(1, &globSize, &localSize, true)) |
|
|
|
|
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)); |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
UMat devPosNCC(MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
UMat devNegNCC(MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); |
|
|
|
|
|
|
|
|
|
ocl::Kernel k; |
|
|
|
|
ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc; |
|
|
|
|
String error; |
|
|
|
|
ocl::Program prog(src, NULL, error); |
|
|
|
|
k.create("batchNCC", prog); |
|
|
|
|
if (k.empty()) |
|
|
|
|
printf("Kernel create failed!!!\n"); |
|
|
|
|
k.args( |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devPatches), |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devPositiveSamples), |
|
|
|
|
ocl::KernelArg::PtrReadOnly(devNegativeSamples), |
|
|
|
|
ocl::KernelArg::PtrWriteOnly(devPosNCC), |
|
|
|
|
ocl::KernelArg::PtrWriteOnly(devNegNCC), |
|
|
|
|
posNum, |
|
|
|
|
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; |
|
|
|
|
size_t localSize = 1024; |
|
|
|
|
//e3 = getTickCount();
|
|
|
|
|
if (!k.run(1, &globSize, &localSize, 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++) |
|
|
|
|
{ |
|
|
|
|
double spr = 0.0, smr = 0.0, spc = 0.0, smc = 0; |
|
|
|
|
int med = getMedian((*timeStampsPositive)); |
|
|
|
|
for (int i = 0; i < *posNum; i++) |
|
|
|
|
{ |
|
|
|
|
spr = std::max(spr, 0.5 * (posNCC.at<float>(id * 500 + i) + 1.0)); |
|
|
|
|
if ((int)(*timeStampsPositive)[i] <= med) |
|
|
|
|
spc = std::max(spr, 0.5 * (posNCC.at<float>(id * 500 + i) + 1.0)); |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < *negNum; i++) |
|
|
|
|
smc = smr = std::max(smr, 0.5 * (negNCC.at<float>(id * 500 + i) + 1.0)); |
|
|
|
|
|
|
|
|
|
if (spr + smr == 0.0) |
|
|
|
|
resultSr[id] = 0.0; |
|
|
|
|
else |
|
|
|
|
resultSr[id] = spr / (smr + spr); |
|
|
|
|
|
|
|
|
|
if (spc + smc == 0.0) |
|
|
|
|
resultSc[id] = 0.0; |
|
|
|
|
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);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
======= |
|
|
|
|
>>>>>>> origin/TLD_OpenCL_Support |
|
|
|
|
|
|
|
|
|
// Calculate Conservative similarity of the patch (NN-Model)
|
|
|
|
|
double TLDDetector::Sc(const Mat_<uchar>& patch) |
|
|
|
|
{ |
|
|
|
@ -662,11 +476,8 @@ namespace cv |
|
|
|
|
//double t;
|
|
|
|
|
|
|
|
|
|
//e1 = getTickCount();
|
|
|
|
|
//Detection part
|
|
|
|
|
<<<<<<< HEAD |
|
|
|
|
|
|
|
|
|
======= |
|
|
|
|
>>>>>>> origin/TLD_OpenCL_Support |
|
|
|
|
//Detection part
|
|
|
|
|
//Generate windows and filter by variance
|
|
|
|
|
scaleID = 0; |
|
|
|
|
resized_imgs.push_back(img); |
|
|
|
|