基于 OpenVINO, yolov5 推理

news2024/11/16 9:26:31

在这里插入图片描述

OpenVINO 是英特尔开发的一款功能强大的深度学习工具包,可实现跨多个硬件平台的优化神经网络推理。在本文中,我们讨论了 OpenVINO 的特性和优势,以及它如何与领先的计算机视觉平台 Viso Suite 集成,以构建和交付可扩展的应用程序。

​🇶🇦 什么是 OpenVINO?

OpenVINO 是英特尔开发的跨平台深度学习工具包。该名称代表“开放式视觉推理和神经网络优化”。OpenVINO 专注于通过面向英特尔硬件平台的一次写入、随处部署的方法优化神经网络推理。

该工具包在 Apache License 2.0 版下免费使用,有两个版本:

● OpenVINO 工具包,由开源社区支持
● Intel Distribution of OpenVINO toolkit,由 Intel 支持。

使用 OpenVINO 工具包,软件开发人员可以通过与应用逻辑集成的高级 C++ 推理引擎 API选择模型并部署预训练的深度学习模型(YOLO v3、ResNet 50等)。

因此,OpenVINO 提供集成功能来加快应用程序和解决方案的开发,这些应用程序和解决方案使用计算机视觉、自动语音识别、自然语言处理(NLP)、推荐系统、机器学习等解决多项任务。


🚢 安装 OpenVINO

  1. 安装地址: https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html?VERSION=v_2022_3_1&ENVIRONMENT=RUNTIME&OP_SYSTEM=WINDOWS&DISTRIBUTION=ARCHIVE
  2. 这里我下载的是 2022.3.1 Runtime OpenVINO Archives 版本.
  3. 然后拷贝到 C:\Program Files (x86)\Intel 下。
  4. 使用 python 安装 openvino-env (别的根据需求来安装),详细安装步骤可参考: https://docs.openvino.ai/2023.2/openvino_docs_install_guides_installing_openvino_from_archive_windows.html
    pip install -r tools\requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install -r tools\requirements_onnx.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  5. 使用 mo -h 来验证是否安装正确。

🚀 Export Model

  • pt convert to onnx
    python export.py --weights ./weights/yolov5s.pt --img 640 --batch 1 --include onnx
    
  • onnx convert to openvino
    # 这里我将归一化参数写入模型中了, 这样前处理可以不用做归一化处理了
    # data_type 32: FP32 16: FP16
    mo --input_model ./weights/yolov5s.onnx --output_dir ./weights --data_type FP16 --mean_values [0,0,0] --scale_values [255,255,255]
    
  • pt convert to openvino
    python export.py --weights ./weights/yolov5s.pt --img 640 --batch 1 --include openvino
    

