Python onnxruntime推理yolov5和yolov8(最简易版)

支持yolov5和yolov8双模型

其中ChtDeploy中代码如下:

import onnxruntime
import numpy as np
import cv2

class ChtDeploy():
    def __init__(self, img_path, onnx_path, iou_threshold=0.45, conf_threshold=0.3, detect_w=640, detect_h= 640):
        self.img = cv2.imread(img_path)#h,w,c
        self.img_h = self.img.shape[0]
        self.img_w = self.img.shape[1]
        self.iou_threshold = iou_threshold
        self.conf_threshold = conf_threshold
        self.detect_w = detect_w
        self.detect_h = detect_h
        self.onnx = onnx_path
        self.max_wh = max(self.detect_h, self.detect_w)

    def letterbox(self):
        if(self.img_h == self.detect_h and self.img_w == self.detect_w):
            return self.img

        scale = min(self.detect_w / self.img_w, self.detect_h / self.img_h)  # 缩放比例
        nw, nh = int(self.img_w * scale), int(self.img_h * scale)
        image = cv2.resize(self.img, (nw, nh), interpolation=cv2.INTER_LINEAR)
        image_back = np.ones((self.detect_h, self.detect_w, 3), dtype=np.uint8) * 128
        # 将image放在画布中心区域-letterbox
        image_back[(self.detect_h - nh) // 2: (self.detect_h - nh) // 2 + nh, (self.detect_w - nw) // 2:(self.detect_w - nw) // 2 + nw, :] = image
        return image_back

    def img2input(self, img):
        img = np.transpose(img, (2, 0, 1))
        img = img / 255
        return np.expand_dims(img, axis=0).astype(np.float32)  # (1,3,640,640)

    def infer(self, onnx, img):
        session = onnxruntime.InferenceSession(onnx)
        input_name = session.get_inputs()[0].name
        label_name = session.get_outputs()[0].name
        pred = session.run([label_name], {input_name: img})[0]
        return pred #yolov8 1 * 84 * 8400 yolov5 1 * 25200 * 85

    def xywh_to_x1y1x2y2(self, boxes):
        # 提取中心点坐标和宽高
        x_center, y_center, width, height = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]

        # 计算左上角和右下角坐标
        x1 = x_center - width / 2
        y1 = y_center - height / 2
        x2 = x_center + width / 2
        y2 = y_center + height / 2

        # 将计算结果组合成新的数组
        xyxy_boxes = np.stack((x1, y1, x2, y2), axis=1)

        return xyxy_boxes

    def normalpred(self, pred):#the style of v8 to v5
        if pred.shape[1] < pred.shape[2]: #v8
            pred = np.squeeze(pred).T #1 * 84 * 8400 -> 8400 * 84
            scores = np.max(pred[:, 4:], axis=1)
            classes = np.argmax(pred[:, 4:], axis=1)
            mask = scores > self.conf_threshold #置信度过滤
            boxes = self.xywh_to_x1y1x2y2(pred[mask])
            scores = scores[mask]
            classes = classes[mask]
            return boxes, scores, classes

        pred = np.squeeze(pred)
        scores = pred[:, 4]
        classes = np.argmax(pred[:, 5:], axis=1)
        mask = scores > self.conf_threshold  # 置信度过滤
        boxes = self.xywh_to_x1y1x2y2(pred[mask])
        scores = scores[mask]
        classes = classes[mask]
        return boxes, scores, classes

    def box_area(self, boxes):
        return (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])

    def box_iou(self, box1, box2):
        area1 = self.box_area(box1)  # N
        area2 = self.box_area(box2)  # M
        # broadcasting, 两个数组各维度大小 从后往前对比一致, 或者 有一维度值为1;
        lt = np.maximum(box1[:, np.newaxis, :2], box2[:, :2])
        rb = np.minimum(box1[:, np.newaxis, 2:], box2[:, 2:])
        wh = rb - lt
        wh = np.maximum(0, wh)  # [N, M, 2]
        inter = wh[:, :, 0] * wh[:, :, 1]
        iou = inter / (area1[:, np.newaxis] + area2 - inter)
        return iou

    def numpy_nms(self, boxes, scores, iou_threshold):

        idxs = scores.argsort()  # 按分数 降序排列的索引 [N]
        keep = []
        while idxs.size > 0:  # 统计数组中元素的个数
            max_score_index = idxs[-1]
            max_score_box = boxes[max_score_index][None, :]
            keep.append(max_score_index)
            if idxs.size == 1:
                break
            idxs = idxs[:-1]  # 将得分最大框 从索引中删除; 剩余索引对应的框 和 得分最大框 计算IoU;
            other_boxes = boxes[idxs]  # [?, 4]
            ious = self.box_iou(max_score_box, other_boxes)  # 一个框和其余框比较 1XM
            idxs = idxs[ious[0] <= iou_threshold]

        return keep

    def draw_res(self, boxes, img, color=(255, 255, 0), thickness=2):
        for box in boxes:
            x1, y1, x2, y2 = int(box[0]), int(box[1]), int(box[2]), int(box[3])
            cv2.rectangle(img, (x1, y1), (x2, y2), color, thickness)
        cv2.imshow('detect', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    def deploy(self):
        img = self.letterbox()
        img1 = self.img2input(img)
        pred = self.infer(self.onnx, img1)
        boxes, scores, classes = self.normalpred(pred)
        c = classes * self.max_wh
        nb = boxes + c[:, np.newaxis]
        id = self.numpy_nms(nb, scores, self.iou_threshold)
        self.draw_res(boxes[id], img)


d = ChtDeploy(img_path="gg.webp", onnx_path="yolov8n.onnx")
d.deploy()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode每日一题】【BFS模版与例题】【二维数组】1293. 网格中的最短路径

BFS基本模版与案例可以参考&#xff1a; 【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点 【LeetCode每日一题】【BFS模版与例题】【二维数组】130被围绕的区域 && 994 腐烂的橘子 思路&#xff1a; 特殊情况&#xff1a; 最短的路径是向下再向…

多维时序 | Matlab实现GRNN广义回归神经网络多变量时间序列预测

文章目录 效果一览文章概述源码设计参考资料效果一览

SpringBoot(详细介绍)

目录 一、简介 1.1、什么是SpringBoot 1.2.、特性 1.3、四大核心 1.4、特点 二、快速入门 2.1、开发流程 2.1.1、创建项目 maven项目 2.1.2、导入场景 场景启动器 2.1.3、主程序 2.1.4、业务 三、Spring Initializr 创建向导 3.1、依赖管理机制 3.1.1、为什么导…

JRebel and XRebel 插件在IDEA中的安装、激活和使用

1、JRebel安装 1、打开idea->setting->plugins->Marketplace 2、搜索插件JRebel and XRebel&#xff0c;点击安装&#xff0c;然后重启idea 如果左侧出现JRebel & XRebel代表已安装 3.离线安装JRebel 根据自己安装的idea版本进行下载电影的jrebel https://plugi…

H5小游戏,象棋

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html PUBLIC "-//W3C/…

spring学习简单总结(尚硅谷视频

spring学习简单总结 spring-tx-事务注解添加用注解方式进行aop的配置基于注解配置类进行ioc和di的配置 spring-tx-事务注解添加 选择对应事务管理器实现加入到ioc容器 使用注解指定哪些方法需要添加事务 用注解指定方法 用注解方式进行aop的配置 写自己正常的核心业务代…

Python学习 day07(JSON、format()函数)

JSON 各种编程语言存储数据的容器不尽相同&#xff0c;在Python中有字典dict这样的数据类型&#xff0c;而其他语言可能没有对应的字典&#xff0c;为了让不同的语言都能够相互通用的传递数据&#xff0c;JSON就是一种非常良好的中转数据格式&#xff0c;如下&#xff1a; JSON…

前端工具网站合集(持续更新)

综合类网站 那些免费的砖 统计推荐免费工具网站 那些免费的砖 - 优雅地白嫖各种免费资源 (thosefree.com)https://www.thosefree.com/ CSS样式网站 毒蘑菇-配色 CSS 配色&#xff0c;阴影网站 一个好用的配色网站! 毒蘑菇 - 配色 (dumogu.top)https://color.dumogu.top/ …

navicat想把自己库中的表导出给别人的操作

navicat导出表和导入表 导出 右键需要导出的表&#xff0c;选择导出向导 选择csv&#xff0c;然后点击下一步 到这个页面&#xff0c;其实可以不用选择&#xff0c;会自己选择当时选中的表&#xff0c;如果有多张表导出&#xff0c;可以选择其他表。然后点击下一步 到这里是选…

【Django】执行查询——查询JSONField

JSONField 本篇的例子以下面这个模型为基础&#xff1a; from django.db import modelsclass Dog(models.Model):name models.CharField(max_length200)data models.JSONField(nullTrue)def __str__(self):return self.name保存和查询None值 在使用JSONField时&#xff0c…

springboot+jsp汽车配件管理系统idea maven 项目lw

springbootweb汽车配件销售业绩管理系统服务于汽车配件公司业务,实现了客户管理&#xff0c;主要负责对客户相关数据的增删改查方面、渠道管理&#xff0c;主要对渠道信息也就是设备的供应商渠道信息进行管理、项目管理&#xff0c;主要是一些项目信息的记录与整理、销售数据管…

【Photoshop2020版本】零基础笔记(一)

哈喽大家好~最近博客内容换方向了哈哈哈~换成“实用版”了。 今天给大家带来的是 PS 相关内容 其实我也是刚学PS&#xff0c;所以想着自己做笔记还不如发布出去&#xff0c;让大家都能看到&#xff0c;有兴趣的伙伴们&#xff0c;可以跟着我的笔记一块学习&#xff0c;这个专…

Python-Numpy-计算矩阵相乘

向量化矩阵计算公式&#xff1a; """ Title: matrix_calculating Time: 2024/3/6 Author: Michael Jie """import numpy as npw np.array([[1, 2]]) x np.array([[1, 1], [2, 3], [4, 5]]) b 1# w * x b print(w * x b) """…

Cookie属性HttpOnly引起的漏洞解决方案

问题描述&#xff1a; 项目扫描的时候出一个漏洞&#xff0c;Cookie未配置HttpOnly标志。那HttpOnly是什么呢&#xff1f;Httponly是微软对cookie做的扩展。这个主要是解决用户的cookie可能被盗用的问题。在web应用中、JSESSIONID (Cookie)没有设置Httponly属性可能会窃取或操…

越来越多的上市企业进行FTP替代,真相是什么?

FTP协议大家并不陌生&#xff0c;它是用于在网络上进行文件传输的一套标准协议&#xff0c;基于TCP传输&#xff0c;工作在OSI模型的第七层。FTP协议包括两个主要组成部分&#xff1a;FTP服务器和FTP客户端。FTP服务器用于存储文件&#xff0c;而用户则可以使用FTP客户端通过FT…

SORA技术解析

sora文生视频 sora视频生成过程&#xff1a;视频编码加噪降噪视频解码 视频压缩网络实现降维 时空patches统一视频分割 transformer架构凸显“scaling law”的暴力美学 数据资源更为丰富 参考资料&#xff1a; 1.sora技术报告

【三维重建】相移法+格雷码

本篇文章介绍一种稠密点云的获取方式——条纹结构光三维重建算法。 在学习此算法前&#xff0c;我们需要对基于视觉的三维重建算法有一定了解。 需要了解什么是相机模型、相机标定以及三角化的相关知识。 【三维重建】摄像机几何-CSDN博客 【三维重建】摄像机标定&#xff…

服务永不止步!苏州金龙圆满护航2024年春运

为期40天的2024年春运于3月5日正式落下帷幕。今年春运40天全社会跨区域人员流动量预计累计超84亿人次&#xff0c;在流动量创历史新高的同时还遭遇了冻雨、暴雪等多重考验。但是在社会各界通力合作下&#xff0c;各地运输工作仍然有条不紊地进行&#xff0c;最终克服重重困难&a…

[C语言]——scanf和printf介绍

目录 一.printf 1.基本用法 2.占位符 3.占位符列举 4.输出格式 4.1限定宽度 4.2总是显示正负号 4.3限定小数位数 4.4输出部分字符串 二.scanf 1.基本用法 2.scanf的返回值 3.占位符 4.赋值忽略符 一.printf 1.基本用法 printf() 的作⽤是将参数⽂本输出到屏幕。…

CSS 之 background 系列属性详解

一、background总览 1、简介 background属性是所有背景属性的缩写&#xff0c;通常建议在代码中使用该缩写属性&#xff0c;而不是使用多条单独的背景属性&#xff0c;因为该缩写属性在老版本浏览器中支持性更好&#xff0c;而且书写简便。未写在缩写属性中的其他背景属性&am…