首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

OpenVino快速落地部署教程

编程知识
2024年08月27日 14:36

OpenVino快速落地部署教程

        Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。本教程适用于Yolov5-7.0,直接跑Yolov5为6FPS,使用OpenVino后为30FPS,未来将会出一系列其他模型(Paddle等)的OpenVino部署教程,测试平台——Intel Nuc 11代i5处理器

一、安装OpenVino

进入OpenVino官网

https://docs.openvino.ai/2024/get-started/install-openvino.html

选择自己喜欢的下载方式,本教程采用OpenVino-2022.3.1版本

二、模型转换

  1. 通过Yolov5自带的export.py文件将.pt转为.onnx格式

    python3 export.py --weights xxxx/xxxxx.pt --include onnx --batch_size 1 --opset 10
    
    PS:如果出现转换失败的提示,如:opset 10不支持或是onnx版本问题请重新搭建yolov5环境,按照requirements.txt里库的最低版本进行安装
    
  2. 使用OpenVino工具链将.onnx转为xml、bin模型

    mo --input_model xxx/xxx.onnx
    
    PS:如果openvino环境安装成功将可以在yolov5的环境中直接使用mo命令
    

PS:转换完成后请一定用模型可视化工具查看转换是否正确

三、采用以下代码快速部署

import openvino.runtime as ov
import cv2
import numpy as np
import openvino.preprocess as op

class ObjectDetector:
    def __init__(self, model_xml, model_bin, labels, device="CPU"):
        self.core = ov.Core()
        self.model = self.core.read_model(model_xml, model_bin)
        self.labels = labels
        self.preprocess_model()
        self.compiled_model = self.core.compile_model(self.model, device)
        self.infer_request = self.compiled_model.create_infer_request()

    def preprocess_model(self):
        premodel = op.PrePostProcessor(self.model)
        premodel.input().tensor().set_element_type(ov.Type.u8).set_layout(ov.Layout("NHWC")).set_color_format(op.ColorFormat.BGR)
        premodel.input().preprocess().convert_element_type(ov.Type.f32).convert_color(op.ColorFormat.RGB).scale([255., 255., 255.])
        premodel.input().model().set_layout(ov.Layout("NCHW"))
        premodel.output(0).tensor().set_element_type(ov.Type.f32)
        self.model = premodel.build()

    def infer(self, img):
        detections = []
        img_re, dw, dh = self.resizeimg(img, (640, 640))
        input_tensor = np.expand_dims(img_re, 0)
        self.infer_request.infer({0: input_tensor})
        output = self.infer_request.get_output_tensor(0)
        detections = self.process_output(output.data[0])
        return detections

    def process_output(self, detections):
        boxes = []
        class_ids = []
        confidences = []
        for prediction in detections:
            confidence = prediction[4].item()
            if confidence >= 0.6:
                classes_scores = prediction[5:]
                _, _, _, max_indx = cv2.minMaxLoc(classes_scores)
                class_id = max_indx[1]
                if (classes_scores[class_id] > .25):
                    confidences.append(confidence)
                    class_ids.append(class_id)
                    x, y, w, h = prediction[0].item(), prediction[1].item(), prediction[2].item(), prediction[3].item()
                    xmin = x - (w / 2)
                    ymin = y - (h / 2)
                    box = np.array([xmin, ymin, w, h])
                    boxes.append(box)
        indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.5)
        detections = []
        for i in indexes:
            j = i.item()
            detections.append({"class_index": class_ids[j], "confidence": confidences[j], "box": boxes[j]})
        return detections

    def resizeimg(self, image, new_shape):
        old_size = image.shape[:2]
        ratio = float(new_shape[-1] / max(old_size))
        new_size = tuple([int(x * ratio) for x in old_size])
        image = cv2.resize(image, (new_size[1], new_size[0]))
        delta_w = new_shape[1] - new_size[1]
        delta_h = new_shape[0] - new_size[0]
        color = [100, 100, 100]
        new_im = cv2.copyMakeBorder(image, 0, delta_h, 0, delta_w, cv2.BORDER_CONSTANT, value=color)
        return new_im, delta_w, delta_h


if __name__ == "__main__":
    # Example usage:
    labels = [
        "right",
        "warning",
        "left",
        "people",
        "10",
        "pullover",
        "10off",
        "green",
        "red"
    ]
    detector = ObjectDetector("/home/nuc/MyCar/yolov5-7.0/best.xml", "/home/nuc/MyCar/yolov5-7.0/best.bin", labels, "CPU")
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        detections = detector.infer(frame)
        for detection in detections:
            classId = detection["class_index"]
            confidence = detection["confidence"]
            label = labels[classId]
            box = detection["box"]
            area = box[2] * box[3]
            print(f"Detected object: {label}, Confidence: {confidence}, Area: {area}")
    cap.release()

