openCV 4.2.0 Build with extra Module, CUDA, TBB, IPP, MKL, Eigen, protobuf, openBLAS

 
(장소 : 덕유산, 2020.01.30 photo by 퓨림노)
 
 
Introduction

  이번 포스팅은 openCV 4.2.0 버전을 cmake를 이용하여 build를 하고자 합니다. 이전 포스팅또는 에버노트에 저장된 자료는 추후 참조하기에는 좋으나, 이것저것 설명들이 빠진 부분들이 많이 있어 블로그를 통해 조금 더 나은 포스팅을 하고자 합니다. 처음 시작하는 비전 전공희망자는 포스팅을 통해 조금의 도움이 되었으면 합니다.  (참고 Build r003 은 총 6시간 정도 소요되었습니다.)
 
 
  • 참고바랍니다. (update : 2020.08.05)

 

 
 
 
Contents

  • Environment of build
  • Description of Library
  • Module of openCV
  • openCV extra module
  • CUDA toolkit
  • CUDA cuDNN 
  • IPP(Intel integrated performance primitives)
  • openBLAS(Basic Linear Algebra Subprogram)
  • Eigen
  • Protobuf
  • Build of openCV Library 
 
Environment of build

  이전에 여러번 build를 하였지만, 또다시 빌드를 하고자 합니다. Build는 세번에 걸쳐서 진행하였습니다. 빌드 환경 및 각 버전별 빌드하였던 내용은 아래와 같습니다.  첫번째, openCV 4.2.0 version에 대해 extra module 만 추가하여 하나의 opencv_world420.dll, opencv_world420.lib 파일이 나오도록 하였습니다. 두번째는 각각의 dll, lib 파일이 나오도록 하였습니다. 마지막으로 세번째는 openCV extra Module을 포함하여 TBB, IPP, CUDA, cuDNN, MKL with Lapack, protobuf, Eigen, openBLAS 를 추가하였습니다. 포스팅을 보고 있는 사용자에따라 필요한 Library는 추가/제거하여  진행할 수 있도록 필요한 부분은 참조할 수 있도록 구성하였습니다. 
 
  • Environment ( windows 10 64 bit / visual studio 2019)
    • openCV 4.2.0 + openCV extra module ( export : opencv_world420 )
    • openCV 4.2.0 + openCV extra module ( export : each dll, lib files )
    • openCV 4.2.0 + openCV extra module + TBB + IPP + CUDA10.2 with cuDNN +MKL with lapack + protobuf + eigen + openBLAS
    • build r001
    • build r002
    • build r003

 

 

Description of Library

    빌드(build)를 하면서 openCV extra Module 및 CUDA 외 다른 Library를 힘들게 추가하였습니다. 하지만, 추가된 Library가 어떤 특징을 가지고 있는지, 어떤 장점/단점 그리고 문제점이 무엇인지 모른다면 의미 없는 작업이라 생각됩니다. 그래서 아래의 Description을 추가하였습니다.  원문을 해석해서 작성하기보다, 본 포스팅을 보는 이가 그대로 보고 이해하는게 더 중요하다고 생각되어 각각의 홈페이지를 링크걸어두었습니다. 각 홈페이지를 참조하여 더 많은 내용을 확인 바랍니다.  
  아래의 라이브러리는 openCV 내부에서 사용하는 경우가 많아, build만 하고나면 끝나는 부분도 있지만, protobuf 및 Eigen은 본 포스팅이 끝이나고, 사용방법에 대해 조금 더 찾아보고 포스팅을 할 예정입니다. 
 
  • Description 
    • Threading Building Blocks (TBB) lets you easily write parallel C++ programs that take full advantage of multicore performance, that are portable, composable and have future-proof scalability.(TBB homepage)
    • Intel® Integrated Performance Primitives (Intel® IPP) is an extensive library of ready-to-use, domain-specific functions that are highly optimized for diverse Intel® architectures. Its royalty-free APIs help developers:(IPP Homepage)
    • Intel Math Kernel Library (Intel MKL) is a library of optimized math routines for science, engineering, and financial applications. Core math functions include BLASLAPACKScaLAPACK, sparse solvers, fast Fourier transforms, and vector math.[4] The routines in MKL are hand-optimized specifically for Intel processors.
    • OpenBLAS is an optimized Basic Linear Algebra Subprograms (BLAS) library based on GotoBLAS2 1.13 BSD version. (WiKi)
    • Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.(homepage)
    • CUDA based Deep Learning Frameworks(homepage)
    • TBB(Threading Building Blocks)
    • IPP(Intel integrated performance primitives) 
    • MKL(Intel Math Kernel Library) with Lapack
    • openBLAS(Basic Linear Algebra Subprogram)
    • Eigen
    • protobuf
    • CUDA with cuDNN

 

 

 
