opencv 에서 opencl 살짝 써보기

39
OpenCV 에에 OpenCL 에에 에에에 에에에

Upload: seunghwa-song

Post on 31-Jul-2015

752 views

Category:

Software


2 download

TRANSCRIPT

Page 1: OpenCV 에서 OpenCL 살짝 써보기

OpenCV 에서OpenCL 살짝 써보기

송승화

Page 2: OpenCV 에서 OpenCL 살짝 써보기

OpenCL 이란• 이기종 멀티코어 환경을 위한 표준 플랫폼• Apple 의 Aaftab Munshi 가 제안• Khronos Group 에서 관리• 현재 v2.1 명세까지 공개• GPGPU 활용에 적합• OpenCL C 는 Ansi C 를 확장하여 Streaming Programming 이

가능하도록 만든 언어로 Brook String Language 에서 파생되었으며 nVidia 의 CUDA 와 근원이 같아서 비슷함

Page 3: OpenCV 에서 OpenCL 살짝 써보기

한마디로 CUDA 안 쓰고

GPGPU 쓸 수 있는 오픈 플랫폼

Page 4: OpenCV 에서 OpenCL 살짝 써보기

GPGPU 쓰고 싶은데 CUDA 디바이스 너무 비싸요

nVidia, Fxxk you

nVidia에 개인적인 감정은 없습니다 .그냥 오픈 소스 진영에서 그만큼 싫어한다는 뜻이에요

Page 5: OpenCV 에서 OpenCL 살짝 써보기

OpenCL 을 지원하는 회사들

CUDA 하느라 바쁨최근에서야 겨우1.2 드라이버 내놓음

CUDA 따라잡으려고 (?)초반부터제일 열심히 함

임베디드에서꽤 열심 1.2 지원

부자집 우등생그냥 열심히 함

nVidia에 개인적인 감정은 없습니다 .그냥 오픈 소스 진영에서 그만큼 싫어한다는 뜻이에요

Page 6: OpenCV 에서 OpenCL 살짝 써보기

그 다음 OpenCV

• 가장 널리 쓰이는 영상 처리 오픈 라이브러리 중 하나

• OpenCV 3.0 릴리즈 (2015.6.4)

• Lena 이미지를 예제로 활용한 것으로 유명

Page 7: OpenCV 에서 OpenCL 살짝 써보기

준비물 1 : GPU 또는 CPU

• OpenCL 1.2 지원되는 것으로• wikipedia 검색해서 (OpenCL 1.2 이상

지원 ) 되는걸 고르면 된다 . 본인 능력 닿는데 까지 ..

Page 8: OpenCV 에서 OpenCL 살짝 써보기

본인이 갖고 있는 GPU 가 OpenCL 을 지원하는지 GPU-Z 툴로 간단히 확인 가능

( 드라이버 지원 여부에 따라 OpenCL 명세 지원이 달라지므로 버전 정보는 이 툴에서 볼 수 없음 )

Page 9: OpenCV 에서 OpenCL 살짝 써보기

준비물 2 : OpenCL 플랫폼• 역시 OpenCL 1.2 이상 지원되는 것 !

• 그냥 자기 디바이스 지원 잘되는 걸로 골라서 Download and Install~

– AMD APP SDK– Nvidia OpenCL Driver and Tools– Intel SDK for OpenCL– IBM OpenCL Common Runtime

Page 10: OpenCV 에서 OpenCL 살짝 써보기

AMD APP 설치 후OpenCL 디바이스 정보 확인 예시

Page 11: OpenCV 에서 OpenCL 살짝 써보기

AMD APP 설치 후OpenCL 디바이스 정보 확인 예시

Page 12: OpenCV 에서 OpenCL 살짝 써보기

준비물 3 : OpenCV

• OpenCV 3.0 받아서 설치 http://www.opencv.org

• 2.X 에서도 지원되지만 버그도 많고 depre-cated version 이라고 공지가 떴으니 과감히 버리자

• 그리고 무엇보다 Transparent API 라는 새로운 개념 도입으로 3.0 을 쓰길 추천

Page 13: OpenCV 에서 OpenCL 살짝 써보기

Download and Install~

Page 14: OpenCV 에서 OpenCL 살짝 써보기

OpenCV Transparent API

• 3.0 에서 새로 도입된 인터페이스

• 기존의 전통적인 CPU 기반 코드와 API 의 변화가 없이 이기종 프로세서의 자원을 그대로 활용 가능

Page 15: OpenCV 에서 OpenCL 살짝 써보기

출처 : opencv.org