🍋​ Yolov5

  • 获取当前支持的所有的AI硬件推理设备, 如果输出没有设备,则可尝试更新显卡驱动. https://www.intel.com/content/www/us/en/support/products/80939/graphics.html

    #include <openvino/openvino.hpp>
    #include <iostream>
    #include <vector>
    int main() {
        ov::Core ie;
        //获取当前支持的所有的AI硬件推理设备
        std::vector<std::string> devices = ie.get_available_devices();
        for (int i = 0; i < devices.size(); i++) {
            std::cout << devices[i] << std::endl;
        }
        system("pause");
        return 0;
    }
    
    // ----------------------- output -----------------------
    CPU
    GNA
    GPU
    
  • 推理

    1. 代码来自这位博主, 详细过程可参考博主博客 https://blog.csdn.net/weixin_45650500/article/details/134455535
    2. 如果感觉初始化时间等待过长,可尝试添加缓存,则第一次加载过后,再次初始化会很快. core.set_property(ov::cache_dir("cache"));
    #include <opencv2/dnn.hpp>
    #include <openvino/openvino.hpp>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    
    const float SCORE_THRESHOLD = 0.2;
    const float NMS_THRESHOLD = 0.4;
    const float CONFIDENCE_THRESHOLD = 0.4
    
    struct Detection
    {
        int class_id;
        float confidence;
        cv::Rect box;
    };
    struct Resize
    {
        cv::Mat resized_image;
        int dw;
        int dh;
    };
    Resize resize_and_pad(cv::Mat& img, cv::Size new_shape) {
        float width = img.cols;
        float height = img.rows;
        float r = float(new_shape.width / max(width, height));
        int new_unpadW = int(round(width * r));
        int new_unpadH = int(round(height * r));
        Resize resize;
        cv::resize(img, resize.resized_image, cv::Size(new_unpadW, new_unpadH), 0, 0, cv::INTER_AREA);
    
        resize.dw = new_shape.width - new_unpadW;
        resize.dh = new_shape.height - new_unpadH;
        cv::Scalar color = cv::Scalar(100, 100, 100);
        cv::copyMakeBorder(resize.resized_image, resize.resized_image, 0, resize.dh, 0, resize.dw, cv::BORDER_CONSTANT, color);
    
        return resize;
    }
    
    int main() {
    
        // Step 1. Initialize OpenVINO Runtime core
        ov::Core core;
        core.set_property(ov::cache_dir("cache"));
        // Step 2. Read a model
        std::shared_ptr<ov::Model> model = core.read_model("model/yolov5s.xml", "model/yolov5s.bin");
        //此处需要自行修改xml和bin的路径
    
        // Step 3. Read input image
        // 图像路径  
        cv::Mat img = cv::imread("images/bus.jpg");
        // resize image
        Resize res = resize_and_pad(img, cv::Size(640, 640));
    
        // Step 4. Inizialize Preprocessing for the model
        ov::preprocess::PrePostProcessor ppp = ov::preprocess::PrePostProcessor(model);
        // Specify input image format
        ppp.input().tensor().set_element_type(ov::element::u8).set_layout("NHWC").set_color_format(ov::preprocess::ColorFormat::BGR);
        // Specify preprocess pipeline to input image without resizing
        //ppp.input().preprocess().convert_element_type(ov::element::f32).convert_color(ov::preprocess::ColorFormat::RGB).scale({ 255., 255., 255. });
        ppp.input().preprocess().convert_element_type(ov::element::f32).convert_color(ov::preprocess::ColorFormat::RGB);
        //  Specify model's input layout
        ppp.input().model().set_layout("NCHW");
        // Specify output results format
        ppp.output().tensor().set_element_type(ov::element::f32);
        // Embed above steps in the graph
        model = ppp.build();
        ov::CompiledModel compiled_model = core.compile_model(model, "GPU");
    
        // Step 5. Create tensor from image
        float* input_data = (float*)res.resized_image.data;
        ov::Tensor input_tensor = ov::Tensor(compiled_model.input().get_element_type(), compiled_model.input().get_shape(), input_data);
    
        // Step 6. Create an infer request for model inference 
        ov::InferRequest infer_request = compiled_model.create_infer_request();
        infer_request.set_input_tensor(input_tensor);
        //增加计时器统计推理时间
        double start = clock();
        infer_request.infer();
        double end = clock();
        double last = start - end;
        cout << "Detect Time" << last << "ms" << endl;
        
        //Step 7. Retrieve inference results 
        const ov::Tensor& output_tensor = infer_request.get_output_tensor();
        ov::Shape output_shape = output_tensor.get_shape();
        float* detections = output_tensor.data<float>();
    
        // Step 8. Postprocessing including NMS  
        std::vector<cv::Rect> boxes;
        vector<int> class_ids;
        vector<float> confidences;
    
        for (int i = 0; i < output_shape[1]; i++) {
            float* detection = &detections[i * output_shape[2]];
    
            float confidence = detection[4];
            if (confidence >= CONFIDENCE_THRESHOLD) {
                float* classes_scores = &detection[5];
                cv::Mat scores(1, output_shape[2] - 5, CV_32FC1, classes_scores);
                cv::Point class_id;
                double max_class_score;
                cv::minMaxLoc(scores, 0, &max_class_score, 0, &class_id);
    
                if (max_class_score > SCORE_THRESHOLD) {
                    confidences.push_back(confidence);
                    class_ids.push_back(class_id.x);
                    float x = detection[0];
                    float y = detection[1];
                    float w = detection[2];
                    float h = detection[3];
                    float xmin = x - (w / 2);
                    float ymin = y - (h / 2);
                    boxes.push_back(cv::Rect(xmin, ymin, w, h));
                }
            }
        }
        std::vector<int> nms_result;
        cv::dnn::NMSBoxes(boxes, confidences, SCORE_THRESHOLD, NMS_THRESHOLD, nms_result);
        std::vector<Detection> output;
        for (int i = 0; i < nms_result.size(); i++)
        {
            Detection result;
            int idx = nms_result[i];
            result.class_id = class_ids[idx];
            result.confidence = confidences[idx];
            result.box = boxes[idx];
            output.push_back(result);
        }
    
        // Step 9. Print results and save Figure with detections
        for (int i = 0; i < output.size(); i++)
        {
            auto detection = output[i];
            auto box = detection.box;
            auto classId = detection.class_id;
            auto confidence = detection.confidence;
            float rx = (float)img.cols / (float)(res.resized_image.cols - res.dw);
            float ry = (float)img.rows / (float)(res.resized_image.rows - res.dh);
            box.x = rx * box.x;
            box.y = ry * box.y;
            box.width = rx * box.width;
            box.height = ry * box.height;
            cout << "Bbox" << i + 1 << ": Class: " << classId << " "
                << "Confidence: " << confidence << " Scaled coords: [ "
                << "cx: " << (float)(box.x + (box.width / 2)) / img.cols << ", "
                << "cy: " << (float)(box.y + (box.height / 2)) / img.rows << ", "
                << "w: " << (float)box.width / img.cols << ", "
                << "h: " << (float)box.height / img.rows << " ]" << endl;
            float xmax = box.x + box.width;
            float ymax = box.y + box.height;
            cv::rectangle(img, cv::Point(box.x, box.y), cv::Point(xmax, ymax), cv::Scalar(0, 255, 0), 3);
            cv::rectangle(img, cv::Point(box.x, box.y - 20), cv::Point(xmax, box.y), cv::Scalar(0, 255, 0), cv::FILLED);
            cv::putText(img, std::to_string(classId), cv::Point(box.x, box.y - 5), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));
        }
        //显示具体结果
        cv::namedWindow("ImageWindow", cv::WINDOW_NORMAL);
        cv::resizeWindow("ImageWindow", 800, 600);
        cv::imshow("ImageWindow", img);
    
        cv::waitKey(0);
        cv::destroyAllWindows();
        return 0;
    }
    
  • 输出结果
    在这里插入图片描述


