如何在Ubuntu 20.04编译带CUDA支持的OpenCV实现YOLO Python GPU加速
我是OpenCV新手,希望获取在Ubuntu 20.04编译带CUDA支持的最新版本OpenCV的指导,以便在Python中通过GPU而非CPU运行YOLO。
经过大量调研,我未能找到在Ubuntu 20.04编译带CUDA支持的OpenCV,并配置环境使其在Python中可用的清晰、直接步骤。我知道可直接安装Python版OpenCV库,但它未包含我所需的CUDA模块。
我的环境
- 系统:Ubuntu 20.04
nvcc --version输出:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Thu_Mar_28_02:18:24_PDT_2024 Cuda compilation tools, release 12.4, V12.4.131 Build cuda_12.4.r12.4/compiler.34097967_0
nvidia-smi输出:
Tue Apr 30 18:25:09 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 3050 ... Off | 00000000:01:00.0 Off | N/A | | N/A 43C P3 N/A / 35W | 12MiB / 4096MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 2118 G /usr/lib/xorg/Xorg 4MiB | | 0 N/A N/A 3195 G /usr/lib/xorg/Xorg 4MiB | +-----------------------------------------------------------------------------------------+
我查阅了OpenCV官方文档《Installation in Linux》,但它仅覆盖Ubuntu 18.04安装,未提及编译CUDA支持所需参数,也未说明后续如何在Python中使用编译后的版本。官方仓库文档也指向该官方文档。我还找到一篇2020年的教程,但针对Ubuntu 18.04已过时。
现寻求:如何在Ubuntu 20.04编译带CUDA支持的OpenCV并在Python中使用,或哪里可找到详细官方文档?
编译带CUDA支持的OpenCV并配置Python环境(Ubuntu 20.04)
步骤1:卸载已有的OpenCV(可选但推荐)
避免不同版本的OpenCV冲突,先卸载已安装的版本:
# 卸载apt安装的OpenCV sudo apt remove -y libopencv* python3-opencv # 卸载pip安装的OpenCV pip uninstall -y opencv-python opencv-contrib-python
步骤2:安装编译依赖
安装编译OpenCV所需的基础工具和依赖库:
sudo apt update && sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev # 安装Python相关依赖 sudo apt install -y python3-dev python3-numpy # 安装额外媒体处理依赖 sudo apt install -y libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
步骤3:克隆OpenCV及扩展库仓库
OpenCV-contrib包含CUDA加速的额外模块,需与主仓库版本匹配:
mkdir -p ~/opencv_build && cd ~/opencv_build git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git # 切换到最新稳定版本(示例为4.9.0,可按需调整) cd opencv && git checkout 4.9.0 && cd ../opencv_contrib && git checkout 4.9.0
步骤4:配置CMake编译参数
创建编译目录并设置关键编译参数,开启CUDA支持:
cd ~/opencv_build/opencv && mkdir -p 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=8.6 \ # RTX3050属于安培架构,算力为8.6,需匹配自身GPU算力 -D WITH_CUBLAS=1 \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D HAVE_opencv_python3=ON \ -D PYTHON_EXECUTABLE=/usr/bin/python3 \ -D BUILD_EXAMPLES=ON ..
提示:CUDA_ARCH_BIN需对应你的GPU算力,可通过NVIDIA官网查询具体型号的算力值。
步骤5:编译并安装
根据CPU核心数调整-j参数(示例用全部核心编译):
make -j$(nproc) sudo make install sudo ldconfig
步骤6:配置Python环境链接
将编译生成的OpenCV Python库链接到Python的site-packages目录:
- 找到编译后的库文件路径:
find /usr/local/lib -name "cv2*.so"
示例输出:/usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so
- 创建软链接到Python默认库目录(根据自身Python版本调整路径):
# 查看Python的site-packages路径 python3 -c "import sys; print(sys.path)" # 为Ubuntu20.04的Python3.8创建软链接 sudo ln -s /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so
步骤7:验证CUDA支持
打开Python终端,验证OpenCV的CUDA模块是否正常加载:
import cv2 print(cv2.__version__) print(cv2.cuda.getCudaEnabledDeviceCount()) # 输出1表示CUDA可用
若输出1,说明CUDA支持已成功配置,此时运行YOLO即可指定使用GPU加速。
内容的提问来源于stack exchange,提问作者noosh

