보람찬 코기의 개발자 블로그
article thumbnail
반응형

 

 

1. 작성 동기

캡스톤 디자인 프로젝트를 진행하며 Python 기반 OpenCV 라이브러리를 사용했으나, CPU로만 작동하다 보니 실행 속도가 너무 느려 GPU를 적용하기로 결정했다.

 

Windows에서 포팅을 시도했으나 실패하여, 우선 Ubuntu에서 먼저 GPU 포팅을 시도한 후, 추후에 Windows에도 적용할 예정이다.

 

필자가 설치한 로컬 환경은 다음과 같다

  • RTX 4060 8GB
  • Python 3.9 
  • CUDA 12.2
  • CUDA_ARCH_PTX=8.9
  • cudnn 8.9.7

2. OpenCV 설치 과정

1. 기존의 설치된 패키지 업그레이드

$ sudo apt-get update
$ sudo apt-get upgrade

 

2. 설치에 필요한 패키지

$ sudo apt-get install -y build-essential cmake pkg-config \
libjpeg-dev libtiff5-dev libpng-dev \
ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev \
libv4l-dev v4l-utils \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libatlas-base-dev gfortran libeigen3-dev \
python3-dev python3-numpy \
unzip

 

3. 소스 다운로드 & 압축 해제

 

$ cd ~/Downloads && mkdir opencv && cd opencv
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.10.0.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip

$ pip install numpy
$ cd opencv-4.10.0
$ mkdir build
$ cd build

 

4. Python 인터프리터에서 경로 확인

$ python3 -m site
sys.path = [
    '/home/kbc/Desktop/opencv-source/opencv-4.10.0/build',
    '/usr/lib/python310.zip',
    '/usr/lib/python3.10',
    '/usr/lib/python3.10/lib-dynload',
    '/home/kbc/.local/lib/python3.10/site-packages',
    '/usr/local/lib/python3.10/dist-packages',
    '/usr/lib/python3/dist-packages',
]
USER_BASE: '/home/kbc/.local' (exists)
USER_SITE: '/home/kbc/.local/lib/python3.10/site-packages' (exists)
ENABLE_USER_SITE: True

 

 

아래부분에 알맞게 python 패키지 경로를 수정한다

 

5. cmake 진행

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_PACKAGE=OFF -D BUILD_EXAMPLES=OFF -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -D WITH_CUDA=ON -D WITH_CUBLAS=ON -D WITH_CUFFT=ON -D WITH_NVCUVID=ON -D WITH_IPP=OFF -D WITH_V4L=ON -D WITH_1394=OFF -D WITH_GTK=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_EIGEN=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D BUILD_JAVA=OFF -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_SKIP_PYTHON_LOADER=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.10.0/modules -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D CUDA_ARCH_BIN=8.9  -D CUDA_ARCH_PTX=8.9 -D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so.8.9.7 -D CUDNN_INCLUDE_DIR=/usr/local/cuda/include  -D PYTHON3_PACKAGES_PATH=/usr/local/lib/python3.10/dist-packages  ..

 

이후 출력되는 결과 사진

 

6. make 진행

$ nproc

# nproc의 출력값을 j 뒤에 대입

$ make -j12
$ sudo make install

 

7. ldconfig 진행

$ sudo /bin/bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig

 

8. Python에서 작동 확인

 

import cv2
import numpy as np
import time

# 테스트할 이미지 생성 (5000x5000의 랜덤 이미지)
image = np.random.randint(0, 256, (5000, 5000, 3), dtype=np.uint8)

# CPU에서 GaussianBlur 적용
start_time = time.time()
blurred_cpu = cv2.GaussianBlur(image, (15, 15), 0)
cpu_time = time.time() - start_time
print(f"CPU에서 GaussianBlur 처리 시간: {cpu_time:.4f}초")

# GPU에서 GaussianBlur 적용
if cv2.cuda.getCudaEnabledDeviceCount() > 0:
    gpu_image = cv2.cuda_GpuMat()
    gpu_image.upload(image)  # 이미지를 GPU 메모리로 업로드
    
    start_time = time.time()
    gpu_blurred = cv2.cuda.createGaussianFilter(cv2.CV_8UC3, cv2.CV_8UC3, (15, 15), 0)
    blurred_gpu = gpu_blurred.apply(gpu_image)
    gpu_time = time.time() - start_time
    print(f"GPU에서 GaussianBlur 처리 시간: {gpu_time:.4f}초")
    
    # GPU에서 처리한 이미지를 다시 CPU로 다운로드
    result_image = blurred_gpu.download()
else:
    print("CUDA를 사용할 수 없습니다.")
반응형

'Language > Python' 카테고리의 다른 글

[Python] 파이썬 기본 내장함수(Built-in Function)  (0) 2023.06.27
profile

보람찬 코기의 개발자 블로그

@BoChan

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!