2.X 에서 OpenCL 모듈을 사용하기 위해서 ocl:: 네임 스페이스 안에 구현된 API 를 사용한 반면 ,

3.0 에서는 Mat 클래스 대신 UMat 을 사용하기만 하면 된다 . ( 코드 변화가 거의 없음 )

Page 16: OpenCV 에서 OpenCL 살짝 써보기

사실은 그냥 이게 끝… ;;

Page 17: OpenCV 에서 OpenCL 살짝 써보기

예제 하나만 만들어 보자

Page 18: OpenCV 에서 OpenCL 살짝 써보기

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) 로 이미지 복사

Page 19: OpenCV 에서 OpenCL 살짝 써보기

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 디바이스에서 그냥 연산

Page 20: OpenCV 에서 OpenCL 살짝 써보기

어때요 , 참 쉽죠 ~?

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 디바이스 )

Page 21: OpenCV 에서 OpenCL 살짝 써보기

예제 풀 버전• https://

github.com/sshtel/opencv3_practice• 개발 환경 : Visual Studio 2013• 추후 리눅스 환경에서의 빌드 환경도 업데이트

하겠습니다

Page 22: OpenCV 에서 OpenCL 살짝 써보기

여기서 잠깐 !!

OpenCV 에서는 하나의 문맥만을 지원한다

( 여기서 문맥이란 OpenCL 디바이스 자원을 활용하는 일련의 알고리즘 및 로직을 정의하는 것 )

Page 23: OpenCV 에서 OpenCL 살짝 써보기

따라서 하나의 프로세스에서하나의 디바이스만을 선택할 수 밖에없다는 제한이 있다 .

이런 거 있어도 다 못써요

Page 24: OpenCV 에서 OpenCL 살짝 써보기

프로세스를 실행하기 전에환경변수에 사용할 디바이스를

미리 설정해야 한다

Page 25: OpenCV 에서 OpenCL 살짝 써보기

예를 들면• 시스템이 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 사용

Page 26: OpenCV 에서 OpenCL 살짝 써보기

윈도우 환경 변수 설정 예시OPENCV_OPENCL_DEVICE=:GPU:1

Page 27: OpenCV 에서 OpenCL 살짝 써보기

프로세스 실행 ..

Page 28: OpenCV 에서 OpenCL 살짝 써보기

OPENCV_OPENCL_DEVICE=:GPU:1AMD Radeon R7 200 GPU 자원 사용

Page 29: OpenCV 에서 OpenCL 살짝 써보기

OPENCV_OPENCL_DEVICE=:GPU:1반면 HD4600 내장 그래픽 코어는 놀고 있다

Page 30: OpenCV 에서 OpenCL 살짝 써보기

이번에는 OPENCV_OPENCL_DEVICE=:GPU:0으로 환경 변수 설정을 해보자

Page 31: OpenCV 에서 OpenCL 살짝 써보기

환경 변수를 바꾸면 CMD 창을다시 띄워야 한다

Page 32: OpenCV 에서 OpenCL 살짝 써보기

OPENCV_OPENCL_DEVICE=:GPU:0Intel HD4600( 내장 그래픽 ) 자원 사용

Page 33: OpenCV 에서 OpenCL 살짝 써보기

OPENCV_OPENCL_DEVICE=:GPU:0반면 Radeon 외장 그래픽 코어는 놀고 있다

Page 34: OpenCV 에서 OpenCL 살짝 써보기

개발 툴에서 환경변수설정(Visual studio 2013)

Page 35: OpenCV 에서 OpenCL 살짝 써보기

개발 툴에서 환경변수설정(Visual studio 2013)

Page 36: OpenCV 에서 OpenCL 살짝 써보기

리눅스에선$ export OPENCV_OPENCL_DEVICE=:GPU:1$ ./face_detection

이렇게 하면 되겠지요 ?

Page 37: OpenCV 에서 OpenCL 살짝 써보기

장점OpenCV 에서 OpenCL 을 이용하여GPU 자원을 활용하기 참 쉽게 만들어 뒀다

어플리케이션 개발자는 알고리즘에 집중하고 어떤 연산을 어떤 디바이스에 Offload 시킬지 여부만 고민하면 된다

Page 38: OpenCV 에서 OpenCL 살짝 써보기

단점TAPI 로 개발 편의성과 코드 호환성을 높였지만하나의 OpenCL 디바이스만 사용 가능

하지만 향후 멀티 디바이스를 지원한다고 한다

Page 39: OpenCV 에서 OpenCL 살짝 써보기

결론

쉽게 GPGPU 쓰자