LBP classifier: tracking of count of detected objects was moved in cascadeclassifier.cpp
This commit is contained in:
parent
0ee2662da6
commit
a53f0f397e
@ -273,7 +273,7 @@ namespace cv { namespace gpu { namespace device
|
|||||||
{
|
{
|
||||||
namespace lbp
|
namespace lbp
|
||||||
{
|
{
|
||||||
int classifyStump(const DevMem2Db mstages,
|
classifyStump(const DevMem2Db mstages,
|
||||||
const int nstages,
|
const int nstages,
|
||||||
const DevMem2Di mnodes,
|
const DevMem2Di mnodes,
|
||||||
const DevMem2Df mleaves,
|
const DevMem2Df mleaves,
|
||||||
@ -287,7 +287,8 @@ namespace cv { namespace gpu { namespace device
|
|||||||
float scale,
|
float scale,
|
||||||
int step,
|
int step,
|
||||||
int subsetSize,
|
int subsetSize,
|
||||||
DevMem2D_<int4> objects);
|
DevMem2D_<int4> objects,
|
||||||
|
unsigned int* classified);
|
||||||
}
|
}
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
@ -308,6 +309,11 @@ int cv::gpu::CascadeClassifier_GPU_LBP::detectMultiScale(const GpuMat& image, Gp
|
|||||||
maxObjectSize = image.size();
|
maxObjectSize = image.size();
|
||||||
|
|
||||||
scaledImageBuffer.create(image.rows + 1, image.cols + 1, CV_8U);
|
scaledImageBuffer.create(image.rows + 1, image.cols + 1, CV_8U);
|
||||||
|
unsigned int* classified = new unsigned int[1];
|
||||||
|
*classified = 0;
|
||||||
|
unsigned int* dclassified;
|
||||||
|
cudaMalloc(&dclassified, sizeof(int));
|
||||||
|
cudaMemcpy(dclassified, classified, sizeof(int), cudaMemcpyHostToDevice);
|
||||||
|
|
||||||
for( double factor = 1; ; factor *= scaleFactor )
|
for( double factor = 1; ; factor *= scaleFactor )
|
||||||
{
|
{
|
||||||
@ -331,10 +337,11 @@ int cv::gpu::CascadeClassifier_GPU_LBP::detectMultiScale(const GpuMat& image, Gp
|
|||||||
|
|
||||||
int step = (factor <= 2.) + 1;
|
int step = (factor <= 2.) + 1;
|
||||||
|
|
||||||
int res = cv::gpu::device::lbp::classifyStump(stage_mat, stage_mat.cols / sizeof(Stage), nodes_mat, leaves_mat, subsets_mat, features_mat,
|
cv::gpu::device::lbp::classifyStump(stage_mat, stage_mat.cols / sizeof(Stage), nodes_mat, leaves_mat, subsets_mat, features_mat,
|
||||||
integral, processingRectSize.width, processingRectSize.height, windowSize.width, windowSize.height, scaleFactor, step, subsetSize, objects);
|
integral, processingRectSize.width, processingRectSize.height, windowSize.width, windowSize.height, scaleFactor, step, subsetSize, objects, dclassified);
|
||||||
std::cout << res << "Results: " << cv::Mat(objects).row(0).colRange(0, res) << std::endl;
|
|
||||||
}
|
}
|
||||||
|
cudaMemcpy(classified, dclassified, sizeof(int), cudaMemcpyDeviceToHost);
|
||||||
|
std::cout << *classified << "Results: " << cv::Mat(objects).row(0).colRange(0, *classified) << std::endl;
|
||||||
// TODO: reject levels
|
// TODO: reject levels
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -51,8 +51,6 @@ namespace cv { namespace gpu { namespace device
|
|||||||
{
|
{
|
||||||
int y = threadIdx.x * scale;
|
int y = threadIdx.x * scale;
|
||||||
int x = blockIdx.x * scale;
|
int x = blockIdx.x * scale;
|
||||||
*n = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
int current_node = 0;
|
int current_node = 0;
|
||||||
int current_leave = 0;
|
int current_leave = 0;
|
||||||
@ -77,7 +75,6 @@ namespace cv { namespace gpu { namespace device
|
|||||||
current_leave += 2;
|
current_leave += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = s;
|
|
||||||
if (sum < stage.threshold)
|
if (sum < stage.threshold)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -88,29 +85,26 @@ namespace cv { namespace gpu { namespace device
|
|||||||
rect.z = roundf(clWidth);
|
rect.z = roundf(clWidth);
|
||||||
rect.w = roundf(clHeight);
|
rect.w = roundf(clHeight);
|
||||||
|
|
||||||
int res = atomicInc(n, 1000);
|
int res = atomicInc(n, 100);
|
||||||
objects(0, res) = rect;
|
objects(0, res) = rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
int classifyStump(const DevMem2Db mstages, const int nstages, const DevMem2Di mnodes, const DevMem2Df mleaves, const DevMem2Di msubsets, const DevMem2Db mfeatures,
|
classifyStump(const DevMem2Db mstages, const int nstages, const DevMem2Di mnodes, const DevMem2Df mleaves, const DevMem2Di msubsets, const DevMem2Db mfeatures,
|
||||||
const DevMem2Di integral, const int workWidth, const int workHeight, const int clWidth, const int clHeight, float scale, int step, int subsetSize,
|
const DevMem2Di integral, const int workWidth, const int workHeight, const int clWidth, const int clHeight, float scale, int step, int subsetSize,
|
||||||
DevMem2D_<int4> objects)
|
DevMem2D_<int4> objects, unsigned int* classified)
|
||||||
{
|
{
|
||||||
int blocks = ceilf(workHeight / (float)step);
|
int blocks = ceilf(workHeight / (float)step);
|
||||||
int threads = ceilf(workWidth / (float)step);
|
int threads = ceilf(workWidth / (float)step);
|
||||||
printf("blocks %d, threads %d\n", blocks, threads);
|
// printf("blocks %d, threads %d\n", blocks, threads);
|
||||||
|
|
||||||
Stage* stages = (Stage*)(mstages.ptr());
|
Stage* stages = (Stage*)(mstages.ptr());
|
||||||
ClNode* nodes = (ClNode*)(mnodes.ptr());
|
ClNode* nodes = (ClNode*)(mnodes.ptr());
|
||||||
const float* leaves = mleaves.ptr();
|
const float* leaves = mleaves.ptr();
|
||||||
const int* subsets = msubsets.ptr();
|
const int* subsets = msubsets.ptr();
|
||||||
const uchar4* features = (uchar4*)(mfeatures.ptr());
|
const uchar4* features = (uchar4*)(mfeatures.ptr());
|
||||||
unsigned int * n, *h_n = new unsigned int[1];
|
|
||||||
cudaMalloc(&n, sizeof(int));
|
|
||||||
lbp_classify_stump<<<blocks, threads>>>(stages, nstages, nodes, leaves, subsets, features, integral,
|
lbp_classify_stump<<<blocks, threads>>>(stages, nstages, nodes, leaves, subsets, features, integral,
|
||||||
workWidth, workHeight, clWidth, clHeight, scale, step, subsetSize, objects, n);
|
workWidth, workHeight, clWidth, clHeight, scale, step, subsetSize, objects, classified);
|
||||||
cudaMemcpy(h_n, n, sizeof(int), cudaMemcpyDeviceToHost);
|
|
||||||
return *h_n;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}}}
|
}}}
|
Loading…
x
Reference in New Issue
Block a user