05-04 14:17
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[OpenCV] Canny Edge Detector에 대한 CPU와 CUDA 비교 본문

Programming/OpenCV

[OpenCV] Canny Edge Detector에 대한 CPU와 CUDA 비교

cinema4dr12 2015. 9. 2. 00:05

이번 포스팅에서는 OpenCV의 CUDA 라이브러리 함수를 이용하여 Canny Edge Detector에 대한 연산 성능을 비교해 보도록 하겠습니다.


연산에 사용할 이미지는 Pixar Animation의 Up의 포스터입니다.


1. CPU

[Example Code]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include "opencv2/opencv.hpp"
 
using namespace cv;
 
int main( int argc, _TCHAR* argv[] )
{
    const int64 start = getTickCount();
 
    cv::Mat src = cv::imread( "up.jpg"0 );
 
    if!src.data ) exit( 1 );
 
    cv::Mat dst;
 
    cv::bilateralFilter( src, dst, -1507 );
    cv::Canny( dst, dst, 35.0200.0 );
 
    cv::imwrite( "cpu_canny.png", dst );
 
    const double timeSec = (getTickCount() - start) / getTickFrequency();
    std::cout << "Time : " << timeSec << " sec" << std::endl;
     
    return 0;
}
cs


[RESULT]

Time: 0.594234 sec


0.6초 정도 걸렸으며, 결과 이미지는 다음과 같습니다.


2. GPU(CUDA)

OpenCV의 CUDA 라이브러리 함수로 연산을 해 보았습니다.


[Example Code]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core/cuda.hpp"
#include "opencv2/cudafilters.hpp"
#include "opencv2/cudaimgproc.hpp"
 
using namespace cv;
 
int main( int argc, _TCHAR* argv[] )
{
    const int64 start = getTickCount();
 
    cv::Mat src = cv::imread( "up.jpg"0 );
 
    if!src.data ) exit( 1 );
 
    cv::cuda::GpuMat d_src( src );
    cv::cuda::GpuMat d_dst;
 
    cv::cuda::bilateralFilter( d_src, d_dst, -1507 );
    Ptr<cuda::CannyEdgeDetector> canny = cuda::createCannyEdgeDetector( 35.0200.0 );
    canny->detect( d_src, d_dst );
 
    cv::Mat dst( d_dst );
 
    cv::imwrite( "cuda_canny.png", dst );
 
    const double timeSec = (getTickCount() - start) / getTickFrequency();
    std::cout << "Time : " << timeSec << " sec" << std::endl;
    
    return 0;
}
cs


[RESULT]

Time : 1.38885 sec


오히려 CPU보다 연산 시간이 더 걸렸습니다.


CannyEdgeDetector 함수의 high & low threshold를 CPU 연산과 동일하게 한다고 했는데 결과 이미지도 다르게 나옵니다. 시간이 더 걸린 이유가 CUDA의 경우가 훨씬 복잡해서인지 아니면 걸린 시간을 계산하는 방법이 잘못 된 것인지 좀 더 연구해 봐야 겠습니다. 이미지 사이즈가 크지 않아 Host-Device 간 메모리 복사에 대한 overhead가 더 큰 것일지도 모르겠습니다.



Comments