参考

  • https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html?VERSION=v_2023_2_0&OP_SYSTEM=WINDOWS&DISTRIBUTION=ARCHIVE
  • https://docs.openvino.ai/2023.2/openvino_docs_install_guides_installing_openvino_from_archive_windows.html
  • https://blog.csdn.net/weixin_45650500/article/details/134455535

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux配置主机名-使用主机名访问服务器

主要需要对Hosts文件进行操作&#xff0c; Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c; 先将自己的主机名设置成有意义&#xff0c;别人好记的样子&a…

Win10升级Win11后卡顿了?

目录 关闭动画效果 任务栏居中改为居左 调整外观和性能 其他 当你看到最后&#xff0c;还知道哪些升级WIN11后必做的优化呢&#xff1f;欢迎在评论区分享出来&#xff01;❤️ win11上市目前也有一段时间了&#xff0c;想必很多大家都已经进行更新了。新的系统确实更加简洁…

线性表--链表--单链表(不带头单向不循环链表)

关于顺序表存在的问题&#xff1a; 1.中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) 2.增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3.增容⼀般是呈2倍的增长&#xff0c;势必会有一定的空间浪费 要如何解决这些问题&#xff1f;用线性…

HCIA vlan练习

目录 实验拓扑 实验要求 实验步骤 1、交换机创建vlan 2、交换机上的各个接口划分到对应vlan中 3、trunk干道 4、路由器单臂路由 5、路由器DHCP设置 实验测试 华为交换机更换端口连接模式报错处理 实验拓扑 实验要求 根据图划分vlan&#xff0c;并通过DHCP给主机下发…

Android学习之路(22) ARouter原理解析

1.ARouter认知 首先我们从命名来看:ARouter翻译过来就是一个路由器。 官方定义&#xff1a; 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 那么什么是路由呢&#xff1f; 简单理解就是&#xff1a;一个公共平台转发系统 工作方式&…

vue项目中使用XgPlay.js播放视频

