OpenCV와 GPU사용

BERT·2023년 5월 3일
2

Computer Vision

목록 보기
52/56

CUDA

Compute Unified Device Architecture
GPU에서 수행하는 병렬 처리 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술

Nvidia가 개발
GPU와 스트림 처리 드라이버가 필요

OpenCV와 CUDA

CUDA Toolkit 설치

https://developer.nvidia.com/cuda-downloads

CUDA Toolkit 11.4.3

wget https://developer.download.nvidia.com/compute/cuda/11.4.3/local_installers/cuda_11.4.3_470.82.01_linux.run

sudo sh cuda_11.4.3_470.82.01_linux.run

Continue

accept

기존 드라이버 사용하므로 Driver 체크 해제

Options > Toolkit Options
CUDA 버전 여러 개 사용 시 기존 심볼릭 링크 삭제 방지

설치 완료
Driver 선택 X, Toolkit은 /usr/local/cuda-11.4에 설치

CUDNN 설치

https://developer.nvidia.com/rdp/cudnn-download
Local Installer for Linux x86_64 (Tar) 다운
압축 해제
tar xf cudnn-linux-x86_64-8.9.0.131_cuda11-archive.tar.xz
CUDA toolkit directory에 파일 복사

cd cudnn-linux-x86_64-8.9.6.50_cuda11-archive
version=11.7
sudo cp include/cudnn*.h "/usr/local/cuda-$version/include" \
&&sudo cp -P lib/libcudnn* "/usr/local/cuda-$version/lib64/" \
&&sudo chmod a+r "/usr/local/cuda-$version/include"/cudnn*.h "/usr/local/cuda-$version/lib64"/libcudnn*

CUDNN 8.9.0 설치 확인

OpenCV 소스 코드 다운로드

메인 모듈
https://github.com/opencv/opencv/releases
추가 모듈
https://github.com/opencv/opencv_contrib/tags

CMake 프로그램 설정

OpenCV 메인 모듈 소스 코드 및 빌드 폴더 설정

dnn
├ CMakeLists.txt
├ examples
│ └ cudahough
│   ├ building.jpg 
│   ├ lenna.bmp
│   └ exec_cudahough.cpp
├ modules
│ ├ CMakeLists.txt
│ └ cudahough
│   ├ CMakeLists.txt
│   ├ main.cpp
│   └ include
│     └ hough.hpp
└ thirdparty
  └ OpenCV
    ├ build 
    ├ install 
    ├ opencv-4.5.5 
    └ opencv_contrib-4.5.5 

opencv build, make, install

cd build

cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=../install \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUFFT=ON \
-D WITH_FFMPEG=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.5/modules/ \
-D OPENCV_ENABLE_NONFREE=ON \
../opencv-4.5.5

make -j
sudo make install

opencv_contrib build, make, install

환경 변수 설정

sudo vim /etc/bash.bashrc

export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/extras/CUPTI/lib64:$LD_LIBRARY_PATH

source /etc/bash.bashrc

결과 확인

nvcc -V

nvidia-smi

cudahough

build

run

cpu

gpu

OpenCL

Open Computing Lanuage
여러 개의 CPU, GPU, DSP 등의 프로세서로 이루어진 이종 플랫폼에서 동작하는 프로그램 코드 작성을 위한 개방형 범용 병렬 컴퓨팅 프레임워크
애플에서 최초 개발 \rarr 크로노스 그룹에서 관리

OpenCV와 OpenCL

OpenCV 3.0 T-API

Transparent-API

Mat frame, gray, blr, edge;

최소한의 소스 코드 변경을 통해 HW 가속 기능 사용 \rarr Mat 대신 UMat 사용

UMat frame, gray, blr, edge;

Mat과 UMat 상호 변환

Mat \rarr UMat

Mat mat = imread("lenna.bmp");

UMat umat1;
mat.copyTo(umat1);

UMat umat2 = mat.getUMat(ACCESS_READ);

UMat \rarr Mat

Mat umat;
videocap >> umat;

Mat mat1;
umat.copyTo(mat1);

UMat mat2 = umat.getMat(ACCESS_READ);

OpenCL T-API 사용 시 주의사항

Border 처리 연산 시 BORDER_REPLICATE 옵션 권장
Mat::getUMat() 또는 UMat::getMat() 함수 사용 시 주의 사항
getUMat() 함수를 통해 UMat 객체를 생성할 경우 새로 생성한 UMat 객체가 완전히 소멸한 후 원본 Mat 객체 사용

2개의 댓글

comment-user-thumbnail
2024년 3월 20일

안녕하세요 의문이 있어서 댓글남깁니다
cd cudnn-linux-x86_64-8.9.6.50_cuda11-archive
version=11.7
sudo cp include/cudnn.h "/usr/local/cuda-$version/include" \
&&sudo cp -P lib/libcudnn
"/usr/local/cuda-version/lib64/" \ &&sudo chmod a+r "/usr/local/cuda-version/include"/cudnn.h "/usr/local/cuda-$version/lib64"/libcudnn

cuda 버전을 11.4로 설치하셨는데
위 명령어 모음에서 version=11.7로 선언하시고
복사할때 위치를 /usr/local/cuda-$version으로 하면 디렉터리 Not found 에러가 발생하지 않나요?

1개의 답글