opencv 에서 opencl 살짝 써보기

Post on 31-Jul-2015

752 Views

Category:

Software

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

OpenCV 에서OpenCL 살짝 써보기

송승화

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

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

한마디로 CUDA 안 쓰고

GPGPU 쓸 수 있는 오픈 플랫폼

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

nVidia, Fxxk you

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

OpenCL 을 지원하는 회사들

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

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

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

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

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

그 다음 OpenCV

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

• OpenCV 3.0 릴리즈 (2015.6.4)

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

준비물 1 : GPU 또는 CPU

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

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

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

( 드라이버 지원 여부에 따라 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

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

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

준비물 3 : OpenCV

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

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

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

Download and Install~

OpenCV Transparent API

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

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

출처 : opencv.org

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

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

사실은 그냥 이게 끝… ;;

예제 하나만 만들어 보자

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

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

어때요 , 참 쉽죠 ~?

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

예제 풀 버전• https://

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

하겠습니다

여기서 잠깐 !!

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 사용

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

프로세스 실행 ..

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

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

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

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

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

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

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

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

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

이렇게 하면 되겠지요 ?

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

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

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

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

결론

쉽게 GPGPU 쓰자

top related