官网&#xff1a;西瓜播放器 1、首先安装下载 XgPlay.js依赖 npm i xgplayer --savenpm i xgplayer-hls.js --save2、页面引用 import FlvPlayer from "xgplayer-flv.js"; import "xgplayer/dist/index.min.css"; 3、建立dom容器 // 提供一个容器 <…

【Linux驱动】休眠与唤醒 | POLL机制 | 异步通知 | 阻塞与非阻塞 | 软件定时器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3d3;休眠与唤醒&#x1f3f8;内核函数&#x1f3f8;驱动框架及编程 &#x1f3d3;…

VC++中使用OpenCV进行形状和轮廓检测

VC中使用OpenCV进行形状和轮廓检测 在VC中使用OpenCV进行形状和轮廓检测&#xff0c;轮廓是形状分析以及物体检测和识别的有用工具。如下面的图像中Shapes.png中有三角形、矩形、正方形、圆形等&#xff0c;我们如何去区分不同的形状&#xff0c;并且根据轮廓进行检测呢&#…

re:从0开始的HTML学习之路 2. HTML的标准结构说明

1. <DOCTYPE html> 文档声明&#xff0c;用于告诉浏览器&#xff0c;当前HTML文档采用的是什么版本。 必须写在当前HTML文档的首行&#xff08;可执行代码的首行&#xff09; HTML4的此标签与HTML5不同。 2. <html lang“en”> 根标签&#xff0c;整个HTML文档中…

基于SpringBoot的SSM整合案例

项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言&#xff1a;在学习C语言的时候&#xff0c;我们见过很多的文件的接口&#xff0c;例如fopen&#xff0c;fwrite&#xff0c;fclose等等&#xff0c;但…

Mac NTFS 磁盘读写工具选哪个好?Tuxera 还是 Paragon?

在使用 Mac 电脑时&#xff0c;我们经常需要读写 NTFS 格式的硬盘或 U 盘。然而&#xff0c;由于 Mac 系统不支持 NTFS 格式的读写&#xff0c;因此我们需要借助第三方工具来实现这个功能。而在市场上&#xff0c;Tuxera 和 Paragon 是两款备受推崇的 Mac NTFS 磁盘读写工具。那…

CPMS靶场练习

关键&#xff1a;找到文件上传点&#xff0c;分析对方验证的手段 首先查看前端发现没有任何上传的位置&#xff0c;找到网站的后台&#xff0c;通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传&#xff1b;有两个图片上传点 图片验证很严格…

HCIP-BGP选路实验

一.实验拓扑图 二.详细配置 R1 interface GigabitEthernet0/0/0 ip address 12.1.1.1 255.255.255.0interface LoopBack0 ip address 1.1.1.1 255.255.255.0interface LoopBack1 ip address 10.1.1.1 255.255.255.0bgp 1 router-id 1.1.1.1 peer 12.1.1.2 as-number 2ipv4-fa…

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…

CVE重要通用漏洞复现java phpCVE-2021-44228

在进行漏洞复现之前我们需要在linux虚拟机上进行docker的安装 我不喜欢win上安因为不知道为什么总是和我的vmware冲突 然后我的kali内核版本太低 我需要重新安装一个新的linux 并且配置网络 我相信这会话费我不少时间 查看版本 uname -a 需要5.5或以上的版本 看错了浪…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

使用多进程库计算科学数据时出现内存错误

问题背景 我经常使用爬虫来做数据抓取&#xff0c;多线程爬虫方案是必不可少的&#xff0c;正如我在使用 Python 进行科学计算时&#xff0c;需要处理大量存储在 CSV 文件中的数据。由于每个处理过程需要很长时间才能完成&#xff0c;而您拥有多核处理器&#xff0c;所以您尝试…

SpringBoot教务管理源码

技术框架&#xff1a; springboot mybatis layui shiro jquery react 运行环境&#xff1a; jdk8 mysql5.7 IntelliJ IDEA maven nginx 系统介绍&#xff1a; 教务管理系统是一个基于网络的在线管理平台 , 帮助学校管理教务系统&#xff0c; 用一个账号解决学校教…

聪明的小羊肖恩(双指针)

题目 import java.util.Arrays; import java.util.Scanner;public class Main {public static long calc(long[] num,int max) { int l 0;int r num.length-1;long res 0;while(l<r) {while(l<r && num[l]num[r]>max) {r--;}res(r-l);l;}return res;}pub…