@@ -286,6 +286,191 @@ namespace cv
286286 // printf("Sr GPU: %f\n\n", t);
287287 }
288288
289+ <<<<<<< HEAD
290+ double TLDDetector::ocl_Sr (const Mat_<uchar>& patch)
291+ {
292+ // int64 e1, e2, e3, e4;
293+ // double t;
294+ // e1 = getTickCount();
295+ // e3 = getTickCount();
296+ double splus = 0.0 , sminus = 0.0 ;
297+
298+
299+ UMat devPatch = patch.getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
300+ UMat devPositiveSamples = posExp->getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
301+ UMat devNegativeSamples = negExp->getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
302+ UMat devNCC (1 , 2 *MAX_EXAMPLES_IN_MODEL, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY);
303+
304+
305+ ocl::Kernel k;
306+ ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc;
307+ String error;
308+ ocl::Program prog (src, NULL , error);
309+ k.create (" NCC" , prog);
310+ if (k.empty ())
311+ printf (" Kernel create failed!!!\n " );
312+ k.args (
313+ ocl::KernelArg::PtrReadOnly (devPatch),
314+ ocl::KernelArg::PtrReadOnly (devPositiveSamples),
315+ ocl::KernelArg::PtrReadOnly (devNegativeSamples),
316+ ocl::KernelArg::PtrWriteOnly (devNCC),
317+ posNum,
318+ negNum);
319+
320+ // e4 = getTickCount();
321+ // t = (e4 - e3) / getTickFrequency()*1000.0;
322+ // printf("Mem Cpy GPU: %f\n", t);
323+
324+ size_t globSize = 1000 ;
325+ size_t localSize = 128 ;
326+ // e3 = getTickCount();
327+ if (!k.run (1 , &globSize, &localSize, true ))
328+ printf (" Kernel Run Error!!!" );
329+ // e4 = getTickCount();
330+ // t = (e4 - e3) / getTickFrequency()*1000.0;
331+ // printf("Kernel Run GPU: %f\n", t);
332+
333+ // e3 = getTickCount();
334+ Mat resNCC = devNCC.getMat (ACCESS_READ);
335+ // e4 = getTickCount();
336+ // t = (e4 - e3) / getTickFrequency()*1000.0;
337+ // printf("Read Mem GPU: %f\n", t);
338+
339+ // //Compare
340+ // Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
341+ // for (int i = 0; i < 200; i+=17)
342+ // {
343+ // modelSample.data = &(posExp->data[i * 225]);
344+ // printf("%f\t%f\n\n", resNCC.at<float>(i), NCC(modelSample, patch));
345+ // }
346+
347+ // for (int i = 0; i < 200; i+=23)
348+ // {
349+ // modelSample.data = &(negExp->data[i * 225]);
350+ // printf("%f\t%f\n", resNCC.at<float>(500+i), NCC(modelSample, patch));
351+ // }
352+
353+
354+ for (int i = 0 ; i < *posNum; i++)
355+ splus = std::max (splus, 0.5 * (resNCC.at <float >(i) + 1.0 ));
356+
357+ for (int i = 0 ; i < *negNum; i++)
358+ sminus = std::max (sminus, 0.5 * (resNCC.at <float >(i+500 ) +1.0 ));
359+
360+ // e2 = getTickCount();
361+ // t = (e2 - e1) / getTickFrequency()*1000.0;
362+ // printf("Sr GPU: %f\n\n", t);
363+
364+ if (splus + sminus == 0.0 )
365+ return 0.0 ;
366+ return splus / (sminus + splus);
367+ }
368+
369+ void TLDDetector::ocl_batchSrSc (const Mat_<uchar>& patches, double *resultSr, double *resultSc, int numOfPatches)
370+ {
371+ // int64 e1, e2, e3, e4;
372+ // double t;
373+ // e1 = getTickCount();
374+ // e3 = getTickCount();
375+
376+ UMat devPatches = patches.getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
377+ UMat devPositiveSamples = posExp->getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
378+ UMat devNegativeSamples = negExp->getUMat (ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY);
379+ UMat devPosNCC (MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY);
380+ UMat devNegNCC (MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY);
381+
382+ ocl::Kernel k;
383+ ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc;
384+ String error;
385+ ocl::Program prog (src, NULL , error);
386+ k.create (" batchNCC" , prog);
387+ if (k.empty ())
388+ printf (" Kernel create failed!!!\n " );
389+ k.args (
390+ ocl::KernelArg::PtrReadOnly (devPatches),
391+ ocl::KernelArg::PtrReadOnly (devPositiveSamples),
392+ ocl::KernelArg::PtrReadOnly (devNegativeSamples),
393+ ocl::KernelArg::PtrWriteOnly (devPosNCC),
394+ ocl::KernelArg::PtrWriteOnly (devNegNCC),
395+ posNum,
396+ negNum,
397+ numOfPatches);
398+
399+ // e4 = getTickCount();
400+ // t = (e4 - e3) / getTickFrequency()*1000.0;
401+ // printf("Mem Cpy GPU: %f\n", t);
402+
403+ // 2 -> Pos&Neg
404+ size_t globSize = 2 * numOfPatches*MAX_EXAMPLES_IN_MODEL;
405+ size_t localSize = 1024 ;
406+ // e3 = getTickCount();
407+ if (!k.run (1 , &globSize, &localSize, true ))
408+ printf (" Kernel Run Error!!!" );
409+ // e4 = getTickCount();
410+ // t = (e4 - e3) / getTickFrequency()*1000.0;
411+ // printf("Kernel Run GPU: %f\n", t);
412+
413+ // e3 = getTickCount();
414+ Mat posNCC = devPosNCC.getMat (ACCESS_READ);
415+ Mat negNCC = devNegNCC.getMat (ACCESS_READ);
416+ // e4 = getTickCount();
417+ // t = (e4 - e3) / getTickFrequency()*1000.0;
418+ // printf("Read Mem GPU: %f\n", t);
419+
420+ // Calculate Srs
421+ for (int id = 0 ; id < numOfPatches; id++)
422+ {
423+ double spr = 0.0 , smr = 0.0 , spc = 0.0 , smc = 0 ;
424+ int med = getMedian ((*timeStampsPositive));
425+ for (int i = 0 ; i < *posNum; i++)
426+ {
427+ spr = std::max (spr, 0.5 * (posNCC.at <float >(id * 500 + i) + 1.0 ));
428+ if ((int )(*timeStampsPositive)[i] <= med)
429+ spc = std::max (spr, 0.5 * (posNCC.at <float >(id * 500 + i) + 1.0 ));
430+ }
431+ for (int i = 0 ; i < *negNum; i++)
432+ smc = smr = std::max (smr, 0.5 * (negNCC.at <float >(id * 500 + i) + 1.0 ));
433+
434+ if (spr + smr == 0.0 )
435+ resultSr[id] = 0.0 ;
436+ else
437+ resultSr[id] = spr / (smr + spr);
438+
439+ if (spc + smc == 0.0 )
440+ resultSc[id] = 0.0 ;
441+ else
442+ resultSc[id] = spc / (smc + spc);
443+ }
444+
445+ // //Compare positive NCCs
446+ /* Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
447+ Mat_<uchar> patch(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE);
448+ for (int j = 0; j < numOfPatches; j++)
449+ {
450+ for (int i = 0; i < 1; i++)
451+ {
452+ modelSample.data = &(posExp->data[i * 225]);
453+ patch.data = &(patches.data[j * 225]);
454+ printf("%f\t%f\n", resultSr[j], Sr(patch));
455+ printf("%f\t%f\n", resultSc[j], Sc(patch));
456+ }
457+ }*/
458+
459+ // for (int i = 0; i < 200; i+=23)
460+ // {
461+ // modelSample.data = &(negExp->data[i * 225]);
462+ // printf("%f\t%f\n", resNCC.at<float>(500+i), NCC(modelSample, patch));
463+ // }
464+
465+
466+
467+ // e2 = getTickCount();
468+ // t = (e2 - e1) / getTickFrequency()*1000.0;
469+ // printf("Sr GPU: %f\n\n", t);
470+ }
471+
472+ =======
473+ >>>>>>> origin/TLD_OpenCL_Support
289474
290475 // Calculate Conservative similarity of the patch (NN-Model)
291476 double TLDDetector::Sc (const Mat_<uchar>& patch)
@@ -478,7 +663,10 @@ namespace cv
478663
479664 // e1 = getTickCount();
480665 // Detection part
666+ <<<<<<< HEAD
481667
668+ =======
669+ >>>>>>> origin/TLD_OpenCL_Support
482670 // Generate windows and filter by variance
483671 scaleID = 0 ;
484672 resized_imgs.push_back (img);
0 commit comments