From:https://www.cnblogs.com/SkyXZ/p/18382813
本文地址: http://www.shuzixingkong.net/article/1490
0评论
提交 加载更多评论
其他文章 k8s-使用Network Policies实现网络隔离
一、需求 Kubernetes 的命名空间主要用于组织和隔离资源,但默认情况下,不同命名空间中的 Pod 之间是可以相互通信的。为了实现更严格的网络隔离,同一套k8s需要根据不同的命名空间进行网络环境隔离,例如开发(dev01)测试(test01)环境。Network Policies 是 Kube
k8s-使用Network Policies实现网络隔离 k8s-使用Network Policies实现网络隔离 k8s-使用Network Policies实现网络隔离
树莓派CM4(四):树莓派镜像替换内核
树莓派镜像替换内核 1. 为什么要替换内核 树莓派官方提供的镜像中,自带的内核版本为6.6.31 然而github上提供的内核源码为6.6.40,有些微差别 此外,后续很有可能进行内核裁剪定制,替换内核是一个无法绕开的工作 2. 获取内核源码 github地址: https://github.com
树莓派CM4(四):树莓派镜像替换内核 树莓派CM4(四):树莓派镜像替换内核 树莓派CM4(四):树莓派镜像替换内核
逻辑回归算法 0基础小白也能懂(附代码)
逻辑回归算法 0基础小白也能懂(附代码) 原文链接 啥是逻辑回归算法 逻辑回归(Logistic Regression)是一种广泛用于分类任务的统计模型,特别适用于二元分类问题。尽管名称中带有“回归”,但逻辑回归主要用于分类。逻辑回归算法包含以下几个关键部分:线性回归与分类,Sigmoid 函数与决
逻辑回归算法 0基础小白也能懂(附代码) 逻辑回归算法 0基础小白也能懂(附代码) 逻辑回归算法 0基础小白也能懂(附代码)
React 高德地图 进京证 (二)
上回书说到,躲开摄像头的基本功能实现了,但有三个核心问题: (1)速度慢 (2)距离远易失败 (3)地图限制 第一个问题:较为简单,把几千个摄像头按行政区划分好带上编号,在路线分段避让时按片儿计算,综合测试速度提升了50%。 //找到每段step途径的 let wayDistrictsCamera
React 高德地图 进京证 (二) React 高德地图 进京证 (二) React 高德地图 进京证 (二)
安装nvm,并通过nvm安装nodejs
转载请注明出处: 1.安装nvm 打开终端,然后运行以下命令来下载并安装nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 或者使用wget: wget -qO- https://r
安装nvm,并通过nvm安装nodejs 安装nvm,并通过nvm安装nodejs 安装nvm,并通过nvm安装nodejs
压缩流使用
压缩流 场景:需要将一些数据,以及这些数据关联的附件压缩下载,数据导出为一个Excel,附件导出到一个文件夹中 这里使用easyexcel 导出excel 从华为云 obs 下载附件 并交给浏览器 public void downloadAllEliminate(HttpServletRespons
压缩流使用
Modbus ASCII 获取数据
根据银河高低温试验箱协议读取数据 1.协议内容 8.1:通讯协议介绍 8.1.5 通讯设置 本通讯协议使用异步串行通讯方式,1 个起始位、8 个数据位、2 个停止 位、无奇偶校验数据通讯格式,其中数据位8 位,第1 位为最高位(MSB),第8 位为最低位(LSB)。 8.1.6 数据格式 通讯采用直
Modbus ASCII 获取数据 Modbus ASCII 获取数据
CANopen学习笔记(二)通讯对象PDO和SDO等
通讯对象 PDO 我的观点:一个 CANopen 设备可以拥有最多 512 个 RPDO 和 512 个 TPDO,总共最多 1024 个 PDO。(得到GPT4o的肯定) CiA协议栈观点:一个只有一个逻辑设备的 CANopen 设备最多有 512 个 PDO。 PDO的两种用法: TPDO:生产
CANopen学习笔记(二)通讯对象PDO和SDO等 CANopen学习笔记(二)通讯对象PDO和SDO等 CANopen学习笔记(二)通讯对象PDO和SDO等