如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

要设置 CUDA,我们需要遵循许多步骤,因此请确保不要跳过任何步骤。

第 1 步:如果之前已安装,请先删除

sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" "*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" 
sudo apt-get --purge remove cuda-* nvidia-* gds-tools-* libcublas-* libcufft-* libcufile-* libcurand-* libcusolver-* libcusparse-* libnpp-* libnvidia-* libnvjitlink-* libnvjpeg-* nsight* nvidia-* libnvidia-* libcudnn8*
sudo apt-get purge nvidia*
sudo apt-get autoremove
sudo apt-get autoclean

# remove cuda directories
sudo rm -rf /usr/local/cuda*
# remove from dpkg
sudo dpkg -r cuda
sudo dpkg -r $(dpkg -l | grep '^ii  cudnn' | awk '{print $2}')

按照上述命令,我们删除了所有与 NVidia 和 CUDA 相关的内容。

第 2 步:系统更新/更新 NVIDIA 驱动程序

sudo ubuntu-drivers install

更新或下载驱动程序还有其他方法,但我发现上述命令是更新 Nvidia 驱动程序的最简单方法。因为上述命令会处理驱动程序的版本。

sudo apt-get update
sudo apt-get upgrade

按照上述命令安装 Nvidia 驱动程序。现在运行以下命令检查是否已安装。

nvidia-smi

在上述命令的输出中检查 CUDA 版本。如下所示,我的 CUDA 版本为 12.2。

如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

这意味着我们必须安装 CUDA 12.2 版本。

第 3 步:安装必要的 Ubuntu 软件包(如果尚未安装)

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 libblas-dev liblapack-dev gfortran
sudo apt-get install python3-dev
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev

第 4 步:安装 CUDA 12.2

请访问 https://developer.nvidia.com/cuda-12-2-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local 页面,并按照以下安装说明进行安装。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda-repo-ubuntu2004-12-2-local_12.2.0-535.54.03-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-2-local_12.2.0-535.54.03-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-2-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

对于其他版本的 CUDA,安装步骤将有所不同。转到此页面https://developer.nvidia.com/cuda-toolkit-archive并检查适合您的 CUDA 版本的步骤。

第 5 步:安装 cuDNN

现在,这是安装过程中最烦人的部分,因为有很多版本的 cuDNN,所以我们必须检查 cuDNN 与 CUDA 的兼容性。你可以在谷歌上搜索你的 CUDA 版本,看看 cuDNN 的版本应该是什么。

注意 – 由于我将使用 OpenCV 4.9.0,经过一番尝试后,我发现 cuDNN 8.9.7 可与 CUDA 12.2 和 OpenCV 4.9.0 配合使用(最新版本的 cuDNN(如 9.2)不支持 OpenCV 4.9.0)。

进入 https://developer.nvidia.com/rdp/cudnn-archive 页面并选择

如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

然后根据您的 Linux 架构选择 tar 版本。我选择了 — Linux x86_64(Tar)

如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

第 6 步:安装 tar 文件

使用命令解压 tar 文件

tar -xvf {CUDNN_TAR_FILE}

现在,我们必须将 cuDNN 的 lib 和 include 文件夹中的文件复制到 CUDA lib 和 include 文件夹中。(在某些情况下,lib 文件夹的名称为 lib64,因此请勿混淆)。

检查路径并根据需要修改下面的命令。

sudo cp -av cudnn-linux-x86_64-8.9.7.29_cuda12-archive/include/cudnn*.h /usr/local/cuda-12.2/include
sudo cp -av cudnn-linux-x86_64-8.9.7.29_cuda12-archive/lib64/libcudnn* /usr/local/cuda-12.2/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

第 7 步:设置 CUDA 路径

export CUDA_HOME=/usr/local/cuda-12.2
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH

交叉检查 LD_LIBRARY_PATH 的路径,因为在某些情况下它可能是 – /usr/local/cuda-12.2/targets/x86_64-linux/lib

第 8 步:验证 CUDA 和 cuDNN 的安装

nvidia-smi
nvcc -V

nvcc -V 的输出如下:

如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

第 9 步:设置 Python 环境

sudo pip install virtualenv virtualenvwrapper

使用 nano 或 vi 打开 bashrc 脚本文件。

vi~/.bashrc

或者

nano ~/.bashrc

输入以下导出路径,在底部设置 virtualenvwrapper 的路径并保存文件。(按 ctrl+x 、y 和 Enter 保存文件)

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

运行 source 来确认系统中对 bashrc 脚本的更改。

source ~/.bashrc

在终端中创建虚拟环境。我们将在虚拟环境而非基础环境中安装 OpenCV-DNN-CUDA 模块。

安装 NumPy 软件包。

pip install numpy

输入以下命令激活虚拟环境:

workon opencv_dnn_cuda

第 10 步:设置 opencv 和 opencv_contrib

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

克隆 OpenCV 和 opencv_contrib 后,进入每个文件并输入命令 :

git checkout 4.9.0 (inside open OpenCV and inside opencv_contrib folder)
  • 下载 NVIDIA 的 Video_Codec_SDK_10.0.26,并将 nvcuvid.h、cuviddec.h 和 nvEncodeAPI.h 从 /Interface 复制到 CUDA 的包含目录(在我的情况下是 /usr/local/cuda-12.2/targets/x86_64-linux/include)和 /usr/inlcude。可能没有必要将所有这些文件都放在这两个位置。(此步骤是可选的,仅当您想使用 opencv 读取视频时才需要)
  • 打开文件 — opencv_contrib/modules/cudacodec/src/NvEncoder.cpp ,其中我们需要修改几行代码,否则在使用 cmake 命令时会出现错误。将第 119 行更改为:
