OpenCV를 활용하는 영상처리 어플리케이션 개발자들은 항상 GPU 자원을 활용하고 싶을 것이다. 하지만 이기종 컴퓨팅 환경에서 CPU 이외의 다른 하드웨어 자원을 활용하는 것은 개발 환경 및 백그라운드 지식 등의 많은 어려움이 따른다.
GPGPU 활용에 가장 상용화로 성공한 대중적인 솔루션으로는 nVidia 사의 CUDA 기술이 있지만, 그 외에도 GPGPU 자원을 쉽게 활용할 수 있는 오픈 플랫폼이 있는데 이것이 OpenCL 표준이다.
최근 하드웨어와 소프트웨어 진영에서 모두 OpenCL의 지원 및 발전이 두드러지며 점점 더 확산되는 추세이다.
OpenCV 진영에서도, 3.0이 정식 릴리즈 면서 본격적으로 OpenCL을 활용하기가 한층 쉬워졌다.
2. OpenCL 이란
• 이기종 멀티코어 환경을 위한 표준 플랫폼
• Apple의 Aaftab Munshi 가 제안
• Khronos Group 에서 관리
• 현재 v2.1 명세까지 공개
• GPGPU 활용에 적합
• OpenCL C는 Ansi C를 확장하여 Streaming Programming이 가능하
도록 만든 언어로 Brook String Language에서 파생되었으며 nVidia
의 CUDA와 근원이 같아서 비슷함
4. GPGPU 쓰고 싶은데
CUDA 디바이스 너무 비싸요
nVidia, Fxxk you
nVidia에 개인적인 감정은 없습니다.
그냥 오픈 소스 진영에서 그만큼 싫어한다는 뜻이에요
5. OpenCL을 지원하는 회사들
CUDA 하느라 바쁨
최근에서야 겨우
1.2 드라이버 내놓음
CUDA 따라잡으려고(?)
초반부터
제일 열심히 함
임베디드에서
꽤 열심 1.2 지원
부자집 우등생
그냥 열심히 함
nVidia에 개인적인 감정은 없습니다.
그냥 오픈 소스 진영에서 그만큼 싫어한다는 뜻이에요
6. 그 다음 OpenCV
• 가장 널리 쓰이는 영상 처리 오
픈 라이브러리 중 하나
• OpenCV 3.0 릴리즈 (2015.6.4)
• Lena 이미지를 예제로 활용한
것으로 유명
7. 준비물 1 : GPU 또는 CPU
• OpenCL 1.2 지원되는 것으로
• wikipedia 검색해서 (OpenCL 1.2 이상 지
원) 되는걸 고르면 된다. 본인 능력 닿는데
까지..
8. 본인이 갖고 있는 GPU가 OpenCL을 지원하
는지 GPU-Z 툴로 간단히 확인 가능
(드라이버 지원 여부에 따라 OpenCL 명세 지원이 달라지므로 버전 정
보는 이 툴에서 볼 수 없음)
9. 준비물 2 : OpenCL 플랫폼
• 역시 OpenCL 1.2 이상 지원되는 것!
• 그냥 자기 디바이스 지원 잘되는 걸로 골
라서 Download and Install~
– AMD APP SDK
– Nvidia OpenCL Driver and Tools
– Intel SDK for OpenCL
– IBM OpenCL Common Runtime
12. 준비물 3 : OpenCV
• OpenCV 3.0 받아서 설치
http://www.opencv.org
• 2.X 에서도 지원되지만 버그도 많고
deprecated version 이라고 공지가 떴으니
과감히 버리자
• 그리고 무엇보다 Transparent API 라는 새
로운 개념 도입으로 3.0을 쓰길 추천
18. cv::Mat matSrc_; //source image 저장하는 매트릭스
cv::UMat umatSrc_; //소스 이미지를 OpenCL 디바이스로 복사하기 위한
매트릭스
cv::UMat umatGray_; //OpenCL 디바이스에서 Gray로 변환하여 저장할 매
트릭스
umatSrc_ = matSrc_.getUMat(cv::ACCESS_READ); // 소스 이미지를
OpenCL 디바이스 영역으로 복사
얼굴 인식 Psuedo Code 1단계 :
OpenCL 객체 생성 및
OpenCL 디바이스(GPU)로 이미지 복사
19. cv::OclCascadeClassifier cascade_;
cascade_.load("./haarcascade_frontalface_default.xml");
//ocl cascade classifier 객체 생성 및 얼굴 인식 학습 데이터 로드
cv::cvtColor( umatSrc_, umatGray_, CV_BGR2GRAY );
//cvtColor 로 gray 레벨로 변환. API는 똑같지만 인자로 전달된 매트릭스
들이 UMat 이다. 이 연산은 OpenCL 디바이스 에서 이루어 진다.
std::vector<cv::Rect> faces; //연산 결과가 이곳에 저장
cascade_.detectMultiScale( umatGray_, faces, 1.1, 2,
CV_HAAR_SCALE_IMAGE);
//cascade classifier 로 얼굴 인식 연산 수행. 역시 OpenCL 디바이스 자원
을 사용해서 수행되며 결과는 host(CPU) 영역의 face vector에 저장
얼굴 인식 Psuedo Code 2단계 :
OpenCL 디바이스에서 그냥 연산
20. 어때요, 참 쉽죠~?
cv::Mat matSrc_; cv::UMat umatSrc_; cv::UMat umatGray_;
GPU로
copy
Gray
변환
Haarcascade 검출기
std::vector<cv::Rect> faces
Rect(x, y, w, h)
CPU로 결과 복사
(얼굴 위치)
CPU 영역(호스트) GPU 영역(OpenCL 디바이스)
21. 예제 풀 버전
• https://github.com/sshtel/opencv3_practice
• 개발 환경 : Visual Studio 2013
• 추후 리눅스 환경에서의 빌드 환경도 업데이트
하겠습니다
22. 여기서 잠깐!!
OpenCV 에서는 하나의 문맥만을 지원한다
(여기서 문맥이란 OpenCL 디바이스 자원을 활용하
는 일련의 알고리즘 및 로직을 정의하는 것)
25. 예를 들면
• 시스템이 Intel i5-4690 CPU와 AMD
Radeon R7 200 GPU로 구성
• Intel CPU 에는 HD 4600 내장 그래픽 코
어도 존재
OPENCV_OPENCL_DEVICE=:CPU:0 Intel i5-4690 CPU 사용
OPENCV_OPENCL_DEVICE=:GPU:0 Intel HD4600 GPU 사용
OPENCV_OPENCL_DEVICE=:GPU:1 AMD Radeon R7 GPU 사용