SlideShare a Scribd company logo
1 of 39
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

What's hot

GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...Akihiro Suda
 
QEMU - Binary Translation
QEMU - Binary Translation QEMU - Binary Translation
QEMU - Binary Translation Jiann-Fuh Liaw
 
Python2.x の input 関数に RCE 脆弱性がある話
Python2.x の input 関数にRCE 脆弱性がある話Python2.x の input 関数にRCE 脆弱性がある話
Python2.x の input 関数に RCE 脆弱性がある話xryuseix
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめNVIDIA Japan
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
from Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Worksfrom Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu WorksZhen Wei
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめYoichi Hirata
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍명신 김
 
Using cgroups in docker container
Using cgroups in docker containerUsing cgroups in docker container
Using cgroups in docker containerVinay Jindal
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしようYasuhiro Yoshimura
 
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018Taehoon Kim
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミングseanchas_t
 
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみようRyo Adachi
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)Suhyun Park
 

What's hot (20)

GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
 
QEMU - Binary Translation
QEMU - Binary Translation QEMU - Binary Translation
QEMU - Binary Translation
 
Python2.x の input 関数に RCE 脆弱性がある話
Python2.x の input 関数にRCE 脆弱性がある話Python2.x の input 関数にRCE 脆弱性がある話
Python2.x の input 関数に RCE 脆弱性がある話
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
from Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Worksfrom Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Works
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍
 
Using cgroups in docker container
Using cgroups in docker containerUsing cgroups in docker container
Using cgroups in docker container
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミング
 
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみよう
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
 

Viewers also liked

Svn에서 git으로 이주하기
Svn에서 git으로 이주하기Svn에서 git으로 이주하기
Svn에서 git으로 이주하기Seunghwa Song
 
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인Seunghwa Song
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기zupet
 
병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 CudaSeok-joon Yun
 
VisualStudio vs Eclipse Shortcuts
VisualStudio vs Eclipse ShortcutsVisualStudio vs Eclipse Shortcuts
VisualStudio vs Eclipse ShortcutsTugce Konuklar
 
Trends of SW Platforms for Heterogeneous Multi-core systems and Open Source ...
Trends of SW Platforms for Heterogeneous Multi-core systems and  Open Source ...Trends of SW Platforms for Heterogeneous Multi-core systems and  Open Source ...
Trends of SW Platforms for Heterogeneous Multi-core systems and Open Source ...Seunghwa Song
 
Lie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot MechanicsLie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot MechanicsTerry Taewoong Um
 
Lie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot MechanicsLie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot MechanicsTerry Taewoong Um
 
OpenCV를 활용한 컬러추적 문자 인식기의 구현
OpenCV를 활용한 컬러추적 문자 인식기의 구현OpenCV를 활용한 컬러추적 문자 인식기의 구현
OpenCV를 활용한 컬러추적 문자 인식기의 구현Daegi Kim
 
Life of an Fluentd event
Life of an Fluentd eventLife of an Fluentd event
Life of an Fluentd eventKiyoto Tamura
 
Introduction to Machine Learning and Deep Learning
Introduction to Machine Learning and Deep LearningIntroduction to Machine Learning and Deep Learning
Introduction to Machine Learning and Deep LearningTerry Taewoong Um
 
기계학습(Machine learning) 입문하기
기계학습(Machine learning) 입문하기기계학습(Machine learning) 입문하기
기계학습(Machine learning) 입문하기Terry Taewoong Um
 
05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)noerror
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)khuhacker
 
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)JiandSon
 
Open cv를 활용한 tracking
Open cv를 활용한 trackingOpen cv를 활용한 tracking
Open cv를 활용한 trackingDaesik Jang
 
ISCA 2014 | Heterogeneous System Architecture (HSA): Architecture and Algorit...
ISCA 2014 | Heterogeneous System Architecture (HSA): Architecture and Algorit...ISCA 2014 | Heterogeneous System Architecture (HSA): Architecture and Algorit...
ISCA 2014 | Heterogeneous System Architecture (HSA): Architecture and Algorit...HSA Foundation
 

Viewers also liked (20)

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

Similar to OpenCV 에서 OpenCL 살짝 써보기

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

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

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