pIntializeParams->encodeConfig->encodeCodecConfig.hevcConfig.inputBitDepth = pIntializeParams->encodeConfig->encodeCodecConfig.hevcConfig.outputBitDepth = (m_eBufferFormat == NV_ENC_BUFFER_FORMAT_YUV420_10BIT || m_eBufferFormat == NV_ENC_BUFFER_FORMAT_YUV444_10BIT) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8; 

将第 177 行更改为:

  • if (yuv10BitFormat && pEncoderParams->encodeConfig->encodeCodecConfig.hevcConfig.outputBitDepth != NV_ENC_BIT_DEPTH_10) (此步骤是可选的,仅当您想使用 opencv 读取视频时才需要)
  • 在 git checkout 命令之后导航到opencv文件夹并在其中创建另一个名为build 的文件夹并在其中导航。
  • 在 build 文件夹中运行以下命令或创建一个 shell 脚本并粘贴以下代码并运行它。运行 CMake 命令以配置要从源代码构建的 OpenCV 的设置,并选择您的自定义库和函数。
  • 将以下命令中的 CUDA_ARCH_BIN 参数更改为 GPU 的计算能力,检查命令为 :
nvidia-smi --query-gpu=compute_cap --format=csv
  • 它将返回一个数字,用于填充 CUDA_ARCH_BIN 标志。
如何在 Ubuntu 上设置 OpenCV、CUDA、cuDNN 和 ffmpeg

根据目录结构修改 OPENCV_EXTRA_MODULES_PATH 的路径。

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 BUILD_opencv_cudacodec=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_FAST_MATH=ON \
-D BUILD_ZLIB=ON \
-D BUILD_TIFF=ON \
-D WITH_GTK=ON \
-D WITH_FFMPEG=ON \
-D CUDA_FAST_MATH=ON \
-D NVCUVID_FAST_MATH=ON \
-D WITH_NVCUVID=ON \
-D CUDA_ARCH_BIN=8.0 \
-D WITH_CUBLAS=1 \
-D WITH_GSTREAMER=ON \
-D OPENCV_EXTRA_MODULES_PATH=/full/path/to/opencv_gpu/opencv_contrib/modules/ \
-D HAVE_opencv_python3=ON \
-D PYTHON_EXECUTABLE=~/.virtualenvs/opencv_dnn_cuda/bin/python \
-D BUILD_EXAMPLES=ON ..

在上面的 CMake 命令中,我们在启用 CUDA 和 cuDNN 支持的情况下编译 OpenCV(分别为 WITH_CUDA 和 WITH_CUDNN)。我们还启用了 OPENCV_DNN_CUDA 参数,以构建具有 CUDA 后端支持的 DNN 模块。我们还设置了 ENABLE_FAST_MATH、CUDA_FAST_MATH 和 WITH_CUBLAS 以进行优化。

第 11 步:从源代码构建 OpenCV-DNN 模块,并为特定的 NVidia GPU 提供 CUDA 后端支持

运行 make 命令以使用上述配置的设置构建 OpenCV。(在终端中运行 nproc 以打印处理器数量。在 j64 中将其替换为下面的 64。)

make -j64

这将使用 CUDA 后端从源代码构建 OpenCV-DNN 模块。这个过程可能需要一个小时左右。

接下来,在上述 make 命令中完成 OpenCV 的构建后,在系统中安装 OpenCV。运行以下命令:

sudo make install
sudo ldconfig

接下来,最后一步是在新安装的 OpenCV 库和 python 虚拟环境之间创建符号链接。为此,您需要知道安装 OpenCV 绑定的路径。您可以通过 CMake 命令步骤输出中的安装路径配置来确定该路径。

在我的例子中,安装路径是 /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so。检查”.so “文件的位置。

接下来,导航到虚拟环境 “site-packages “文件夹,最后为上面找到的 cv2 绑定创建一个链接。

cd ~/.virtualenvs/opencv_dnn_cuda/lib/python3.8/site-packages/
ln -s /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so

注意:请务必仔细检查所有内容,因为即使路径不正确,该命令也会自动失败,这意味着您不会收到任何警告或错误信息,而且输出结果也不会生效。因此请注意这一步。

就是这样!我们已成功构建了支持 CUDA 后端的 OpenCV-DNN 模块。

使用下面的 test_DNN_CV.py 脚本检查 OpenCV 是否已正确安装并支持 CUDA 后端。

import numpy as np
import cv2 as cv
import time
npTmp = np.random.random((1024, 1024)).astype(np.float32)
npMat1 = np.stack([npTmp,npTmp],axis=2)
npMat2 = npMat1
cuMat1 = cv.cuda_GpuMat()
cuMat2 = cv.cuda_GpuMat()
cuMat1.upload(npMat1)
cuMat2.upload(npMat2)
start_time = time.time()
cv.cuda.gemm(cuMat1, cuMat2,1,None,0,None,1)
print("CUDA using GPU --- %s seconds ---" % (time.time() - start_time))
start_time = time.time()
cv.gemm(npMat1,npMat2,1,None,0,None,1)
print("CPU --- %s seconds ---" % (time.time() - start_time))

作者:Arpan Jain

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/50389.html

(0)

相关推荐

发表回复

登录后才能评论