yolov8目标检测onnx推理及后处理实现

yolov8多batch推理,nms后处理 yolov8, 多batch,nms 阅读详情
AI摘要

文章介绍了如何将YOLOv8的预训练PyTorch模型转换为ONNX格式,并进行推理测试。YOLOv8模型取消了anchor和bbox的置信度,输出形状不同于之前的YOLO系列。在推理后,通过提取最大分类概率作为bbox的置信度,以便使用非极大值抑制进行目标检测。文章提供了从ONNX模型获取结果并进行NMS处理的Python代码示例。

         使用onnx进行yolov8模型推理测试。首先从YOLOv8开源地址下载预训练模型,由于测试在CPU上进行,就只下载最小的YOLOv8n模型。

 YOLOv8n预训练模型为pytorch的pt格式,大小为6.2M,下载完成后,通过pytorch转换为onnx。转换脚本:

import torch
net = torch.load('yolov8n.pt', map_location='cpu')
net.eval()
dummpy_input = torch.randn(1, 3, 640, 640)
torch.onnx.export(net, dummpy_input, 'yolov8n.onnx', export_params=True,
                  input_names=['input'],
                  output_names=['output'])

        完成模型转换后,接下来进行onnx推理测试。编写推理脚本前可以通过netron工具查看模型输入输出,可以看到yolov8输入为[1,3,640,640],输入为[1,84,8400]。

         YOLOv8输出shape跟yolo之前系列模型(YOLOv5输出为[25200,85]),有较大差异,查找一番后,发现yolov8在两个方面做了调整,一是取消了anchor(因为每个anchor对应3个bbox),因此总的bbox数降低三倍;二是取消了bbox的置信度,将bbox置信度与分类融合。

         为了复用之前YOLO系列的后处理代码(非极大值抑制),需要将YOLOv8输出结果进行处理,将分类预测中的最大值提取出来作为bbox置信度。将推理结果转换为[1,8400,85]形式。

 

pred_class = pred[..., 4:]
pred_conf = np.max(pred_class, axis=-1)
pred = np.insert(pred, 4, pred_conf, axis=-1)

测试图片:

 测试结果:

完整的推理脚本:

import onnxruntime as rt
import numpy as np
import cv2
import  matplotlib.pyplot as plt


def nms(pred, conf_thres, iou_thres): 
    conf = pred[..., 4] > conf_thres
    box = pred[conf == True] 
    cls_conf = box[..., 5:]
    cls = []
    for i in range(len(cls_conf)):
        cls.append(int(np.argmax(cls_conf[i])))
    total_cls = list(set(cls))  
    output_box = []  
    for i in range(len(total_cls)):
        clss = total_cls[i] 
        cls_box = []
        for j in range(len(cls)):
            if cls[j] == clss:
                box[j][5] = clss
                cls_box.append(box[j][:6])
        cls_box = np.array(cls_box)
        box_conf = cls_box[..., 4]  
        box_conf_sort = np.argsort(box_conf) 
        max_conf_box = cls_box[box_conf_sort[len(box_conf) - 1]]
        output_box.append(max_conf_box) 
        cls_box = np.delete(cls_box, 0, 0) 
        while len(cls_box) > 0:
            max_conf_box = output_box[len(output_box) - 1]  
            del_index = []
            for j in range(len(cls_box)):
                current_box = cls_box[j]  
                interArea = getInter(max_conf_box, current_box)  
                iou = getIou(max_conf_box, current_box, interArea)  
                if iou > iou_thres:
                    del_index.append(j)  
            cls_box = np.delete(cls_box, del_index, 0)  
            if len(cls_box) > 0:
                output_box.append(cls_box[0])
                cls_box = np.delete(cls_box, 0, 0)
    return output_box


def getIou(box1, box2, inter_area):
    box1_area = box1[2] * box1[3]
    box2_area = box2[2] * box2[3]
    union = box1_area + box2_area - inter_area
    iou = inter_area / union
    return iou


