总所周知显卡的加速是很强的,最近在利用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:如果能够帮到你的话,给我一个关注或者点赞,让我知道我帮到你了,这也是我继续创作的动力。