opencv的cuda加速,速度进来学!

        总所周知显卡的加速是很强的,最近在利用onnx进行网络模型的Visual Studio的部署过程中发现速度非常慢,查找了一系列的资料发现原来使用的是CPU在跑。这里有一个误区,之前以为装了opencv,装了cuda再使用以下代码就能进行opencv的cuda加速进行模型的推理。

void load_net(cv::dnn::Net& net, bool is_cuda,string net_path)
{
	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//不再输出OpenCV的日志
	//利用readNst读取onnx文件里面的网络模型
	//string a = "D:/onnxtest/0/yolov5l.onnx";
	auto result = cv::dnn::readNet(net_path);
	if (is_cuda)	//判断是否使用GPU加速
	{
		std::cout << "Attempty to use CUDA\n";
		result.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);		//此行代码将深度学习模块的后端设置为 CUDA
		result.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA_FP16);	//此行代码将深度学习模块的目标设置为 CUDA 的 FP16 模式:快但需要损失一些精度
	}
	else
	{
		std::cout << "Running on CPU\n";
		result.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
		result.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
	}
	net = result;
}

        可以看到推理时间非常慢,并且任务管理器看到CPU的利用率非常高。

        后面发现opencv要使用cuda加速的话是需要进行重新编译的,这里我就不贴教程了,大佬的教程非常详细,直接参考这个:win10 编译opencv4.5.5 (gpu版)_cuda_arch_bin-CSDN博客。(为了让你们不点链接我把上面这个链接取消了,有两个注意事项需要先看再点,帮你节约半小时以上的时间!!!看完注意事项我会再贴)

        其中有几个非常重要的细节:建议先阅读完以下两点细节再按照上面的链接进行编译。

        ①opencv的cuda编译需要使用的.ache文件的下载我贴一下网盘的链接:

链接:https://pan.baidu.com/s/1T3WeEfhippgPrxXWnMlfAw 提取码:2233
        顺便也贴一下另外两个要下载的文件的链接:
cmake下载的网盘链接
opencv_contrib-4.5.5的下载链接-->注意我这个贴的是opencv4.5.5版本的,其他版本的自己找一下哈

        ②显卡算力的查询:这一步要很小心,算力设置错误的话就会报错(说没有可用的GPU设备)。

        显卡与算力的对应配置可以在这个网址里面找到:NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)-CSDN博客

        OK,可以正式点这个链接开始学习opencv的编译了:win10 编译opencv4.5.5 (gpu版)_cuda_arch_bin-CSDN博客

-------------------------------------编译前要看的注意事项的分割线-------------------------------------------

        在编译好opencv的cuda版本之后使用发现还是不能进行opencv的cuda加速??
        是的,你还有一些事情要做:

        ①首先需要配置系统的环境变量:

        这里也有一个要注意的地方,此处设置的环境变量要在之前设置的opencv环境之前!!!不然会默认使用原先的环境路径。(当然删除之前的opencv环境变量应该是更好的选择);

        ②设置C++项目的环境变量:(能看到这篇博文的你配置C++的opencv环境应该不是难事)

        理论上来说实现这一步之后就可以使用opencv的cuda加速了,但是理论总是理想的,当你实在没有办法的时候,整点简单粗暴的东西就显得十分有效了。
        ③既然还是不能使用cuda加速,那是为什么呢?其实就是没有找到opencv_world455d.dll这个文件,所以,直接将opencv编译后的这个dll文件放到C++项目工程下的exe可执行文件的同意目录下就可以了!!

        ④然后在项目中打印一下:

std::cout<<cv::cuda::getCudaEnabledDeviceCount()<<std::endl;

如果打印的输出是1就是可以用GPU加速opencv了,输出是0的话说明还没成功。

----------总结一下最近的情况----------------

        最近这一周都在实现这个部署的动作,遇到了无数的问题,onnx模型不能读取,不能使用GPU加速opencv,tensorRT的部署过程中出现了内存泄漏等等无数的问题,对于非科班的我来说每一个问题都是天大的问题,一步一步脚踏实地做事是我喜欢的方式,所以很辛苦也不觉得难过。在遇到问题的时候网上的前辈们会给出很多有帮助的答案(这也是为什么近期写了很多博客的原因,质量不高大家多多包涵),在有些找不到答案的时候也可以自己慢慢摸索。很喜欢《送东阳马生序》中的那句:以中有足乐者,不知口体之奉不若人也。

        PS:如果能够帮到你的话,给我一个关注或者点赞,让我知道我帮到你了,这也是我继续创作的动力。

        

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值