def getInter(box1, box2):
    box1_x1, box1_y1, box1_x2, box1_y2 = box1[0] - box1[2] / 2, box1[1] - box1[3] / 2, \
                                         box1[0] + box1[2] / 2, box1[1] + box1[3] / 2
    box2_x1, box2_y1, box2_x2, box2_y2 = box2[0] - box2[2] / 2, box2[1] - box1[3] / 2, \
                                         box2[0] + box2[2] / 2, box2[1] + box2[3] / 2
    if box1_x1 > box2_x2 or box1_x2 < box2_x1:
        return 0
    if box1_y1 > box2_y2 or box1_y2 < box2_y1:
        return 0
    x_list = [box1_x1, box1_x2, box2_x1, box2_x2]
    x_list = np.sort(x_list)
    x_inter = x_list[2] - x_list[1]
    y_list = [box1_y1, box1_y2, box2_y1, box2_y2]
    y_list = np.sort(y_list)
    y_inter = y_list[2] - y_list[1]
    inter = x_inter * y_inter
    return inter


def draw(img, xscale, yscale, pred):
    img_ = img.copy()
    if len(pred):
        for detect in pred:
            detect = [int((detect[0] - detect[2] / 2) * xscale), int((detect[1] - detect[3] / 2) * yscale),
                      int((detect[0]+detect[2] / 2) * xscale), int((detect[1]+detect[3] / 2) * yscale)]
            img_ = cv2.rectangle(img, (detect[0], detect[1]), (detect[2], detect[3]), (0, 255, 0), 1)
    return img_


if __name__ == '__main__':
    height, width = 640, 640
    img0 = cv2.imread('1.jpg')
    x_scale = img0.shape[1] / width
    y_scale = img0.shape[0] / height
    img = img0 / 255.
    img = cv2.resize(img, (width, height))
    img = np.transpose(img, (2, 0, 1))
    data = np.expand_dims(img, axis=0)
    sess = rt.InferenceSession('yolov8n.onnx')
    input_name = sess.get_inputs()[0].name
    label_name = sess.get_outputs()[0].name
    pred = sess.run([label_name], {input_name: data.astype(np.float32)})[0]
    pred = np.squeeze(pred)
    pred = np.transpose(pred, (1, 0))
    pred_class = pred[..., 4:]
    pred_conf = np.max(pred_class, axis=-1)
    pred = np.insert(pred, 4, pred_conf, axis=-1)
    result = nms(pred, 0.3, 0.45)
    ret_img = draw(img0, x_scale, y_scale, result)
    ret_img = ret_img[:, :, ::-1]
    plt.imshow(ret_img)
    plt.show()

 

yolov8官方代码训练模型(coco数据集和voc数据集训练)+onnx模型预测 根据官方的解释,pip 的 ultralytics 库包含了 requirements.txt中的所有库。windows11 和 Ubuntu20.04(建议使用 Linux 系统)首先切换到自己建立的虚拟环境安装 pytorch。参照官网,直接使用以下语句即可导入项目所需要的库。train 和 val 的路径就这样写。2.3 yaml文件。 阅读详情

相关推荐

三天从YOLOV8关键点检测入门到实战(第三天)——用onnx部署yolov8

其实我们可以看到应用onnx来预测确实是准确性有所降低,这里也是用的最小的模型yolov8n-pose的模型,可能用大的模型会更好。但重点是一些套路,比如onnx推理引擎的使用,opencv可视化的模版,这些套路对以后开发是很有帮助的。

chenyuan1111的博客 3495

YOLOv8目标检测实战:TensorRT加速部署

PyTorch版的YOLOv8是先进的高性能实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。本课程讲述如何使用TensorRT对YOLOv8目标检测进行加速和部署。采用改进后的tensorrtx/yolov8的代码,使用TensorRT API构建优化推理引擎支持在GPU上端到端TensorRT加速部署,包括预处理(图像resize, BGR->RGB,归一化)、网络推理、后处理(非极大抑制) 均在GPU上执行支持FP16和INT8量化加速提供C++和Python的TensorRT加速命令接口分别在Windows和Ubuntu系统上做YOLOv8的TensorRT加速和部署演示支持图片、图片文件夹、视频文件的TensorRT的加速推理提供YOLOv8的TensorRT加速部署代码和代码解析文档实测推理速度提高3倍以上,采用INT8量化加速后推理速度更快。RTX 3060 GPU上端到端处理速度约2.5毫秒,INT8量化加速后推理速度可小于2毫秒。课程内容包括:原理篇(YOLOv8网络架构与组件、TensorRT基础、TensorRT INT8量化、CUDA编程方法)、实践篇(Windows和Ubuntu系统上的TensorRT加速和INT8量化部署演示)、代码解析篇(YOLOv8的TensorRT加速的代码解析) 。本课程提供YOLOv8的TensorRT加速部署代码和代码解析文档。

