windows上yolov5 opencv dnn c++部署 cuda加速

您所在的位置:网站首页 cuda报错 windows上yolov5 opencv dnn c++部署 cuda加速

windows上yolov5 opencv dnn c++部署 cuda加速

2024-06-07 21:19| 来源: 网络整理| 查看: 265

目录

前置环境

前言

一,安装cuda,cudnn

二,重新编译opencv+opencv_contrib

1,cmake编译opencv+opencv_contrib

2,VS生成解决方案

三,VS运行opencv dnn加载onnx源码

1,加载大佬的onnx模型

2,加载自己的模型

3,  jetson nano上运行

1)环境配置

2)g++方式编译

3)cmake方式编译

4)jetson nano运行结果

四,总结        

问题记录

①export导出onnx文件报错

②opencv dnn加载cuda失败

③DNN: CUDA backend requires cuDNN. Please resolve dependency or disableOPENCV_DNN_CUDA=OFF

④CONFIGURATION IS NOT SUPPORTED: validate setupvars script in installdirectory

⑤setUpNet DNN module was not built with CUDA backend;

⑥环境配好后加载自己模型失败

⑦AttributeError: 'Upsample' object has no attribute 'recompute_scale_factor'

前置环境

windows安装配置opencv opencv_contrib_野马AS的博客-CSDN博客

前言

        GitHub大佬opencv dnn加载onnx源码:源码地址

        大佬的源码是在Ubuntu上运行的,但是windows上opencv环境配好后也可直接运行。由于第一次装的时候,没有编译cuda,所以只能运行cpu版本,只有5~6fps。且只能运行大佬的onnx模型,自己的yolov5模型用不了。记录一下cuda加速,opencv环境配置,以及opencv dnn调用自己yolov5训练导出生成的onnx。

一,安装cuda,cudnn

        cuda下载官网:CUDA Toolkit Archive | NVIDIA Developer

        cudnn下载官网:cuDNN Archive | NVIDIA Developer

        前排提醒:下载之前注意一下cuda和cudnn版本对应,不对应后面会出找不到cudnn的问题。还要注意一下VS和cuda版本,cuda必须是在vs之后出的版本,否则安装cuda会提示检测不到VS,导致VS最后生成解决方案失败,生成不了opencv的dll和lib文件。不过博主由于VS和cuda不对应,我选择的是能对应的cuda11.6.1,cudnn没有出for cuda11.6,就用的最新的11.5,最后报错下载zlip解决。

        ①选择完版本后,选择网络好的话选择本地下载,网络不好的可以选择网络下载。网络下载优点是包小,缺点是如果安装失败又得重新在安装时下载完整安装包。

         安装时,这一步不用选位置,,最后会消失的,好像是临时文件,不是安装文件。后面的cuda toolkit才是安装文件。(疑神疑鬼了好久,为什么cuda文件夹消失了,还重装了两次)

        

        ②cuda选择精简安装,如果不报VS的错则直接选择下一步到安装完成,开始cudann安装

                        

         ②-1,VS报错的情况不要按照网上的别的教程取消勾选Visual Studio Intergration,然后添加文件到cuda路径。我试过,这样的结果是在最后一步生成解决方案失败,然后全部重新来过。我的解决办法是找最新cuda版本以适应我最新的VS2022版本,最后生成解决方案成功。对于cuda版本有要求的,可降低VS版本。             ·                                                               

                 

        ②-2,选择好合适的版本,点击精简安装直接出现下图,则cuda安装,VS的问题就解决了

                 

        ③安装cuda nn注意对应版本,下载时注意选择zip安装,不要exe安装,cmake编译时找不到cudnn(血坑!!!)

        

        

        ④下载解压后将其中所有文件移到cuda安装目录中,我的路径为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.5,license也移一下。安装完成                                                

        ⑤(zip安装好了的朋友跳过这一步)博主后知后觉,重试了几遍,对安装cuda和cudnn文件夹熟悉之后,发现cudnn的exe方式安装的文件在路径C:\Program Files\NVIDIA\CUDNN\v8.3中,如果用的这种安装方式的朋友要做环境变量中添加该路径,则就能检测到cudnn。zip安装方式不用添加。

                        

        ⑥按照以上步骤,没有报错弄完之后,以博主五六次重试的经验担保,cuda和cudnn已经安装完成。

二,重新编译opencv+opencv_contrib 1,cmake编译opencv+opencv_contrib

        做了前置环境的,应该比较熟悉这一步,没有做过的可以看看,编译时需要加上cuda。

如果第一次编译没有加上cuda,或者版本对应不对会出现如下报错。

        

         已经装过opencv和opencv_contrib的朋友,需要删除之前的build文件夹,重新编译opencv和opnecv_contrib,也可参考前置环境安装。出现下图则cuda和cudnn编译成功(选项框爆红再次configure即可)。

         

2,VS生成解决方案

        前面步骤没有出问题的话,这一步不会有问题,不过比较费时间,之前不加cuda生成需要几十分钟,加上cuda需要三四个小时。

三,VS运行opencv dnn加载onnx源码 1,加载大佬的onnx模型

        源码内容:

#include #include std::vector load_class_list() { std::vector class_list; std::ifstream ifs("config_files/classes.txt"); std::string line; while (getline(ifs, line)) { class_list.push_back(line); } return class_list; } void load_net(cv::dnn::Net &net, bool is_cuda) { auto result = cv::dnn::readNet("config_files/yolov5s.onnx"); if (is_cuda) { std::cout SCORE_THRESHOLD) { confidences.push_back(confidence); class_ids.push_back(class_id.x); float x = data[0]; float y = data[1]; float w = data[2]; float h = data[3]; int left = int((x - 0.5 * w) * x_factor); int top = int((y - 0.5 * h) * y_factor); int width = int(w * x_factor); int height = int(h * y_factor); boxes.push_back(cv::Rect(left, top, width, height)); } } data += 85; } std::vector nms_result; cv::dnn::NMSBoxes(boxes, confidences, SCORE_THRESHOLD, NMS_THRESHOLD, nms_result); for (int i = 0; i < nms_result.size(); i++) { int idx = nms_result[i]; Detection result; result.class_id = class_ids[idx]; result.confidence = confidences[idx]; result.box = boxes[idx]; output.push_back(result); } } int main(int argc, char **argv) { std::vector class_list = load_class_list(); cv::Mat frame; cv::VideoCapture capture("sample.mp4"); if (!capture.isOpened()) { std::cerr 1 && strcmp(argv[1], "cuda") == 0; cv::dnn::Net net; load_net(net, is_cuda); auto start = std::chrono::high_resolution_clock::now(); int frame_count = 0; float fps = -1; int total_frames = 0; while (true) { capture.read(frame); if (frame.empty()) { std::cout = 30) { auto end = std::chrono::high_resolution_clock::now(); fps = frame_count * 1000.0 / std::chrono::duration_cast(end - start).count(); frame_count = 0; start = std::chrono::high_resolution_clock::now(); } if (fps > 0) { std::ostringstream fps_label; fps_label


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3