일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- c++
- 빅 데이타
- Machine Learning
- 데이터 과학
- Deep learning
- 딥러닝
- R
- nodeJS
- 김양재 목사
- Statistics
- 김양재
- WebGL
- 확률
- openCV
- 김양재 목사님
- 몽고디비
- MongoDB
- 빅 데이터
- probability
- 우리들교회
- 주일설교
- 빅데이터
- Artificial Intelligence
- 인공지능
- Big Data
- 통계
- data science
- No SQL
- 빅데이타
- node.js
Archives
- Today
- Total
Scientific Computing & Data Science
[OpenCV] Canny Edge Detector에 대한 CPU와 CUDA 비교 본문
이번 포스팅에서는 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, -1, 50, 7 ); cv::Canny( dst, dst, 35.0, 200.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, -1, 50, 7 ); Ptr<cuda::CannyEdgeDetector> canny = cuda::createCannyEdgeDetector( 35.0, 200.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가 더 큰 것일지도 모르겠습니다.
'Programming > OpenCV' 카테고리의 다른 글
[OpenCV] Bitwise Operation (0) | 2015.09.20 |
---|---|
[OpenCV] 2D Convolution / New Filter (0) | 2015.09.16 |
[OpenCV] cuda:: DeviceInfo() 함수를 이용한 CUDA Device 정보 출력하기 (0) | 2015.08.30 |
[Programming / OpenCV] Face Recognition(안면 인식) (2) | 2015.08.09 |
[OpenCV] Harris Corner Detector (0) | 2015.07.25 |
Comments