C#集成YOLOv8目标检测:基于ONNX Runtime的工业视觉应用实践

在工业自动化、安防监控、缺陷检测等场景中,目标检测是核心的视觉任务。传统方案往往依赖复杂的C++库和深度学习框架,对C#开发者而言门槛较高。YOLOv8作为当前高效且易用的目标检测模型,结合ONNX Runtime这一跨平台推理引擎,为C#开发者提供了一条清晰的集成路径。本文旨在为C#开发者,特别是Windows桌面应用、上位机或工业软件开发者,提供一个从零开始的、可复现的集成方案。你将学习如何将训练好的YOLOv8模型转换为ONNX格式,并在一个全新的C#控制台或WinForms项目中,使用ONNX Ru

weixin_29045001的博客 305

YoloV8目标检测与实例分割——目标检测onnx模型推理

yolov8目标检测onnx模型推理,不安装过多依赖,更好的部署到生产环境

知来者逆的博客 1万+

YOLOv8目标检测推理流程及Python代码

在这章中将介绍目标检测推理原理,以及基于onnx模型使用Python语言进行推理。在推理原理章节中,将了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作等;在Python代码篇,将给出推理代码。这里注意一下的是,由于在导出onnx模型的时候,V8已经帮我们进行了解码操作,所以onnx模型结果输出和我在《YOLOv8深度剖析章节》理论篇中讲的会稍微有点不同,这里反而是更加简单。

ice 1133

YOLOv8旋转目标检测推理流程及Python代码

在这章中将介绍旋转目标检测推理原理,以及基于onnx模型使用Python语言进行推理。在推理原理章节中,将了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作等;在Python代码篇,将给出推理代码。这里注意一下的是,由于在导出onnx模型的时候,V8已经帮我们进行了解码操作,所以onnx模型结果输出和我在《YOLOv8深度剖析章节》理论篇中讲的会稍微有点不同,这里反而是更加简单。

ice 673

YOLOv8 onnx 数据集 模型批量推理

YOLOv8 onnx批量推理处理图片数据集

用于记录 416

从零手写 C# + YOLOv12 推理全流程:ONNX Runtime 版

YOLOv12 来了!作为最新一代目标检测模型,它在架构上引入了更高效的注意力机制。但对于 C# 开发者来说,

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 299

可视化目标检测算法推理部署(二)YOLOv8模型图像推理

在先前的RT-DETR中,博主使用ONNX模型文件进行了视频、图像的推理,在本章节,博主打算使用YOLOv8模型进行推理,因此,我们除了需要获取YOLOv8的ONNX模型文件外,还需要进行一些额外的操作,如NMS。

pengxiang1998的博客 1738

告别慢推理!YOLOv7推理加速指南:ONNX Runtime与TensorRT实战优化

前置步骤:将YOLOv7导出为简化后的ONNX模型,分离NMS后处理,固定输入形状;高兼容性选择:ONNX Runtime(GPU/CPU通用,门槛低,速度提升3~5倍);极致性能选择:TensorRT(NVIDIA专属,FP16/INT8优化,速度提升9~15倍);额外优化:轻量化模型、减小输入尺寸、批量推理,可进一步提升吞吐量;精度控制:优先使用FP16(精度损失<2%),极致加速时使用INT8(需校准数据集,精度损失<5%)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 419

自适应滤波算法综述

自适应滤波算法综述

xdzhujy的博客 5万+

【深度学习】C++ onnx Yolov8 目标检测推理

C++ onnx yolov8目标检测模型推理

weixin_48846514的博客 1526

VerilogEval实战指南:从基准测试到模型微调的全流程解析

本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。

yy01234的博客 1005

使用onnxruntime-web 运行yolov8-nano推理