Module of openCV

  OpenCV Library 를 빌드를 하고나면, 각각의 dll, lib 파일이 생성됩니다. 각각의 모듈은 기능별로 구성되어있습니다. 이에 대해 확인을 하고 넘어가고자 합니다.  아래의 포스팅 내용대로 build r003 까지 마치게되면 빌드된 라이브러리가 총 61개가 생성됩니다.  저도 하나하나 확인을 다하고 싶지만, 필요한 부분은 (opencv Docs) 를 참조하면서 진행하시기 바랍니다. 
calib3d 
카메라 캘리브레이션과 3차원 재구성
core 
행렬, 벡터 등 OpenCV 핵심 클래스와 연산 함수
dnn 
심층 신경망 기능
features2d 
2차원 특징 추출과 특징 벡터 기술, 매칭 방법
flann 
다차원 공간에서 빠른 최근방 이웃 검색
highgui 
영상의 화면 출력, 마우스 이벤트 처리 등 사용자 인터페이스
imgcodecs 
영상 파일 입출력
imgproc 
필터링, 기하학적 변환, 색 공간 변환 등 영상 처리 기능
ml 
통계적 분류, 회기 등 머신 러닝 알고리즘
objdetect 
얼굴, 보행자 검출 등 객체 검출
photo 
HDR, 잡음 제거 등 사진 처리 기능
stitching 
영상 이어 붙이기
video
옵티컬 플로우, 배경 차분 등 동영상 처리 기술
videoio
동영상 파일 입출력
world
여러 OpenCV 모듈을 포함하는 하나의 통합 모듈
 
 
Visual Studio version - Reference 

  openCV를 과거버전을 여러번 빌드를 하며 인지한 문제점 중 하나는 visual studio version에 대해 관심이 없었던 것입니다.  openCV는 release가 될때마다 visual studio의 version 에 의존적이게 됩니다. 예를 들어 openCV 4.2.0 version을 빌드를 하는데 visual studio 2010을 사용하면 빌드실패하게됩니다. 각각의 모듈이 지원하지 않는 부분이 발생하기 때문에 혼돈되는 버전은 아래와 같이 꼭 참조하여 빌드를 수행하시기 바랍니다. 참고로, vc15(visual studio 2017) 버전에서도 openCV 4.2.x 버전은 빌드가 됩니다. 
 
  • Visual studio version
    • vc16: The compiler packaged with Visual Studio 2019
    • vc15: The compiler packaged with Visual Studio 2017
    • vc14: The compiler packaged with Visual Studio 2015
    • vc12: The compiler packaged with Visual Studio 2013
    • vc11: The compiler packaged with Visual Studio 2012
    • vc10: The compiler packaged with Visual Studio 2010
 
