parent
7539b7de65
commit
d03b89f163
11 changed files with 663 additions and 50 deletions
@ -0,0 +1,52 @@ |
||||
#ifndef _LSVM_TBBVERSION_H |
||||
#define _LSVM_TBBVERSION_H |
||||
|
||||
#include "_lsvm_matching.h" |
||||
#include "precomp.hpp" |
||||
|
||||
/*
|
||||
// Computation score function using TBB tasks
|
||||
//
|
||||
// API
|
||||
// int tbbTasksThresholdFunctionalScore(const CvLSVMFilterObject **filters, const int n,
|
||||
const CvLSVMFeaturePyramid *H, const float b, |
||||
const int maxXBorder, const int maxYBorder, |
||||
const float scoreThreshold, |
||||
int *kLevels, int **procLevels, |
||||
const int threadsNum, |
||||
float **score, CvPoint ***points,
|
||||
int *kPoints, |
||||
CvPoint ****partsDisplacement); |
||||
// INPUT
|
||||
// filters - the set of filters (the first element is root filter,
|
||||
the other - part filters) |
||||
// n - the number of part filters
|
||||
// H - feature pyramid
|
||||
// b - linear term of the score function
|
||||
// maxXBorder - the largest root filter size (X-direction)
|
||||
// maxYBorder - the largest root filter size (Y-direction)
|
||||
// scoreThreshold - score threshold
|
||||
// kLevels - array that contains number of levels processed
|
||||
by each thread |
||||
// procLevels - array that contains lists of levels processed
|
||||
by each thread |
||||
// threadsNum - the number of created threads
|
||||
// OUTPUT
|
||||
// score - score function values that exceed threshold
|
||||
// points - the set of root filter positions (in the block space)
|
||||
// kPoints - number of root filter positions
|
||||
// partsDisplacement - displacement of part filters (in the block space)
|
||||
// RESULT
|
||||
//
|
||||
*/ |
||||
int tbbTasksThresholdFunctionalScore(const CvLSVMFilterObject **filters, const int n,
|
||||
const CvLSVMFeaturePyramid *H, const float b, |
||||
const int maxXBorder, const int maxYBorder, |
||||
const float scoreThreshold, |
||||
int *kLevels, int **procLevels, |
||||
const int threadsNum, |
||||
float **score, CvPoint ***points,
|
||||
int *kPoints, |
||||
CvPoint ****partsDisplacement); |
||||
|
||||
#endif |
@ -0,0 +1,121 @@ |
||||
#include "_lsvm_tbbversion.h" |
||||
|
||||
|
||||
#ifdef HAVE_TBB |
||||
/*
|
||||
// Task class
|
||||
*/ |
||||
class ScoreComputation : public tbb::task |
||||
{ |
||||
private: |
||||
const CvLSVMFilterObject **filters; |
||||
const int n; |
||||
const CvLSVMFeaturePyramid *H; |
||||
const float b; |
||||
const int maxXBorder; |
||||
const int maxYBorder; |
||||
const float scoreThreshold; |
||||
const int kLevels; |
||||
const int *procLevels; |
||||
public: |
||||
float **score; |
||||
CvPoint ***points; |
||||
CvPoint ****partsDisplacement; |
||||
int *kPoints; |
||||
public: |
||||
ScoreComputation(const CvLSVMFilterObject **_filters, int _n,
|
||||
const CvLSVMFeaturePyramid *_H, |
||||
float _b, int _maxXBorder, int _maxYBorder, |
||||
float _scoreThreshold, int _kLevels, const int *_procLevels, |
||||
float **_score, CvPoint ***_points, int *_kPoints, |
||||
CvPoint ****_partsDisplacement) : |
||||
n(_n), b(_b), maxXBorder(_maxXBorder),
|
||||
maxYBorder(_maxYBorder), scoreThreshold(_scoreThreshold), |
||||
kLevels(_kLevels), score(_score), points(_points), kPoints(_kPoints), |
||||
partsDisplacement(_partsDisplacement) |
||||
{ |
||||
filters = _filters; |
||||
H = _H; |
||||
procLevels = _procLevels; |
||||
}; |
||||
|
||||
task* execute() |
||||
{ |
||||
int i, level, partsLevel, res; |
||||
for (i = 0; i < kLevels; i++) |
||||
{ |
||||
level = procLevels[i]; |
||||
partsLevel = level - H->lambda; |
||||
res = thresholdFunctionalScoreFixedLevel( |
||||
filters, n, H, level, b, |
||||
maxXBorder, maxYBorder, scoreThreshold, &(score[partsLevel]),
|
||||
points[partsLevel], &(kPoints[partsLevel]),
|
||||
partsDisplacement[partsLevel]); |
||||
if (res != LATENT_SVM_OK) |
||||
{ |
||||
continue; |
||||
} |
||||
} |
||||
return NULL; |
||||
} |
||||
}; |
||||
|
||||
/*
|
||||
// Computation score function using TBB tasks
|
||||
//
|
||||
// API
|
||||
// int tbbTasksThresholdFunctionalScore(const CvLSVMFilterObject **filters, const int n,
|
||||
const CvLSVMFeatureMap *H, const float b, |
||||
const int maxXBorder, const int maxYBorder, |
||||
const float scoreThreshold, |
||||
int *kLevels, int **procLevels, |
||||
const int threadsNum, |
||||
float **score, CvPoint ***points,
|
||||
int *kPoints, |
||||
CvPoint ****partsDisplacement); |
||||
// INPUT
|
||||
// filters - the set of filters (the first element is root filter,
|
||||
the other - part filters) |
||||
// n - the number of part filters
|
||||
// H - feature pyramid
|
||||
// b - linear term of the score function
|
||||
// maxXBorder - the largest root filter size (X-direction)
|
||||
// maxYBorder - the largest root filter size (Y-direction)
|
||||
// scoreThreshold - score threshold
|
||||
// kLevels - array that contains number of levels processed
|
||||
by each thread |
||||
// procLevels - array that contains lists of levels processed
|
||||
by each thread |
||||
// threadsNum - the number of created threads
|
||||
// OUTPUT
|
||||
// score - score function values that exceed threshold
|
||||
// points - the set of root filter positions (in the block space)
|
||||
// kPoints - number of root filter positions
|
||||
// partsDisplacement - displacement of part filters (in the block space)
|
||||
// RESULT
|
||||
//
|
||||
*/ |
||||
int tbbTasksThresholdFunctionalScore(const CvLSVMFilterObject **filters, const int n,
|
||||
const CvLSVMFeaturePyramid *H, const float b, |
||||
const int maxXBorder, const int maxYBorder, |
||||
const float scoreThreshold, |
||||
int *kLevels, int **procLevels, |
||||
const int threadsNum, |
||||
float **score, CvPoint ***points,
|
||||
int *kPoints, |
||||
CvPoint ****partsDisplacement) |
||||
{ |
||||
tbb::task_list tasks; |
||||
int i; |
||||
for (i = 0; i < threadsNum; i++) |
||||
{ |
||||
ScoreComputation& sc =
|
||||
*new(tbb::task::allocate_root()) ScoreComputation(filters, n, H, b, |
||||
maxXBorder, maxYBorder, scoreThreshold, kLevels[i], procLevels[i],
|
||||
score, points, kPoints, partsDisplacement); |
||||
tasks.push_back(sc); |
||||
} |
||||
tbb::task::spawn_root_and_wait(tasks); |
||||
return LATENT_SVM_OK; |
||||
}; |
||||
#endif |
Loading…
Reference in new issue