ONNX 是一种开放的格式,可以在不同的深度学习框架之间共享模型,如 PyTorch、TensorFlow、MXNet 和 Caffe2。ONNX 模型在推理时通常能够实现更高的效率,特别是在使用 ONNX Runtime 时。YOLOv8n 是 YOLOv8 系列中的 "nano" 版本,通常是指模型较小,参数较少,计算需求低。创建一个形状为 const modelInputShape = [1, 3, 640, 640] 的空张量,并运行一次模型以进行预热,确保模型准备就绪。首先需要下载这两个模型。

陈锐的技术笔记 2290

[南大ICS-PA2] 字符串处理函数和printf实现

[南大ICS-PA2] 程序、运行时环境与AM 字符串处理函数和printf实现

qq_42474104的博客 2985

F5 shape最新版逆向分析(美西南、xbk)

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,如有侵权,请联系作者立即删除。今天来简单秀下传说中的f5 shape,这是一个数一数二的盾,jsvmp+顶级风控,就算技术实力再强,也是需要花很多时间去摸索的,如果您遇到了这个盾又没有太多的时间去搞,欢迎来找我们。

mature的博客 3651

【YOLOv8】实战三:基于LabVIEW TensorRT部署YOLOv8

本文主要想和各位读者分享YOLOv8使用TensorRT工具包在LabVIEW中的部署。

virobotics的博客 5178

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导

标准高斯过程回归从零开始公式推导

qq_43587949的博客 1万+

【深度学习】C++ Tensorrt Yolov8 目标检测推理

C++ tensorrt对yolov8目标检测模型进行推理。

weixin_48846514的博客 1997

基于深度学习的停车位检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

传统的停车位检测方法主要依赖于人工或基于简单图像处理的技术,存在检测速度慢、准确率低、环境适应性差等问题。近年来,随着深度学习技术的快速发展,基于目标检测的停车位检测系统已成为研究的热点。本文基于YOLO(You Only Look Once)系列模型(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8),开发了一个完整的停车位检测系统,支持实时检测、结果可视化以及UI交互界面。本文实现了一个基于深度学习的停车位检测系统,采用YOLO模型在实时视频流中进行高效检测。

YOLO 332

网络工程师面试题汇总(二)

网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。而互联网(Internet)是全球范围的互连网。因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。地址解析协议 ARP(Address Resolution Protocol)

悦分享 184

YOLOv8 CPU版性能优化:推理速度提升300%实战案例

本文介绍了基于星图GPU平台自动化部署“鹰眼目标检测 - YOLOv8”镜像的实战方案,通过ONNX优化与自定义NMS实现CPU推理速度提升超300%。该镜像可广泛应用于工业检测、安防监控等场景,支持模型微调与AI应用开发,助力高效构建低延迟、高精度的目标检测系统。

weixin_42581846的博客 655

全网详细解决Client does not support authentication protocol requested by server;consider upgrading Mysql c

全网详细解决1251 - Client does not support authentication protocol requested by server; consider upgrading Mysql client。

念兮为美 5476

C# 集成 YOLOv8 与 ONNX Runtime:30分钟构建工业级目标检测应用

目标检测是计算机视觉的核心任务,旨在识别图像或视频中的物体并定位其位置。其原理通常基于深度学习模型,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于能够自动化视觉感知,极大提升工业质检、安防监控等场景的效率和准确性。在实际应用中,开发者常面临将前沿模型集成到现有生产环境的挑战,特别是对于广泛使用 .NET 生态的工业软件和上位机系统。通过 ONNX 这一开放的模型交换格式,可以打破框架壁垒,实现模型跨平台部署。而 ONNX Runtime 作为高性能推理引擎,为 .NET 提供了原生支持,使得

weixin_33212799的博客 304

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用 ONNX Runtime 部署 Ultralytics YOLOv8 目标检测:Python 推理示例解析与实战指南

本文围绕 Ultralytics 仓库中 [YOLOv8-ONNXRuntime 示例](https://link.gitcode.com/i/848f5defb9358b555fb2a5c0b5d7589d) 展开,完整讲解如何将 Ultralytics YOLOv8 模型导出为 ONNX 格式,并借助 ONNX Runtime 在 CPU/GPU 上完成目标检测推理。读完本文,你将掌握完整的部

gitblog_00320的博客 234

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: YOLOv7迁移昇腾NPU推理测试
下一篇: pytorch保存、加载和解析模型权重
TheMatrixs
博客等级 码龄9年 1万+粉丝 92原创
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheMatrixs

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值