SlideShare a Scribd company logo
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 에서도 지원되지만 버그도 많고
deprecated 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:1
AMD Radeon R7 200 GPU 자원 사용
OPENCV_OPENCL_DEVICE=:GPU:1
반면 HD4600 내장 그래픽 코어는 놀고 있다
이번에는
OPENCV_OPENCL_DEVICE=:GPU:0
으로 환경 변수 설정을 해보자
환경 변수를 바꾸면 CMD 창을
다시 띄워야 한다
OPENCV_OPENCL_DEVICE=:GPU:0
Intel 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 쓰자

More Related Content

PDF
Automating linux network performance testing
PDF
Gtk development-using-glade-3
PDF
Linux KVM のコードを追いかけてみよう
PPTX
OVN DBs HA with scale test
PDF
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
PPTX
Introduction à Node.js
PPTX
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
PPTX
epoll() - The I/O Hero
Automating linux network performance testing
Gtk development-using-glade-3
Linux KVM のコードを追いかけてみよう
OVN DBs HA with scale test
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
Introduction à Node.js
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
epoll() - The I/O Hero

What's hot (20)

PDF
Introduction to the Qt Quick Scene Graph
 
PDF
NEDIA_SNIA_CXL_講演資料.pdf
PPTX
Write microservice in golang
PDF
ExoPlayer for Application developers
PPTX
Git in 10 minutes
PDF
삶이편해지는_백엔드_개발자_지식.pdf
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PPTX
Protocol buffers
PDF
Iocp 기본 구조 이해
PDF
ウェーブレット木の世界
PDF
Git Branching Model
PDF
PythonとVeriloggenを用いたRTL設計メタプログラミング
PDF
20111015 勉強会 (PCIe / SR-IOV)
PDF
How A Compiler Works: GNU Toolchain
PPTX
Git 101 for Beginners
PDF
Veriloggen.Stream: データフローからハードウェアを作る(2018年3月3日 高位合成友の会 第5回 @東京工業大学)
PPTX
HTTP2 and gRPC
PDF
Introducing GitLab (September 2018)
PDF
Windows IOCP vs Linux EPOLL Performance Comparison
Introduction to the Qt Quick Scene Graph
 
NEDIA_SNIA_CXL_講演資料.pdf
Write microservice in golang
ExoPlayer for Application developers
Git in 10 minutes
삶이편해지는_백엔드_개발자_지식.pdf
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Protocol buffers
Iocp 기본 구조 이해
ウェーブレット木の世界
Git Branching Model
PythonとVeriloggenを用いたRTL設計メタプログラミング
20111015 勉強会 (PCIe / SR-IOV)
How A Compiler Works: GNU Toolchain
Git 101 for Beginners
Veriloggen.Stream: データフローからハードウェアを作る(2018年3月3日 高位合成友の会 第5回 @東京工業大学)
HTTP2 and gRPC
Introducing GitLab (September 2018)
Windows IOCP vs Linux EPOLL Performance Comparison
Ad

Viewers also liked (20)

PPTX
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
PPTX
Svn에서 git으로 이주하기
PPTX
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
PDF
The basics of fluentd
PPTX
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
PDF
병렬프로그래밍과 Cuda
PPTX
VisualStudio vs Eclipse Shortcuts
PPTX
Trends of SW Platforms for Heterogeneous Multi-core systems and Open Source ...
PPTX
Lie Group Formulation for Robot Mechanics
PDF
Lie Group Formulation for Robot Mechanics
PDF
OpenCV를 활용한 컬러추적 문자 인식기의 구현
PPTX
Life of an Fluentd event
PDF
Introduction to Machine Learning and Deep Learning
PPTX
기계학습(Machine learning) 입문하기
PDF
05_컴파일러최적화전략(1)
PDF
Imaging on embedded GPUs
PPTX
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
PDF
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)
PDF
Open cv를 활용한 tracking
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
Svn에서 git으로 이주하기
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
The basics of fluentd
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
병렬프로그래밍과 Cuda
VisualStudio vs Eclipse Shortcuts
Trends of SW Platforms for Heterogeneous Multi-core systems and Open Source ...
Lie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot Mechanics
OpenCV를 활용한 컬러추적 문자 인식기의 구현
Life of an Fluentd event
Introduction to Machine Learning and Deep Learning
기계학습(Machine learning) 입문하기
05_컴파일러최적화전략(1)
Imaging on embedded GPUs
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)
Open cv를 활용한 tracking
Ad

Similar to OpenCV 에서 OpenCL 살짝 써보기 (20)

