본문 바로가기

인공지능

OpenCV + GPU 사용 (CUDA, CUDNN) build

반응형

1. 배경

  1. OpenCV가 필요했음
  2. opencv-python은 CPU만을 사용 (완전느림)
  3. 상식선의 퍼포먼스가 나오지 않았고, 내가 작성한 프로그램이 그런 많은 연산을 요구하는것은 아니었으나 버벅거리는게 보기싫었음
  4. 하다보니 한글자료 + 인도형님자료 + 유튜브 등등 했는데 절대안됨
  5. 파워블로거를 꿈꾸며 정리해야겠다고 생각

 학교 과제로 게임 매크로를 만든적이 있었다. 말은 학교 과제였으나 평소 만들어보고 싶은 것이었다. 아이러브커피라는 내가 초등학교때 하던 게임인데 커피 이미지와 원두 이미지를 tensorflow로 학습시켜서 자동으로 클릭하고 판매시키는 매크로였다. 그래서 만들었는데 CPU만 사용하고있고 CPU는 아파하고 있었다. 자애로운 필자는 CPU대신 일잘하는 GPU에게 일을 주고싶었고, 그것이 발단이다.

 

 

2. 방법

아래와 같은 cmd script 실행

필자는 windows기준으로 했으며, 운영체제에 따른 script 문법은 본인의 것에 맞게 알아서 변경한다.

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
set "openCvSource=C:/opencvgpu3.7/opencv-4.7.0"
set "openCVExtraModules=C:/opencvgpu3.7/opencv_contrib-4.7.0/modules"
set "openCvBuild=%openCvSource%/build"
set "buildType=Release"
set "generator=Visual Studio 16 2019"
set "pathToPython=C:/Users/admin/.conda/envs/opencvgpu3.7"
set "pyVer=37"
"C:\Program Files\CMake\bin\cmake.exe" -B"%openCvBuild%/" -H"%openCvSource%/" -G"%generator%" -DCMAKE_BUILD_TYPE=%buildType% -DOPENCV_EXTRA_MODULES_PATH="%openCVExtraModules%/" ^
-DINSTALL_TESTS=ON -DINSTALL_C_EXAMPLES=ON -DBUILD_EXAMPLES=ON ^
-DBUILD_opencv_world=ON ^
-DWITH_CUDA=ON -DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8" -DCUDA_FAST_MATH=ON -DWITH_CUBLAS=ON -DCUDA_ARCH_BIN=8.6 -DWITH_NVCUVID=ON ^
-DWITH_CUDNN=ON -DCUDNN_INCLUDE_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/include" -DCUDNN_LIBRARY="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/lib/cudnn.lib" -DCUDNN_VERSION="8.5.0" ^
-DENABLE_FAST_MATH=ON -DOPENCV_DNN_CUDA=ON -DWITH_CUFFT=ON ^
-DWITH_OPENGL=ON ^
-DWITH_MFX=ON ^
-A x64 ^
-DBUILD_SHARED_LIBS=ON ^
-DBUILD_opencv_python3=ON -DPYTHON3_INCLUDE_DIR=%pathToPython%/include -DPYTHON3_LIBRARY=%pathToPython%/libs/python%pyVer%.lib -DPYTHON3_EXECUTABLE=%pathToPython%/python.exe -DPYTHON3_NUMPY_INCLUDE_DIRS=%pathToPython%/lib/site-packages/numpy/core/include -DPYTHON3_PACKAGES_PATH=%pathToPython%/Lib/site-packages -DOPENCV_SKIP_PYTHON_LOADER=ON

 

  1. 1번 줄, visual studio 본인의 설치경로 및 버전에 맞게 수정
  2. 2번 줄, opencv source 본인의 설치경로 및 버전에 맞게 수정
  3. 3번 줄, opencv contrib source 본인의 설치경로 및 버전에 맞게 수정
  4. 6번 줄, 본인의 visual studio 버전에 맞게 generator 수정
  5. 7번 줄, 본인의 목표시스템 python 버전에 맞게 python경로 수정
  6. 8번 줄, 본인의 목표시스템 python 버전에 맞게 pyVer 수정
  7. 9번 줄, 본인의 cmake 설치경로에 맞게 수정
  8. 13번 줄, 본인의 CUDA 설치경로에 맞게 CUDA_TOOLKIT_ROOT_DIR 수정
  9. 13번 줄, 본인의 GPU에 맞게 ARCH_BIN 수정
  10. 14번 줄, 본인의 CUDNN 설치 경로에 맞게 CUDNN_INCLUDE_DIR 및 CUDNN_LIBRARY 수정
  11. 14번 줄, 본인의 환경에 맞게 CUDNN_VERSION 수정
  12. 18번 줄, 본인의 환경에 맞게 architecture "-A" 수정