참고 : openCV를 build하기위해서 VS의 version을 확인 후 빌드를 해야 제대로 빌드가 되니 유의 바랍니다. 
 
 
블로그 포스팅을 위해 (Wiki)에서 링크를 가지고 왔으니 참고바랍니다. visual studio 6.0부터 공부시작하여, 가장 오랫동안 사용했던 visual studio 2010 version이 곧 지원 종료되니 슬프네요. 
 
 
openCV extra module

 
  openCV 4.2.0 Document( https://docs.opencv.org/master/)에 접속하면 extra modules에 대해 작성되어있습니다. 시간이 갈수록 더 많아지는 모듈로 인해 공부할 것이 많아지네요..^^ openCV 및 openCV Extra Module를 사용하기위해서는 아래의 github를 참조하여 다운받으시면 됩니다.  폴더 구성은 이후의 포스팅을 참조하시면 됩니다. 
 

 

 

 
CUDA toolkit download

 
  CUDA를 사용하기위해서 아래의 링크를 참조하여 다운 받으시면 됩니다.  CUDA toolkit Windows x86_64_8.1 version 버전을 받으려고 하였으나 10.x 버전과 통합되어졌는지, 동일한 파일명이 다운로드 됩니다. (write & download date : 2020.02.11) 
  다운받은 파일은 실행 후 설치하시면 됩니다. 10.1 버전에서는 이전에 빌드를 할 때, 몇가지 이슈사항들이 있었는데, 전체 설치를 진행하여도 제대로 설치가 성공되었으니 안심하시고 진행하시면 됩니다. 컴퓨터의 환경설정을 위해 꼭 재부팅 후 진행 바랍니다. 
 
 
 
 
CUDA cuDNN Download

 
  cuDNN은 CUDA와 함께 Deep Learning Library를 사용하기위해 위 그림을 참조하여 다운 받으시기 바랍니다. cmake에서 cuDNN을 인식이 되지않아, 포기하고 빌드를 진행할까 하였지만, 여러번(?) 삽질의 시도로 인해 빌드에 성공하였습니다.  먼저, cuDNN(cudnn-10.2-windows10-x64-v7.6.5.32.zip) 다운로드 후, 압축 해제를 하게 되면, 3개의 폴더(bin, include, lib)가 존재 합니다.  3개의 폴더를 CUDA가 설치된 폴더에 (덮어쓰기할 것없으니 그대로) 복사하면 됩니다. 이후 cmake에서 generate를 수행하면 자동으로 인식해야하는데, 해결되지 않는 부분은 아래 내용을 참고하여 진행 하시기 바랍니다. 
 
  • Install 방법
    • cuDNN(cudnn-10.2-windows10-x64-v7.6.5.32.zip) 파일 다운로드,  https://developer.nvidia.com/rdp/cudnn-download
    • 해당 파일을 다운받으면 (bin, include, lib) 3개의 folder가 존재함 
    • 3개의 폴더를 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 복사 
  • Cmake cuDNN 설정
    • generate 수행시, 아래항목 자동 추가됨
    • cmake(3.16.4 version)에서 Advanced 항목 선택
    • CUDNN_Library :  C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/lib/x64/cudnn.lib 파일 선택
    • CUDNN_INCLUDE_DIR : C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include (자동)
    • CUDNN_VERSION : 7.6.5 (자동)
 

 

 

 
TBB(Threading Building Blocks) download

 
 
  TBB(Threading Building Blocks)은 Release Pagehistorical download page 에서 다운로드가 가능합니다. Release page를 통해 다운을 받으시면 됩니다. 
 
 
 
Release page
  • 위의 붉은색 박스를 클릭할 경우, (tbb-2020.1-win.zip ) 파일이 다운됩니다. (2020.02.11)
    폴더는 (D:\openCV\extracted\TBB) 로 이동&이름변경 하였습니다. 
  • 폴더 구성은 아래와 같습니다. (path가 길어져서 빌드에 실패하지 않도록 유의!)
  • openCV
    • cmake (cmake 실행파일)
    • cuDNN (CUDA 설치 폴더로 이동후 삭제)
    • eigen
    • IPP
    • openBLAS0.3.8
    • opencv
    • opencv_contrib
    • protobuf-3.11.3
    • TBB
    • exeFiles 
    • buildr001
    • buildr002
    • buildr003
    • extracted
 
  • openCV Library 빌드를 위한 폴더구성
 
 
 

 

 

 
IPP(Intel integrated performance primitives) download

  IPP또한 설정과정이 좀 복잡하여 빌드를 하지 않고 넘어갈까 고민하였습니다. openCV 내부 알고리즘의 속도를 위해 같이 빌드를 진행하였지만, 포스팅을 보고 따라하는 시점에서 바로 수행불가능할 수 있기때문에 시간을 두고 진행 하시기 바랍니다.  이유는 홈페이지에 가입을 해야만 다운로드가 가능한 링크를 메일로 전송받게 됩니다.  이후 스팸처럼 날아오는 메일들은 필터링을 통해 받은편지함을 건너도록 설정하였습니다. 
 
 
 
 
 
그림에 맞춰 진행하면 intel에서 제공하는 모듈을 다운받으실 수 있습니다. 이제 openCV에 필요한 Math Kernel Library 및 Threading Building Blocks을 다운받고 설치를 진행하시면 됩니다. 설치 후 재부팅은 안해도 됩니다. 
 
 
openBLAS(Basic Linear Algebra Subprogram)

 
 
 
openBLAS는 webpage를 통해 다운 받으시기 바랍니다. 폴더 구성은 위에 설정한 것과 같이 구성하시면 됩니다.  cmake설정과 관련하여 Advanced 항목을 체크하면 아래의 항목이 생성됩니다. openBLAS도 항목이 보이지 않아, 다운받고 설정하지 못한채 진행 중, 몇번의 삽질(?)에 설정이 완료되었습니다. 
 
  • openBLAS_INCLUDE_DIR : D:/openCV/extracted/OpenBLAS0.3.8
 
 
Eigen library 

 
 
 
  Eigen은 홈페이지에서 최근 released 된 파일을 선택하여 다운 받으시면 됩니다. 저는 3.3.7 version을 다운받아 진행하였습니다. 
 

 

 

Protobuf library

 
 
 
Protobuf 라이브러리도 위의 링크를 통해 다운 받아, openCV 빌드환경에 맞춰 폴더구성을 진행해주시면 됩니다.  protobuf는 openCV 내부에서 쓰는지는 확인 못하였지만, Description을 확인하면 네트워크 전송과 관련하여 유용하게 사용되지 않을까 합니다. 포스팅 이후, 시간을 내서 사용방법에 대해 한번 확인할 예정입니다. 
 
 
openCV 4.2.0 build with extra Module, CUDA, TBB, IPP, MKL, Eigen, openBLAS

이제 본격적으로 openCV 4.2.0 버전을 빌드를 해보고자 합니다. 아래의 링크를 통해 openCV 모듈을 다운받으시면 됩니다. 
 
 
 
 
폴더 구성에 맞춰 압축해제를 진행합니다. 
 
 
컴퓨터의 성능에 따라 해제속도가 다르니, 참고바랍니다. exe 파일 외에 github에서도 바로 받으셔도 됩니다. 
 
 
압축 해제 후, 폴더 구성은 아래와 같습니다.  추가된 라이브러리와 빌드(r001, r002, r003)의 폴더는 새로 생성하여 진행하시면 됩니다. 
 
  • openCV 4.x.x : D:\openCV\extracted\opencv\sources
  • openCV extra Module : D:\openCV\extracted\opencv_contrib
  • build path : D:\openCV\buildr001 
 
 
openCV라이브러리르 다운받았으면 이후 cmake를 다운 받기위해 아래 링크로 접속합니다.  2020.02.11기준 3.16.4 version이 최신버전으로 다운받아 진행하였습니다. 다른 포스팅을 보면 cmake version에 따라 진행이 되지 않는 경우도 있다고 합니다. 물론, 저도 openCV 4.x.x 이전 버전을 빌드를 할 경우 문제가 된적이 많이 있었지만, visual studio version과 CUDA toolKit 버전 등의 문제로 인해 정확한 원인을 알지 못한채 진행하였습니다. 문제가 발생하면 구글링을 통해 먼저 해결하는 것이 좋지 않을까 합니다. 
 
 
 
 
빌드를 위해 openCV Path와 build Path를 설정합니다. 이때, cmake를 설정할 때 한가지 주의하셔야 하는 부분이 있습니다. 아래의 예제를 통해 보도록 하겠습니다. 
 
  • 문제점 
    • 탐색기 : D:\openCV\extracted\opencv\sources
    • cmake : D:/openCV/extracted/opencv/sources
 
위의 path를 확인하면 "\" 와 "/" 가 다르게 표기 됩니다. 종종 SW를 개발할 때, path문제로 인해 발생하는 문제와 동일합니다.  cmake에서 Ctrl+C,V 를 통해 path를 입력하였다면, 향후 path 설정을 한번 더 눌러주시면 path가 cmake에 맞춰서 변경 되니 참고 바랍니다. 
 
 
설정이 완료되면, Configure 를 선택하면 아래와 같은 화면이 나타나게 됩니다.
 
  • 진행
    • Visual Studio 16 2019 선택(2017 version 도 진행가능)
    • x64 bit 선택 (x86에서는 빌드가 되지 않습니다.)
    • Use default native compilers 선택
    • Finish 선택
 
 
 
이후 openCV를 빌드하기위해 진행되는 과정을 거쳐 아래와 같은 화면이 나타나게 됩니다. 
 
 
 
빌드설정하기에 앞서, Advanced 항목을 선택합니다. 체크박스를 선택하게되면, 설정에 필요한 여러가지 항목들이 추가가 됩니다. 
 
  • 공통 (for build 1, 2)
    • BUILD_opencv_world (openCV 빌드수행을 위해 r001은 선택, r002는 체크해제)
    • OPENCV_ENABLE_NONFREE
    • OPENCV_EXTRA_MODULES_PATH : D:/openCV/extracted/opencv_contrib/modules (path 속 "/" 방향 달라짐 주의)
    • build_package
    • build_perf_tests
    • build_tests
    • build_with_static_crt
    • check
    • uncheck
 
  현재 제가 진행하고자하는 3가지의 Build Version에 대해, 공통적으로 수행되는 부분을 먼저 설명드리도록 하겠습니다. 공통적으로 사용하는 openCV extra module을 위해 위와 같이 선택/해제를 해주시면 됩니다. 그리고 CUDA가 필요하지 않는 상황에서는 openCV 빌드 후 생성되는 파일의 용량이 크지 않기때문에 opencv_world하나로 구성하여 빌드하는 것도 좋은 방법입니다.  체크해제 하는 부분은 따로 설명은 하지 않지만, build 이후에 불필요하며, 빌드시간이 늘어가기때문에 해제를 하고 진행하시면 됩니다. 
 
주의사항1
  • 아래의 항목들은 모두 체크박스 선택 시 진행되며, 연결되지 않은 라이브러리의 경우, Generate를 통해 생성된 로그를 확인하여 제대로 추가되었는지 확인이 꼭 필요합니다. 
 
  • TBB
    • WITH_TBB (generate이후 아래항목 추가 생성됨)
    • TBB_DIR : (미입력)
    • TBB_ENV_INCLUDE : D:/openCV/extracted/TBB2020/tbb/include
    • TBB_ENV_LIB : D:/openCV/extracted/tbb2020/tbb/lib/intel64/vc14/tbb.lib
    • TBB_ENV_LIB_DEBUG : D:/openCV/extracted/tbb2020/tbb/lib/intel64/vc14/tbb_debug.lib
    • TBB_VER_FILE : D:/openCV/extracted/tbb2020/tbb/include/tbb/tbb_stddef.h
  • Eigen
    •  

      WITH_EIGEN
    • EIGEN_INCLUDE_PATH : D:/openCV/extracted/eigen
  • CUDA
    • WITH_CUDA (WITH_CUBLAS, WITH_CUFFT는 cuDNN설정시 자동선택됨)
    • WITH_FAST_MATH (generate이후 아래항목 추가 생성됨)
    • CUDA_TOOLKIT_ROOT_DIR : C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2 (자동)
  • cuDNN
    • cmake 3.16.4 version 에서 Advanced 를 선택해야 아래의 항목이 보임
    • CUDNN_LIBRARY : C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/lib/x64/cudnn.lib (generate이후 아래항목 추가 생성됨)
    • CUDNN_INCLUDE_DIR : C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include (자동)
    • CUDNN_VERSION : 7.6.5 (자동)
  • protobuf
    • PROTOBUF_UPDATE_FILES (generate이후 아래항목 추가 생성됨)
    • Protobuf_SRC_ROOT_FOLDER : D:/openCV/extracted/protobuf-3.11.3
  • openBLAS
    • openBLAS_INCLUDE_DIR : D:/openCV/extracted/OpenBLAS0.3.8
  • MKL with lapack
    • MKL_WITH_TBB (generate이후 아래항목 추가 생성됨)
    • MKL_INCLUDE_DIRS : C:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2020.0.166/windows/mkl/include
    • MKL_ROOT_DIR : C:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2020.0.166/windows/mkl
    • 이후 generate 수행시, LAPACK library 자동설정
 
 
주의사항2
  • TBB를 같이 빌드하였을 경우, openCV Library를 사용하기위해 tbb.dll, tbb_debug.dll 파일이 필요함
 
 
 
 
openCV build on visual studio 2019 

 
cmake에서 제대로 설정이 완료되면, 로그를 통해 꼭 한번 더 확인 후 프로젝트 빌드를 수행하시기 바랍니다.  build roo3 결과(txt)는 아래와 같습니다. 
 
generate 및 생성된 visual studio solution을 통해 빌드 된 파일은 아래의 경로에 있습니다.  저는 빌드를 위해 총 6H시간 정도 소요되었습니다. 포스팅을 보시고 꼭 빌드에 성공하시길 바랍니다. 
 
  •  

    outout
    • D:\openCV\buildr003\bin\Debug
    • D:\openCV\buildr003\bin\Release
    • D:\openCV\buildr003\lib\Debug
    • D:\openCV\buildr003\lib\Release
    • DLL files
    • Lib files
 
 
Conclusion

  openCV 라이브러리를 빌드를하며, 다른 참고서적 및 다크프로그래머의 블로그를 통해 진행하였습니다. openCV 2.xx 버전부터 cuda를 위해 빌드를 수행하였는데 항상 부족한 포스팅으로 정리를 완료하였습니다. openCV 3.xx 버전도 빌드 후 정리를 완료하였지만 포스팅되지 못했던 부분도 있고, 시간이 지남에 따라 불필요하게 되어 자료들이 쓸모없이 진행된게 아닌가 합니다. 그리고 protobuf는 openCV와 별도로 사용해두면 모바일 및 기타 OS와 통신을 주고 받을 때 편하지 않을까 합니다. 이후 포스팅은 openCV와 관련하여 모바일(android, iOS) 및 python과 관련된 내용으로 계속 포스팅을 수행하려고 합니다.  
 
- 퓨림노 - 
 
 
Reference

 
 
 
 
 

이 글을 공유하기

댓글(8)

  • kmjeon
    2020.04.08 11:42

    잘 정리된 글 잘 보았습니다. OpenCV 빌드에 정말 도움 많이 됬습니다.

    • 2020.04.08 11:43

      비밀댓글입니다

  • ghsong
    2020.05.11 10:50

    안녕하세요. 정리된 글 잘 보았습니다.

    혹시 VS2015에서도 동일한 환경 구축이 가능할지 여쭙고 싶습니다.

    • 2020.05.11 10:51 신고

      가능합니다

    • ghsong
      2020.05.13 17:15

      build 는 성공했는데,
      Opencv dnn module 의 net (cv::dnn::Net) 을 초기화 하는데 아무 오류 없이 동작하질 않네요.. 아무리 찾아봐도 나오질 않는데.. 혹시 이게 vs 버전에 따른 문제가 될 수 있을까요? VS 2019로 올리면 해결이 될지 참 난관이네요 ㅠㅠ

    • 2020.05.13 18:14 신고

      쿠다 툴킷 버전이 호환이 안되서 그럴 수 있어요. 최신 버전 혹은 하위버전이랑도 해보셔야해요
      지금은 제가 집이 아니라 돌려 볼수가 없네요 ㅠ

    • ghsong
      2020.05.14 11:38

      vs2015를 cuda 최신버전 10.2와 cudnn 7.6.5 설치하고 빌드 까지 성공적으로 마쳤는데, 안되더라구요 ㅠ

    • ghsong
      2020.06.23 10:00

      MFC에서 cv::dnn::net을 동작시킬 때 mfc initdialog 부분이 초기화되지 않은 상태에서 cv::dnn::net을 초기화 하려고 하면 오류가 나던 것이었어요. 해결 했습니다 ㅎㅎ 감사합니다!

Designed by JB FACTORY