PDF
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
PPTX
pyOpenCL 입문
PPTX
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
PPTX
C++ GUI 라이브러리 소개: Qt & Nana
PDF
Node.js intro
PDF
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
PDF
강좌 03 개발환경 구축
PPTX
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
PPTX
Eclipse를 이용한 android_open_cv_개발_환경_구축_방법
PPTX
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
PPTX
CUDA 프로그래밍 기초 MODUCON2018
PDF
Jenkins를 활용한 Openshift CI/CD 구성
PDF
Project anarchy로 3d 게임 만들기 part_4_network_memory management
PDF
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
PDF
강분도 - 공개SW개발과 우분투 (2010Y10M05D)
PDF
llvm 소개
PDF
초보 개발자/학생들을 위한 오픈소스 트랜드
PDF
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
PDF
SOSCON 2017 - Backend.AI
PDF
네이버 클라우드 플랫폼의 컨테이너 기술 로드맵 (NBP 박기은 CTO) - NAVER CLOUD PLATFORM in [2018 All A...
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
pyOpenCL 입문
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
C++ GUI 라이브러리 소개: Qt & Nana
Node.js intro
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
강좌 03 개발환경 구축
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
Eclipse를 이용한 android_open_cv_개발_환경_구축_방법
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
CUDA 프로그래밍 기초 MODUCON2018
Jenkins를 활용한 Openshift CI/CD 구성
Project anarchy로 3d 게임 만들기 part_4_network_memory management
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
강분도 - 공개SW개발과 우분투 (2010Y10M05D)
llvm 소개
초보 개발자/학생들을 위한 오픈소스 트랜드
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
SOSCON 2017 - Backend.AI
네이버 클라우드 플랫폼의 컨테이너 기술 로드맵 (NBP 박기은 CTO) - NAVER CLOUD PLATFORM in [2018 All A...

OpenCV 에서 OpenCL 살짝 써보기

  • 1. OpenCV 에서 OpenCL 살짝 써보기 송승화
  • 2. OpenCL 이란 • 이기종 멀티코어 환경을 위한 표준 플랫폼 • Apple의 Aaftab Munshi 가 제안 • Khronos Group 에서 관리 • 현재 v2.1 명세까지 공개 • GPGPU 활용에 적합 • OpenCL C는 Ansi C를 확장하여 Streaming Programming이 가능하 도록 만든 언어로 Brook String Language에서 파생되었으며 nVidia 의 CUDA와 근원이 같아서 비슷함
  • 3. 한마디로 CUDA 안 쓰고 GPGPU 쓸 수 있는 오픈 플랫폼
  • 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
  • 10. AMD APP 설치 후 OpenCL 디바이스 정보 확인 예시
  • 11. AMD APP 설치 후 OpenCL 디바이스 정보 확인 예시
  • 12. 준비물 3 : OpenCV • OpenCV 3.0 받아서 설치 http://www.opencv.org • 2.X 에서도 지원되지만 버그도 많고 deprecated version 이라고 공지가 떴으니 과감히 버리자 • 그리고 무엇보다 Transparent API 라는 새 로운 개념 도입으로 3.0을 쓰길 추천
  • 14. OpenCV Transparent API • 3.0 에서 새로 도입된 인터페이스 • 기존의 전통적인 CPU 기반 코드와 API의 변화가 없이 이기종 프로세서의 자원을 그 대로 활용 가능
  • 15. 출처 : opencv.org 2.X 에서 OpenCL 모듈을 사용하기 위해서 ocl:: 네 임 스페이스 안에 구현된 API를 사용한 반면, 3.0에서는 Mat 클래스 대신 UMat 을 사용하기만 하면 된다. (코드 변화가 거의 없음)
  • 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 디바이스 자원을 활용하 는 일련의 알고리즘 및 로직을 정의하는 것)
  • 23. 따라서 하나의 프로세스에서 하나의 디바이스만을 선택할 수 밖에 없다는 제한이 있다. 이런 거 있어도 다 못써요
  • 24. 프로세스를 실행하기 전에 환경변수에 사용할 디바이스를 미리 설정해야 한다
  • 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 사용
  • 26. 윈도우 환경 변수 설정 예시 OPENCV_OPENCL_DEVICE=:GPU:1
  • 29. OPENCV_OPENCL_DEVICE=:GPU:1 반면 HD4600 내장 그래픽 코어는 놀고 있다
  • 31. 환경 변수를 바꾸면 CMD 창을 다시 띄워야 한다
  • 33. OPENCV_OPENCL_DEVICE=:GPU:0 반면 Radeon 외장 그래픽 코어는 놀고 있다
  • 36. 리눅스에선 $ export OPENCV_OPENCL_DEVICE=:GPU:1 $ ./face_detection 이렇게 하면 되겠지요?
  • 37. 장점 OpenCV 에서 OpenCL을 이용하여 GPU 자원을 활용하기 참 쉽게 만들어 뒀다 어플리케이션 개발자는 알고리즘에 집중하고 어떤 연산을 어떤 디바이스에 Offload 시킬지 여부만 고 민하면 된다
  • 38. 단점 TAPI로 개발 편의성과 코드 호환성을 높였지만 하나의 OpenCL 디바이스만 사용 가능 하지만 향후 멀티 디바이스를 지원한다고 한다