Merge pull request #2127 from apavlenko:perf_cascades
commit
b0af6a2b58
2 changed files with 61 additions and 56 deletions
@ -0,0 +1,61 @@ |
|||||||
|
#include "perf_precomp.hpp" |
||||||
|
#include <opencv2/imgproc.hpp> |
||||||
|
|
||||||
|
#include "opencv2/ts/ocl_perf.hpp" |
||||||
|
|
||||||
|
using namespace std; |
||||||
|
using namespace cv; |
||||||
|
using namespace perf; |
||||||
|
using std::tr1::make_tuple; |
||||||
|
using std::tr1::get; |
||||||
|
|
||||||
|
typedef std::tr1::tuple<std::string, std::string, int> Cascade_Image_MinSize_t; |
||||||
|
typedef perf::TestBaseWithParam<Cascade_Image_MinSize_t> Cascade_Image_MinSize; |
||||||
|
|
||||||
|
#ifdef HAVE_OPENCL |
||||||
|
|
||||||
|
OCL_PERF_TEST_P(Cascade_Image_MinSize, CascadeClassifier, |
||||||
|
testing::Combine( |
||||||
|
testing::Values( string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt.xml"), |
||||||
|
string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt_old.xml"), |
||||||
|
string("cv/cascadeandhog/cascades/lbpcascade_frontalface.xml") ), |
||||||
|
testing::Values( string("cv/shared/lena.png"), |
||||||
|
string("cv/cascadeandhog/images/bttf301.png"), |
||||||
|
string("cv/cascadeandhog/images/class57.png") ), |
||||||
|
testing::Values(30, 64, 90) ) ) |
||||||
|
{ |
||||||
|
const string cascasePath = get<0>(GetParam()); |
||||||
|
const string imagePath = get<1>(GetParam()); |
||||||
|
int min_size = get<2>(GetParam()); |
||||||
|
Size minSize(min_size, min_size); |
||||||
|
|
||||||
|
CascadeClassifier cc( getDataPath(cascasePath) ); |
||||||
|
if (cc.empty()) |
||||||
|
FAIL() << "Can't load cascade file: " << getDataPath(cascasePath); |
||||||
|
|
||||||
|
Mat img = imread(getDataPath(imagePath), IMREAD_GRAYSCALE); |
||||||
|
if (img.empty()) |
||||||
|
FAIL() << "Can't load source image: " << getDataPath(imagePath); |
||||||
|
|
||||||
|
vector<Rect> faces; |
||||||
|
|
||||||
|
equalizeHist(img, img); |
||||||
|
declare.in(img).time(60); |
||||||
|
|
||||||
|
UMat uimg = img.getUMat(ACCESS_READ); |
||||||
|
|
||||||
|
while(next()) |
||||||
|
{ |
||||||
|
faces.clear(); |
||||||
|
cvtest::ocl::perf::safeFinish(); |
||||||
|
|
||||||
|
startTimer(); |
||||||
|
cc.detectMultiScale(uimg, faces, 1.1, 3, 0, minSize); |
||||||
|
stopTimer(); |
||||||
|
} |
||||||
|
|
||||||
|
sort(faces.begin(), faces.end(), comparators::RectLess()); |
||||||
|
SANITY_CHECK(faces, min_size/5); |
||||||
|
} |
||||||
|
|
||||||
|
#endif //HAVE_OPENCL
|
@ -1,56 +0,0 @@ |
|||||||
#include "perf_precomp.hpp" |
|
||||||
#include <opencv2/imgproc.hpp> |
|
||||||
|
|
||||||
using namespace std; |
|
||||||
using namespace cv; |
|
||||||
using namespace perf; |
|
||||||
using std::tr1::make_tuple; |
|
||||||
using std::tr1::get; |
|
||||||
|
|
||||||
typedef std::tr1::tuple<std::string, int> ImageName_MinSize_t; |
|
||||||
typedef perf::TestBaseWithParam<ImageName_MinSize_t> ImageName_MinSize; |
|
||||||
|
|
||||||
PERF_TEST_P(ImageName_MinSize, CascadeClassifierLBPFrontalFace, |
|
||||||
testing::Combine(testing::Values( std::string("cv/shared/lena.png"), |
|
||||||
std::string("cv/shared/1_itseez-0000289.png"), |
|
||||||
std::string("cv/shared/1_itseez-0000492.png"), |
|
||||||
std::string("cv/shared/1_itseez-0000573.png")), |
|
||||||
testing::Values(24, 30, 40, 50, 60, 70, 80, 90) |
|
||||||
) |
|
||||||
) |
|
||||||
{ |
|
||||||
const string filename = get<0>(GetParam()); |
|
||||||
int min_size = get<1>(GetParam()); |
|
||||||
Size minSize(min_size, min_size); |
|
||||||
|
|
||||||
CascadeClassifier cc(getDataPath("cv/cascadeandhog/cascades/lbpcascade_frontalface.xml")); |
|
||||||
if (cc.empty()) |
|
||||||
FAIL() << "Can't load cascade file"; |
|
||||||
|
|
||||||
Mat img = imread(getDataPath(filename), 0); |
|
||||||
if (img.empty()) |
|
||||||
FAIL() << "Can't load source image"; |
|
||||||
|
|
||||||
vector<Rect> faces; |
|
||||||
|
|
||||||
equalizeHist(img, img); |
|
||||||
declare.in(img); |
|
||||||
|
|
||||||
while(next()) |
|
||||||
{ |
|
||||||
faces.clear(); |
|
||||||
|
|
||||||
startTimer(); |
|
||||||
cc.detectMultiScale(img, faces, 1.1, 3, 0, minSize); |
|
||||||
stopTimer(); |
|
||||||
} |
|
||||||
// for some reason OpenCL version detects the face, which CPU version does not detect, we just remove it
|
|
||||||
// TODO better solution: implement smart way of comparing two set of rectangles
|
|
||||||
if( filename == "cv/shared/1_itseez-0000492.png" && faces.size() == (size_t)3 ) |
|
||||||
{ |
|
||||||
faces.erase(faces.begin()); |
|
||||||
} |
|
||||||
|
|
||||||
std::sort(faces.begin(), faces.end(), comparators::RectLess()); |
|
||||||
SANITY_CHECK(faces, 3.001 * faces.size()); |
|
||||||
} |
|
Loading…
Reference in new issue