From: Baichuan Su Date: Sat, 9 Nov 2013 00:42:39 +0000 (+0800) Subject: Add OpenCL SVM paths for bagofwords_classification and points_classifier samples. X-Git-Tag: accepted/tizen/ivi/20140515.103456~1^2~210^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=00300baa53a6f57c8f5c2c52c7e32d6077802417;p=profile%2Fivi%2Fopencv.git Add OpenCL SVM paths for bagofwords_classification and points_classifier samples. --- diff --git a/samples/cpp/CMakeLists.txt b/samples/cpp/CMakeLists.txt index 4eabd09..ebee5bd 100644 --- a/samples/cpp/CMakeLists.txt +++ b/samples/cpp/CMakeLists.txt @@ -20,6 +20,10 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) ocv_include_directories("${OpenCV_SOURCE_DIR}/modules/gpu/include") endif() + if(HAVE_opencv_ocl) + ocv_include_directories("${OpenCV_SOURCE_DIR}/modules/ocl/include") + endif() + if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function") endif() @@ -47,6 +51,10 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) target_link_libraries(${the_target} opencv_gpu) endif() + if(HAVE_opencv_ocl) + target_link_libraries(${the_target} opencv_ocl) + endif() + set_target_properties(${the_target} PROPERTIES OUTPUT_NAME "cpp-${sample_kind}-${name}" PROJECT_LABEL "(${sample_KIND}) ${name}") diff --git a/samples/cpp/bagofwords_classification.cpp b/samples/cpp/bagofwords_classification.cpp index 39342c4..9749b4a 100644 --- a/samples/cpp/bagofwords_classification.cpp +++ b/samples/cpp/bagofwords_classification.cpp @@ -1,8 +1,12 @@ +#include "opencv2/opencv_modules.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/ml/ml.hpp" +#ifdef HAVE_OPENCV_OCL +#include "opencv2/ocl/ocl.hpp" +#endif #include #include @@ -2373,9 +2377,15 @@ static void setSVMTrainAutoParams( CvParamGrid& c_grid, CvParamGrid& gamma_grid, degree_grid.step = 0; } +#ifdef HAVE_OPENCV_OCL +static void trainSVMClassifier( cv::ocl::CvSVM_OCL& svm, const SVMTrainParamsExt& svmParamsExt, const string& objClassName, VocData& vocData, + Ptr& bowExtractor, const Ptr& fdetector, + const string& resPath ) +#else static void trainSVMClassifier( CvSVM& svm, const SVMTrainParamsExt& svmParamsExt, const string& objClassName, VocData& vocData, Ptr& bowExtractor, const Ptr& fdetector, const string& resPath ) +#endif { /* first check if a previously trained svm for the current class has been saved to file */ string svmFilename = resPath + svmsDir + "/" + objClassName + ".xml.gz"; @@ -2448,9 +2458,15 @@ static void trainSVMClassifier( CvSVM& svm, const SVMTrainParamsExt& svmParamsEx } } +#ifdef HAVE_OPENCV_OCL +static void computeConfidences( cv::ocl::CvSVM_OCL& svm, const string& objClassName, VocData& vocData, + Ptr& bowExtractor, const Ptr& fdetector, + const string& resPath ) +#else static void computeConfidences( CvSVM& svm, const string& objClassName, VocData& vocData, Ptr& bowExtractor, const Ptr& fdetector, const string& resPath ) +#endif { cout << "*** CALCULATING CONFIDENCES FOR CLASS " << objClassName << " ***" << endl; cout << "CALCULATING BOW VECTORS FOR TEST SET OF " << objClassName << "..." << endl; @@ -2589,7 +2605,11 @@ int main(int argc, char** argv) for( size_t classIdx = 0; classIdx < objClasses.size(); ++classIdx ) { // Train a classifier on train dataset +#ifdef HAVE_OPENCV_OCL + cv::ocl::CvSVM_OCL svm; +#else CvSVM svm; +#endif trainSVMClassifier( svm, svmTrainParamsExt, objClasses[classIdx], vocData, bowExtractor, featureDetector, resPath ); diff --git a/samples/cpp/points_classifier.cpp b/samples/cpp/points_classifier.cpp index e23b276..ca6c0c6 100644 --- a/samples/cpp/points_classifier.cpp +++ b/samples/cpp/points_classifier.cpp @@ -1,6 +1,10 @@ +#include "opencv2/opencv_modules.hpp" #include "opencv2/core/core.hpp" #include "opencv2/ml/ml.hpp" #include "opencv2/highgui/highgui.hpp" +#ifdef HAVE_OPENCV_OCL +#include "opencv2/ocl/ocl.hpp" +#endif #include @@ -133,7 +137,14 @@ static void find_decision_boundary_KNN( int K ) prepare_train_data( trainSamples, trainClasses ); // learn classifier +#ifdef HAVE_OPENCV_OCL + cv::ocl::KNearestNeighbour knnClassifier; + Mat temp, result; + knnClassifier.train(trainSamples, trainClasses, temp, false, K); + cv::ocl::oclMat testSample_ocl, reslut_ocl; +#else CvKNearest knnClassifier( trainSamples, trainClasses, Mat(), false, K ); +#endif Mat testSample( 1, 2, CV_32FC1 ); for( int y = 0; y < img.rows; y += testStep ) @@ -142,9 +153,19 @@ static void find_decision_boundary_KNN( int K ) { testSample.at(0) = (float)x; testSample.at(1) = (float)y; +#ifdef HAVE_OPENCV_OCL + testSample_ocl.upload(testSample); + + knnClassifier.find_nearest(testSample_ocl, K, reslut_ocl); + + reslut_ocl.download(result); + int response = saturate_cast(result.at(0)); + circle(imgDst, Point(x, y), 1, classColors[response]); +#else int response = (int)knnClassifier.find_nearest( testSample, K ); circle( imgDst, Point(x,y), 1, classColors[response] ); +#endif } } } @@ -159,7 +180,11 @@ static void find_decision_boundary_SVM( CvSVMParams params ) prepare_train_data( trainSamples, trainClasses ); // learn classifier +#ifdef HAVE_OPENCV_OCL + cv::ocl::CvSVM_OCL svmClassifier(trainSamples, trainClasses, Mat(), Mat(), params); +#else CvSVM svmClassifier( trainSamples, trainClasses, Mat(), Mat(), params ); +#endif Mat testSample( 1, 2, CV_32FC1 ); for( int y = 0; y < img.rows; y += testStep ) @@ -178,7 +203,7 @@ static void find_decision_boundary_SVM( CvSVMParams params ) for( int i = 0; i < svmClassifier.get_support_vector_count(); i++ ) { const float* supportVector = svmClassifier.get_support_vector(i); - circle( imgDst, Point(supportVector[0],supportVector[1]), 5, Scalar(255,255,255), -1 ); + circle( imgDst, Point(saturate_cast(supportVector[0]),saturate_cast(supportVector[1])), 5, CV_RGB(255,255,255), -1 ); } }