Top Banner
OpenCV 에에 OpenCL 에에 에에에 에에에
39

OpenCV 에서 OpenCL 살짝 써보기

Jul 31, 2015

Download

Software

Seunghwa Song
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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 쓰자