YOLOX推理系列3-支持NVIDIA-GPU的OpenCV编译


系统环境

系统环境如下,如果没有安装驱动或者CUDA,可以参考本系列文章1和2。
1,Ubuntu 18.04
2,GeForce RTX 3080
3,Driver Version 495.44
4,CUDA 11.5
5,cuDNN 8.3.0


一、配置环境

安装可能需要的包

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

二、下载OpenCV包

有多个获取包的地址和方法,如wget等等,笔者是从OpenCV官方githubOpenCV4.5.4下载的源码包,以及opencv_contrib4.5.4,OpenCV和opencv_contrib的版本必须一致:
在这里插入图片描述
解压,然后把opencv_contrib移动到opencv下:

unzip opencv-4.5.4.zip
unzip opencv_contrib-4.5.4.zip
mv opencv-4.5.4 opencv
mv opencv_contrib-4.5.4 opencv/opencv_contrib

三、编译OpenCV

1,构建CMake

创建一个build文件夹并进入

cd opencv
mkdir build
cd build

构建cmake

cmake \
      -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_PYTHON_EXAMPLES=OFF \
      -D INSTALL_C_EXAMPLES=OFF \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D OPENCV_GENERATE_PKGCONFIG=ON \
      -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
      -D BUILD_EXAMPLES=ON \
      -D WITH_CUDA=ON \
      -D WITH_CUDNN=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D WITH_CUBLAS=ON \
      -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
      -D OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so \
      -D OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ \
      ..

部分参数解释:

OPENCV_EXTRA_MODULES_PATH为opencv_contrib模块modules的位置,很重要
CUDA_TOOLKIT_ROOT_DIR为已安装的CUDA位置,很重要
OpenCL_LIBRARY为共享 OpenCL 库位置
OpenCL_INCLUDE_DIR为带有 OpenCL 头文件的目录
WITH_CUDA=ON,WITH_CUDNN=ON 以启用 CUDA 和 cuDNN 支持
OPENCV_DNN_CUDA=ON为构建具有 CUDA 支持的 DNN 模块。很重要。没有它,将不会生成支持 CUDA 的 DNN 模块。
WITH_CUBLAS 出于优化目的启用标志
OPENCV_GENERATE_PKGCONFIG=ON对笔者来说很重要,会生成opencv4.pc,使用pkg-config --libs --cflags opencv4的g++编译方式。不知道为啥很多介绍OpenCV编译的文章没有这一项,还有些要自己手动生成一个opencv4.pc,然后配置路径什么的。

配置成功后,可以看到以下信息
在这里插入图片描述
继续上翻,可以看到cuda等信息,俩YES表示成功配置了CUDA和cuDNN
在这里插入图片描述
顺便提一下,NVIDIA GPU arch表示支持的显卡算力,GeForce RTX 3080显卡的算力是86,可以从cuda-gpus查到
在这里插入图片描述

2,遇到的问题

另外,笔者在cmake的时候,遇到这样的问题:

runtime library [libtiff.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
  /home/zrodo/anaconda3/lib
runtime library [libfreetype.so.6] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
  /home/zrodo/anaconda3/lib

原因是,笔者先安装了Anaconda3用来配置训练的虚拟环境,然后,Anaconda接管了部分系统环境,使得编译opencv时,找到了俩环境,发生了冲突。在Stack Overflow上找到两种解决办法:

I think there are two ways to solve this issue.

Method 1: Pass the option -D WITH_OPENMP=ON, or, when using cmake-gui, check the choice WITH-OPENMP.
Method 2: Delete Anaconda from your $PATH and LD_LIBRARY_PATH.

然而在笔者这,都没有生效,有兴趣可以试试看。
笔者的解决方法更加简单粗暴,修改anaconda3的名字,让它找不到,就不会发生冲突了,安装完opencv后再修改回来,比如

sudo mv anaconda3 anaconda3_temp

安装完opencv后记得改回来

sudo mv anaconda3_temp anaconda3

3,安装并配置坏境

构建CMake成功后,运行make命令:

make -j12

install命令

sudo make install

最后

sudo ldconfig

4,验证

pkg-config --cflags opencv4
pkg-config --libs opencv4

在这里插入图片描述


四、测试代码

使用YOLOX官方程序YOLOX-ONNXRuntime生成了yolox_s.onnx模型,自己写了测试代码后,发现已有大佬在GitHub上的开源代码和onnx文件yolox-opencv-dnn,感谢大佬,下载此代码和模型后,便于对比测试,笔者在main.cpp中添加两行测试代码:
使用GPU:

	this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
	this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

使用CPU(或者直接注释,默认就是CPU):

	this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
	this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);

代码如下:
在这里插入图片描述

另外,为了对比GPU和CPU的推理速度,再增加推理时间:
在这里插入图片描述

使用g++编译执行:

g++ main.cpp  `pkg-config --libs --cflags opencv4` -o main
./main

最后放一张应用环境的对比图
在这里插入图片描述
由于当前摄像头下什么也没有,只为对比推理时间,笔者就调小置信阈值为0.05,可以看出,同样一个摄像头下,CPU推理一帧需要155ms,GPU只需要3ms。
打完收工~~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV进行GPU加速的方法是通过编译GPU版的OpenCV,并在代码中使用相应的接口来实现。首先,你需要下载cmake、OpenCVOpenCV_contrib和Visual Studio,并使用cmake编译OpenCV。在编译过程中可能会遇到无法下载文件的情况,你可以通过git加速的方式进行下载,并将文件放置到相应的目录中。编译完成后,你可以在Visual Studio中生成代码。\[2\] 在使用GPU加速时,你需要创建一个tensorflow::CallableOptions的实例来指定哪些张量将被传入和传出GPU内存而不是CPU内存。此外,你还需要指定从哪个GPU中输入和获取内存。在这个例子中,为了简单起见,我们将所有的输入和输出张量(Tensor)放在第一个GPU上。\[3\] 因此,你可以使用编译好的GPU版OpenCV和TensorFlow的C++接口来实现OpenCV的GPU加速功能。这样可以更好地与其他库的接口对接,如用于GPU加速的图像预处理的OpenCV和用于硬件加速的视频解码的NVIDIA NVDEC。\[1\] #### 引用[.reference_title] - *1* *3* [让GPU跑的更快](https://blog.csdn.net/qq_29788741/article/details/127199815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [windows10+vs2019+opencv4.5.4实现yolov5的c++推理(gpu加速)](https://blog.csdn.net/playezio/article/details/123652814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值