Quantcast
Channel: OpenCV Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 41027

speed improvement cascade gpu

$
0
0
Hi, I just relate the improvement I got by chance, working with cascadeclassifier_gpu.cpp (v 2.4.10) I tried this file with a webcam video stream and one face picture in front of the cam. I was disappointed by the performance of my new gpu_2 against gpu_1. Gpu_1 computes at 5.5 fps, gpu_2 at 7.5 fps. In order to simplify the main code I wrote a function dealing with gpu code only. The result was astonishing, gpu_2 computes 10 x faster in average, between 40 and 100 fps average 70, same for gpu_1 between 30 and 40 fps, average 35. I precise that the high speed computing appears only when there is a detection, without the speed slow down at 7.5 for gpu 2, 5.5 for gpu_2 What is going on ? does anybody have an idea ? Regards Linux 3.19.8-100.fc20.x86_64 #1 SMP nvidia driver 340.76 GPU_1 geforce 9500 GT 500M 32 cores GPU_2 geforce GT 720 1024M 192 cores ******* part of the original code without the use of a function: (image.empty() ? frame : image).copyTo(frame_cpu); frame_gpu.upload(image.empty() ? frame : image); convertAndResize(frame_gpu, gray_gpu, resized_gpu, scaleFactor); convertAndResize(frame_cpu, gray_cpu, resized_cpu, scaleFactor); TickMeter tm; tm.start(); cascade_gpu.findLargestObject = findLargestObject; detections_num = cascade_gpu.detectMultiScale(resized_gpu, facesBuf_gpu, 1.2, (filterRects || findLargestObject) ? 4 : 0); facesBuf_gpu.colRange(0, detections_num).download(faces_downloaded); resized_gpu.download(resized_cpu); for (int i = 0; i< detections_num; ++i) { rectangle(resized_cpu, faces_downloaded.ptr()[i], Scalar(255)); } tm.stop(); double detectionTime = tm.getTimeMilli(); double fps = 1000 / detectionTime; ***** the function created static int getTargets (Mat &frame, CascadeClassifier_GPU &cascade_gpu, double scaleFactor, Rect* &faceRects, Mat &resized_cpu) { int detections_num=0; GpuMat facesBuf_gpu, frame_gpu, gray_gpu, resized_gpu; Mat faces_downloaded; frame_gpu.upload( frame ); convertAndResize(frame_gpu, gray_gpu, resized_gpu, scaleFactor); cascade_gpu.findLargestObject = true; detections_num = cascade_gpu.detectMultiScale(resized_gpu, facesBuf_gpu, 1.2, 4); facesBuf_gpu.colRange(0, detections_num).download(faces_downloaded); resized_gpu.download(resized_cpu); if( detections_num > 0) { faceRects = faces_downloaded.ptr(); } return detections_num; } ***** main code modified (image.empty() ? frame : image).copyTo(frame_cpu); convertAndResize(frame_cpu, gray_cpu, resized_cpu, scaleFactor); TickMeter tm; tm.start(); Rect *faceRects ; detections_num = getTargets(frame, cascade_gpu, scaleFactor, faceRects, resized_cpu); for (int i = 0; i < detections_num; ++i) { rectangle(resized_cpu, faceRects[i], Scalar(255)); } tm.stop();

Viewing all articles
Browse latest Browse all 41027

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>