9/24/2014

OpenCV face detection using adaboost example source code and cpu vs gpu detection speed compare (CascadeClassifier, CascadeClassifier_GPU, detectMultiScale)

OpenCV has AdaBoost algorithm function.
And gpu version also is provided.

For using detection, we prepare the trained xml file.
Although we can train some target using adaboost algorithm in opencv functions, there are several trained xml files in the opencv folder. (mostly in opencv/sources/data/haarcascades )

I will use "haarcascade_frontalface_alt.xml" file for face detection example.

gpu and cpu both versions use xml file.

more detail refer to this source code.
The source code is included 2 version of cpu and gpu.

result is ..
gpu is faster than cpu version (but exactly they may not be same condition..)
blue boxes are result of cpu.
red boxes are results of gpu.
The results are not important because it can be different by parameters values.



#include < stdio.h>   
#include < opencv2\opencv.hpp>   
#include < opencv2\gpu\gpu.hpp>   
#include < vector>


using namespace cv;
using namespace std;   
  
  
#ifdef _DEBUG           
#pragma comment(lib, "opencv_core249d.lib")            
#pragma comment(lib, "opencv_imgproc249d.lib")   //MAT processing           
#pragma comment(lib, "opencv_objdetect249d.lib") //HOGDescriptor   
#pragma comment(lib, "opencv_gpu249d.lib")           
#pragma comment(lib, "opencv_highgui249d.lib")                
#else           
#pragma comment(lib, "opencv_core249.lib")           
#pragma comment(lib, "opencv_imgproc249.lib")           
#pragma comment(lib, "opencv_objdetect249.lib")           
#pragma comment(lib, "opencv_gpu249.lib")           
#pragma comment(lib, "opencv_highgui249.lib")           
#endif    



void main()
{
 //for time measure
 float TakeTime;
 unsigned long Atime, Btime;

 //window
 namedWindow("origin");

 //load image
 Mat img = imread("sh.jpg");
 Mat grayImg; //adaboost detection is gray input only.
 cvtColor(img, grayImg, CV_BGR2GRAY);

 //load xml file
 string trainface = ".\\haarcascade_frontalface_alt.xml";

 //declaration
 CascadeClassifier ada_cpu;
 gpu::CascadeClassifier_GPU ada_gpu;

 if(!(ada_cpu.load(trainface)))
 {
  printf(" cpu ada xml load fail! \n");
  return ;
 }

 if(!(ada_gpu.load(trainface)))
 {
  printf(" gpu ada xml load fail! \n");
  return ;
 }

 //////////////////////////////////////////////
 //cpu case face detection code
 vector< Rect > faces;
 Atime = getTickCount();
 ada_cpu.detectMultiScale(grayImg, faces);
 Btime = getTickCount();
 TakeTime =  (Btime - Atime)/getTickFrequency();
 printf("detected face(cpu version) = %d / %lf sec take.\n", faces.size(), TakeTime);
 if( faces.size() >=1 )
 {

  for(int ji = 0; ji < faces.size(); ++ji)
  {
   rectangle(img, faces[ji], CV_RGB(0,0,255), 4);
  }
 }
 
 /////////////////////////////////////////////
 //gpu case face detection code
 gpu::GpuMat faceBuf_gpu;
 gpu::GpuMat GpuImg;
 GpuImg.upload(grayImg);
 Atime = getTickCount();
 int detectionNumber = ada_gpu.detectMultiScale(GpuImg, faceBuf_gpu);
 Btime = getTickCount();
 TakeTime =  (Btime - Atime)/getTickFrequency();
 printf("detected face(gpu version) =%d / %lf sec take.\n", detectionNumber, TakeTime);
 Mat faces_downloaded;
 if(detectionNumber >= 1)
 {
  faceBuf_gpu.colRange(0, detectionNumber).download(faces_downloaded);
  Rect* faces = faces_downloaded.ptr< Rect>();


  for(int ji = 0; ji < detectionNumber; ++ji)
  {
   rectangle(img, Point(faces[ji].x, faces[ji].y), Point(faces[ji].x+faces[ji].width, faces[ji].y+faces[ji].height), CV_RGB(255,0,0), 2);
  }
 }
 
 
 /////////////////////////////////////////////////
 //result display
 imshow("origin", img);
 waitKey(0);

}

..
Github
https://github.com/MareArts/AdaBoost-Face-Detection-test-using-OpenCV

11 comments:

  1. gpu::CascadeClassifier_GPU ada_gpu; having error in this line and

    ReplyDelete
    Replies
    1. Do you use same opencv version 249?

      Delete
    2. This comment has been removed by the author.

      Delete
  2. opencv 2.4.11 visual studio 2013 and cuda 7.5 toolkit

    ReplyDelete
    Replies
    1. I think there are about 3 cause.

      1. the parameter changed of the function in 2.4.11
      2. lib, dll, header file including missing.
      3. code error(user fault)

      Check try gain?
      Thank you.

      Delete
    2. getting an error related to no gpu support even after successful cmake

      Delete
    3. Check your dll is 32bit or 64bit?
      and I uploaded source code on github
      https://github.com/MareArts/AdaBoost-Face-Detection-test-using-OpenCV

      The code is run well. I have tested just now.

      Thank you.

      Delete
    4. thank you so much but i would like to know you opencv settings with visual studio and gpu

      Delete
    5. Download opencv and set path in Visual Studio.
      refer to here -> http://study.marearts.com/2013/08/visual-studio-2012-opencv-246-setting.html

      But you want to use GPU, then build library self.
      Set build option using cmake, and build in VS then dll is made.
      refer to here
      http://study.marearts.com/search/label/Opencv%20Build

      but simple method is to use vs plug in. gpu use also possible
      who made opecv plug to use simple in vs
      refer to here
      http://study.marearts.com/search/label/ceemple


      Delete
  3. I have problem to compile, I copy the "haarcascade_frontalface_alt.xml" file in a specific location?

    ReplyDelete
    Replies
    1. xml file located in project folder or bin folder.
      Thank you.

      Delete