最近在用opencv中的dnn模块,速度效率感觉不太够于是打算编译一下gpu版本的opencv
现在记录一下以便以后使用。
首先要注意几点ubuntu系统要在18.04以上最好,几点原因:
一.gcc,g++可以对应的上这的一般是版本7,刚刚好不会偏高也不会偏低
二.系统自带的是python3 ,这样可以很方便的下载源码编译
这些问题主要是针对系统不是18.04的
接下来就可以开始了
一.先安装依赖
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install build-essential cmake unzip pkg-config $ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev $ sudo apt-get install libv4l-dev libxvidcore-dev libx264-dev $ sudo apt-get install libgtk-3-dev $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt-get install python3-dev
二.下载opencv4.5.2
$ cd ~ $ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.2.zip $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip $ unzip opencv.zip $ unzip opencv_contrib.zip $ mv opencv-4.5.2 opencv $ mv opencv_contrib-4.5.2 opencv_contrib
三.这些都搞完以后我们要准备一个virtual environment,因为直接更改编译系统python有可能造成系统损坏
$ wget https://bootstrap.pypa.io/get-pip.py $ sudo python3 get-pip.py $ sudo pip install virtualenv virtualenvwrapper $ sudo rm -rf ~/get-pip.py ~/.cache/pip $ vim ~/.bashrc
把虚拟环境写进系统环境中
# virtualenv and virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 source /usr/local/bin/virtualenvwrapper.sh
激活系统环境
$ source ~/.bashrc
然后我们就可以新建virtualenv了
$ mkvirtualenv new_opencv -p python3
virtualenv中安装numpy依赖
$ pip install numpy
以后再要进入这个virtualenv只要运行下面代码
$ workon new_opencv
接下来就可以编译了
编译前我们需要确保一下cuda ,cudnn是否都安转好了
可以用nvcc -V查看cuda版本
然后需要去英伟达官网https://developer.nvidia.com/cuda-gpus看一下我们的显卡对应的Compute Capability
比如我的2080ti对应的是7.5然后先记下来后面要用到
接下来就开始编译了
$ workon opencv_cuda $ cd ~/opencv $ mkdir build $ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_ARCH_BIN=7.5 #注意这里要用我们刚才记下的Compute Capability -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D HAVE_opencv_python3=ON -D PYTHON_EXECUTABLE=~/.virtualenvs/opencv_cuda/bin/python -D BUILD_EXAMPLES=ON ..
这一步后我们要记下python3 的install path
比如我这边是
– Python 3:
– Interpreter: /home/xxxxxx/.virtualenvs/new_opencv/bin/python3 (ver 3.6.9)
– Libraries: /usr/lib/x86_64-linux-gnu/libpython3.6m.so (ver 3.6.9)
– numpy: /home/xxxxxx/.virtualenvs/new_opencv/lib/python3.6/site-packages/numpy/core/include (ver 1.18.1)
– install path: lib/python3.6/site-packages/cv2/python-3.6
记下来
$ make -j8 $ sudo make install $ sudo ldconfig
接下来我们需要用到刚刚记下来的路径去找编译好的opencv文件
$ ls -l /usr/local/lib/python3.6/site-packages/cv2/python-3.6 total 7168 -rw-r--r- 1 root staff 7339240 Jan 17 18:59 cv2.cpython-36m-x86_64-linux-gnu.so
找到这个so文件后我们需要把他和我们当前virtualenv环境链接上
$ cd ~/.virtualenvs/opencv_cuda/lib/python3.6/site-packages/ $ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so
检查:
$ workon opencv_cuda $ python Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '4.2.0' >>>
最后是使用gpu版本dnn模块
net=cv2.dnn.readNetFromTensorflow(模型1地址,模型2地址)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
在下不才如有不对的地方欢迎指教谢谢