스크립트 실행

 

opencv/build 경로에 OpenCV.sln실행 수 project 구성을 Debug에서 Release로 변경

우측 패널에 CMakeTargets를 펼쳐 ALL_BUILD실행 후 INSTALL 실행

 

에러없이 성공적으로 종료되면 opencv\build\install 경로를 OPENCV_DIR이라는 시스템변수에 등록 (사용자여도 됨)

이후 path에 아래와 같이 추가

%OPENCV_DIR%\x64\vc16\bin

 

 

확인

 

잘 된다.

 

아래는 지금까지의 나의 여정이다.

 

3. 나의 시도

1차시도 (2023년 7월)

https://prlabhotelshoe.tistory.com/24
https://prlabhotelshoe.tistory.com/26

n차시도라는것은 실패했다는 뜻이다.

이상하게 내가 conda env만들고 cmake를 env중 하나로 하면 꼭 lib 폴더가 main파이썬으로 잡혔다.

anaconda에 설치되어있는 python version은 9였는데 나는 다른 라이브러리들 및 내가 사용하는 환경과의 호환성을 위해 3.7로 했는데, lib폴더 하나가 진짜 이악물고 3.9로 잡혀서 실패했다.

 

2차시도

https://kejdev.github.io/etc/2022/10/03/python-opencv-cuda-build.html

실패했다.

이것도...

3차시도

찾을 수 없는 인도형님 및 백인 형님의 자료

이것도 cmake사용 동일한 이슈

 

4차시도

https://ellun.tistory.com/333

이 예제는 cmake를 사용하지만 cmake cli를 사용한다.

이 성공사례에서는 lib폴더가 내가 의도한 python으로 변경되었음을 확인했다.

분명 내가 모르는 cmake의 설정이 있거나 잘못한 부분이 있는 것인지는 몰라도 유일하게 이친구는 project를 configure하는데까지는 잘 되었으나...

but 실패

ninja를 이용하여 build했는데, 걃귧 어쩌고저쩌고 하면서 build가 실패했다.

 

5차시도

1, 2, 3차에서는 cmake gui를 통해 visual studio project를 configure하고 visual studio에서 build 및 install을 했다.

4차에서는 cmake cli를 통해 ninja를 이용하여 build 및 install을 했다.

 

1, 2, 3차에서는 cmake gui를 이용했기 때문에 python lib 폴더가 의도한 conda env를 포인팅하고있지 않아 에러가 발생하여 나는 4차에서 이용했던 cmake cli를 통해 visual studio project를 configure할 수 없을지 생각했다.

 

gui에서 되면 cli에서 되는것이고 cli에서 지원하는 기능은 gui에서도 되어야 한다는것이 나의 생각이고, 완전하지는 않지만 대부분의 경우에서 그랬다는 경험에 의해 가능하지 않을까 생각했다.

 

구글을 검색.

cmake cli에서 visual studio project를 configure하는 방법을 찾았다.

4차시도에서 참고한 블로그의 cli 명령어 인수를 수정하여 visual studio project로 configure한 후 OpenCV.sln 실행

성공적으로 기동 되었습니다.

 

구성을 Release로 변경하고 설레는 마음으로 ALL_BUILD를 실행

but 실패 하...... 내팔자야

 

에러로그를 확인하여보니 문법오류가 나고 있었고

문제가 있다는 source code를 확인하여 보니 test_qrcode_encode.cpp라는 파일의 326번째 line에서 구문 분석 오류가 나고있었다.

 

해당 부분을 확인.

 

문법상 아무 문제가 없어보였지만 머릿속에 4차시도에서 걃귧 어쩌고 하면서 build가 실패했던것과 visual studio에서 ALL_BUILD했을 때 console에 출력되던 "현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오." warning이 머릿속에 갑자기 스쳐지나가면서 저 일본어를 지워보니 잘 되었다.

 

하....... 저 일본인 한명때문에 얼마나 나같은 사람들이 많았을까 그동안 내가 실패해왔던 시도들이 머릿속에 주마등처럼 스쳐지나간다. 일본에는 메이와쿠라는 문화가 있다는데,,

 

하이튼 이렇게 첫 성공을 거두었고 4.7버전을 확인해보니 어떤사람이 아래와 같이 영어로 바꿔놓은 것을 볼 수 있었다. 이제는 나같은사람이 안나오겠지

 

 

힘들었다.

끝.

반응형