当前位置: 首页 > article >正文

DETR模型ONNX推理实战:从输出张量到可视化检测框的完整解析

DETR模型ONNX推理实战从输出张量到可视化检测框的完整解析在目标检测领域DETRDetection Transformer以其独特的端到端架构和简洁的流程设计正在改变传统基于锚框anchor-based方法的格局。不同于Faster R-CNN等经典检测模型DETR直接输出固定数量的预测结果默认为100个省去了繁琐的锚框设计和后处理步骤。然而这种创新也带来了新的挑战——如何正确解析模型输出的pred_logits和pred_boxes张量并将其转换为直观的可视化检测结果这正是本文要解决的核心问题。我们将从ONNX推理的实际场景出发深入剖析DETR的输出结构手把手演示如何将归一化的中心坐标宽高cxcywh转换为图像上的绝对坐标xyxy并实现置信度过滤与结果可视化。无论您是在部署模型时遇到输出解析困惑还是希望深入理解DETR的工作原理本文都将为您提供清晰的解决方案和可复用的代码工具。1. DETR输出结构深度解析DETR模型的输出包含两个关键张量pred_logits和pred_boxes。理解它们的结构和含义是正确解析结果的第一步。1.1 输出张量的维度与含义典型的DETR ONNX模型输出如下pred_logits形状为[1, 100, 92]的张量1批处理大小batch size100固定数量的预测框92COCO数据集的类别数91个物体类别1个背景类pred_boxes形状为[1, 100, 4]的张量4每个预测框的坐标参数格式为[中心x, 中心y, 宽度, 高度]即cxcywh所有坐标值都是相对于输入图像尺寸的归一化值范围0-1# 示例查看输出张量的形状 import onnxruntime as rt sess rt.InferenceSession(detr.onnx) output_names [output.name for output in sess.get_outputs()] net_outs sess.run(output_names, {images: input_tensor}) print(pred_logits shape:, net_outs[0].shape) # (1, 100, 92) print(pred_boxes shape:, net_outs[1].shape) # (1, 100, 4)1.2 预测框的分布特点DETR的100个预测框中大部分是低质量的空预测对应背景类。实际应用中我们需要通过置信度过滤掉低质量预测对剩余预测框进行非极大值抑制NMS去除冗余下表展示了典型DETR输出的统计特性预测框类型占比典型置信度范围处理方式高质量检测5-15%0.7保留并可视化中等质量检测10-20%0.3-0.7根据应用场景选择保留低质量/背景65-85%0.3过滤掉2. 坐标转换从cxcywh到图像像素坐标DETR输出的pred_boxes采用[中心x, 中心y, 宽度, 高度]的归一化格式需要转换为图像上的绝对坐标[x_min, y_min, x_max, y_max]才能用于可视化。2.1 归一化坐标到绝对坐标的转换转换过程分为两步将cxcywh转换为xyxy格式仍为归一化坐标根据图像尺寸将归一化坐标缩放为像素坐标import numpy as np def box_cxcywh_to_xyxy(x): 将cxcywh格式的框转换为xyxy格式 x_c, y_c, w, h x[..., 0], x[..., 1], x[..., 2], x[..., 3] b [(x_c - 0.5 * w), # x_min (y_c - 0.5 * h), # y_min (x_c 0.5 * w), # x_max (y_c 0.5 * h)] # y_max return np.stack(b, axis-1) def scale_boxes(boxes, image_size): 将归一化坐标缩放为图像像素坐标 height, width image_size scale_fct np.array([width, height, width, height]) return boxes * scale_fct2.2 处理不同尺寸的输入图像实际应用中输入图像可能经过resize处理。为确保坐标转换正确需要记录原始图像尺寸和预处理方式# 示例处理经过resize的图像 original_image Image.open(input.jpg) original_size original_image.size # (width, height) # 预处理resize到512x512 processed_image original_image.resize((512, 512)) input_tensor preprocess(processed_image) # 假设已实现预处理函数 # 模型推理后转换坐标时使用原始尺寸 boxes box_cxcywh_to_xyxy(pred_boxes) scaled_boxes scale_boxes(boxes, original_size)3. 类别分数处理与置信度过滤pred_logits包含每个预测框的类别分数但需要经过适当处理才能得到可用的置信度分数。3.1 从logits到概率分布DETR输出的logits需要通过softmax转换为概率分布def process_logits(pred_logits): # 对最后一个维度类别维度应用softmax prob np.exp(pred_logits) / np.exp(pred_logits).sum(-1, keepdimsTrue) # 获取每个框的最高分数和对应类别忽略背景类 scores np.max(prob[..., :-1], axis-1) # 去掉背景类 labels np.argmax(prob[..., :-1], axis-1) return scores, labels3.2 置信度阈值的选择策略选择合适的置信度阈值对结果质量至关重要高阈值0.7以上只保留高质量预测减少假阳性中等阈值0.3-0.7平衡召回率和准确率低阈值0.3以下适合需要高召回率的场景提示对于实时应用建议从0.5开始调整根据实际效果微调阈值。4. 完整推理流程与可视化实现将上述步骤整合为一个完整的推理流程并实现检测结果的可视化。4.1 构建解码工具类class DETRDecoder: def __init__(self, class_names): self.class_names class_names def decode_output(self, pred_logits, pred_boxes, image_size, confidence_thresh0.5): # 处理类别分数 prob np.exp(pred_logits) / np.exp(pred_logits).sum(-1, keepdimsTrue) scores np.max(prob[..., :-1], axis-1) labels np.argmax(prob[..., :-1], axis-1) # 转换框格式 boxes self.box_cxcywh_to_xyxy(pred_boxes) boxes self.scale_boxes(boxes, image_size) # 过滤低置信度预测 keep scores[0] confidence_thresh filtered_boxes boxes[0][keep] filtered_scores scores[0][keep] filtered_labels labels[0][keep] return filtered_boxes, filtered_scores, filtered_labels def box_cxcywh_to_xyxy(self, x): x_c, y_c, w, h x[..., 0], x[..., 1], x[..., 2], x[..., 3] b [(x_c - 0.5 * w), (y_c - 0.5 * h), (x_c 0.5 * w), (y_c 0.5 * h)] return np.stack(b, axis-1) def scale_boxes(self, boxes, image_size): height, width image_size[1], image_size[0] scale_fct np.array([width, height, width, height]) return boxes * scale_fct4.2 可视化检测结果from PIL import ImageDraw, ImageFont import colorsys def visualize_detections(image, boxes, scores, labels, class_names): draw ImageDraw.Draw(image) font ImageFont.load_default() # 为每个类别生成颜色 num_classes len(class_names) hsv_tuples [(x / num_classes, 1., 1.) for x in range(num_classes)] colors list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples)) colors list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), colors)) for box, score, label in zip(boxes, scores, labels): # 绘制边界框 draw.rectangle(box.tolist(), outlinecolors[label], width2) # 准备标签文本 label_text f{class_names[label]}: {score:.2f} label_size draw.textsize(label_text, font) # 绘制标签背景 text_origin (box[0], box[1] - label_size[1]) draw.rectangle( [text_origin[0], text_origin[1], text_origin[0] label_size[0], text_origin[1] label_size[1]], fillcolors[label] ) # 绘制文本 draw.text(text_origin, label_text, fill(0, 0, 0), fontfont) return image4.3 端到端推理示例# 加载模型和类名 sess rt.InferenceSession(detr.onnx) class_names [...] # 加载COCO类名 # 初始化解码器 decoder DETRDecoder(class_names) # 预处理输入图像 image Image.open(input.jpg) original_size image.size input_tensor preprocess_image(image) # 实现预处理函数 # 运行推理 outputs sess.run(None, {images: input_tensor}) pred_logits, pred_boxes outputs[0], outputs[1] # 解码输出 boxes, scores, labels decoder.decode_output( pred_logits, pred_boxes, original_size, confidence_thresh0.5 ) # 可视化并保存结果 result_image visualize_detections(image, boxes, scores, labels, class_names) result_image.save(output.jpg)在实际项目中这种模块化的设计使得DETR模型的集成变得简单高效。解码器类可以轻松集成到各种应用场景中而可视化函数则可以根据具体需求进行定制比如添加不同的框样式、调整标签显示方式等。

相关文章:

DETR模型ONNX推理实战:从输出张量到可视化检测框的完整解析

DETR模型ONNX推理实战:从输出张量到可视化检测框的完整解析 在目标检测领域,DETR(Detection Transformer)以其独特的端到端架构和简洁的流程设计,正在改变传统基于锚框(anchor-based)方法的格局…...

ZYNQ AXI DMA Scatter/Gather模式实战:从PL到PS的高效数据流构建与FreeRTOS任务调度

1. 理解AXI DMA Scatter/Gather模式的核心价值 在ZYNQ平台上构建高效数据流系统时,AXI DMA的Scatter/Gather模式(简称SG模式)绝对是硬件加速的利器。我第一次接触这个功能时,发现它完美解决了传统DMA传输中的两大痛点:…...

期权量化交易基础库:模块化设计与回测实战指南

1. 项目概述:一个为期权交易者打造的“地基” 如果你在量化交易或者期权策略开发领域摸爬滚打过一段时间,大概率会和我有同样的感受:每次想测试一个新想法,都得从零开始搭建数据接口、计算希腊字母、管理仓位、回测框架……这些重…...

Translumo完整指南:5分钟掌握Windows实时屏幕翻译神器,彻底告别语言障碍

Translumo完整指南:5分钟掌握Windows实时屏幕翻译神器,彻底告别语言障碍 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirro…...

Visara:可视化代码仓库分析工具的设计原理与工程实践

1. 项目概述:一个面向开发者的视觉化代码仓库分析工具最近在和一些团队做代码评审和架构梳理时,我常常遇到一个痛点:面对一个陌生的、动辄几十上百个文件的代码仓库,如何快速理解它的整体结构、模块依赖和关键文件?传统…...

RK3566(泰山派)实战:D310T9362V1SPEC触摸屏驱动从零适配与调试(竖屏)

1. RK3566与D310T9362V1SPEC屏幕简介 RK3566是瑞芯微推出的一款高性能嵌入式处理器,采用四核Cortex-A55架构,主频可达1.8GHz。这款芯片在工业控制、智能家居和物联网设备中广泛应用,特别适合需要图形显示和触摸交互的场景。我最近在一个智能终…...

终极指南:如何用NoFences桌面分区工具提升3倍工作效率

终极指南:如何用NoFences桌面分区工具提升3倍工作效率 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了Windows桌面上杂乱无章的图标?每天…...

Godot引擎命令行插件GDShell:提升开发效率与自动化实践

1. 项目概述:当游戏引擎遇见命令行如果你是一位游戏开发者,尤其是使用Godot引擎的同行,那么你一定对编辑器里那个功能强大但有时略显“笨重”的场景树、资源面板和属性检查器又爱又恨。爱的是它们提供了可视化的创作环境,恨的是当…...

MIMO AONN架构:量子干涉实现超低功耗光学神经网络

1. MIMO AONN架构的核心价值光学神经网络(AONN)正在突破传统电子计算的物理极限。在传统电子神经网络中,非线性激活函数需要消耗大量能量进行电子-光子转换,而基于量子干涉的光学非线性机制可以直接在光域实现这一关键操作。我们实…...

CSS3 媒体查询完全指南:响应式设计的核心利器

在移动设备种类繁多的今天,一套网页需要在手机、平板、笔记本、大屏显示器上都能呈现出良好的布局与可读性。CSS3 媒体查询(Media Queries) 正是实现这种“一次设计,处处适应”的关键技术。它允许开发者根据设备特性(如视口宽度、屏幕分辨率、方向、色彩能力等)有条件地应…...

尝试Taotoken不同模型节点对生成速度的细微影响感受

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 尝试Taotoken不同模型节点对生成速度的细微影响感受 1. 测试背景与动机 在日常使用大模型进行开发或内容创作时,除了模…...

保姆级教程:用ADAMS 2023复现人体行走与跌倒仿真(附完整模型参数与源文件)

ADAMS 2023生物力学仿真实战:从人体步态建模到跌倒临界点分析 在工程仿真领域,人体运动动力学一直是极具挑战性的研究方向。ADAMS作为多体动力学仿真软件的标杆,其2023版本在生物力学仿真方面新增了多项实用功能。本文将带您从零开始&#xf…...

浏览器智能体开发指南:从语义驱动到LLM集成的自动化实践

1. 项目概述:一个能“看”会“想”的浏览器智能体最近在折腾自动化工具和智能体(Agent)的时候,发现了一个挺有意思的项目:smouj/agent-browser。光看这个名字,你可能会觉得它只是一个普通的浏览器自动化库&…...

JUCE框架移植MDA经典音频插件:从VST2到现代跨平台开发实践

1. 项目概述:JUCE框架下的MDA插件遗产如果你在音频插件开发领域摸爬滚打过一段时间,尤其是对开源社区有所关注,那么“mda-plugins-juce”这个名字大概率会唤起你的一些记忆。这个由hollance维护的GitHub仓库,本质上是一个“移植”…...

HS2-HF_Patch:3步完成Honey Select 2汉化去码与插件整合

HS2-HF_Patch:3步完成Honey Select 2汉化去码与插件整合 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》的游戏体验而烦恼…...

在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题 对于依赖 Claude Code 进行编程辅助的开发者而言,服务中…...

一个经典嵌入式问题:如何安全读取 64 位计时器

在一个嵌入式系统中,需要读取一个持续自增的 64-bit 硬件计时器。由于系统只能通过 32-bit MMIO register 访问该计时器,所以硬件把它拆成两个 32-bit 寄存器:#define TIMER_LOW_ADDR 0x40001000 #define TIMER_HIGH_ADDR 0x40001010其中&…...

基于大语言模型的学术论文阅读辅助分析系统的研究与应用

基于大语言模型的学术论文阅读辅助分析系统的研究与应用 摘要 随着科研论文数量的指数级增长,科研工作者面临着前所未有的信息过载挑战。传统学术论文阅读方式依赖线性文本呈现,难以快速定位关键信息,跨文献知识整合效率低下。大语言模型的发展为解决这一问题提供了新的技…...

宏和电子冲刺港股:年营收11.7亿,利润2亿 股价一年上涨超10倍 市值1213亿

雷递网 雷建平 5月17日宏和电子材料科技股份有限公司(简称:“宏和电子”)日前递交招股书,准备在港交所上市。宏和电子2019年7月已在上交所上市。宏和科技在2025年5月时股价才9元,但一年时间股价上涨超过10倍&#xff0…...

理发师会被 AI 取代吗?这可能是 AI 时代最有意思的一个社会学问题

今天去理发了。对着镜子,看着我的头发随着剪刀的飞舞一点点掉下来时,我忽然开始神游:AI 会不会取代理发师? 这问题乍一听有点像胡思乱想,可越想越觉得,它其实非常适合拿来当成 AI 时代的一块切片。 因为理发…...

企业内如何利用Taotoken实现APIKey的集中管理与审计追溯

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业内如何利用Taotoken实现APIKey的集中管理与审计追溯 对于需要将大模型能力集成到业务流程中的企业而言,管理多个开…...

51单片机驱动SG90舵机:从PWM原理到按键控制实战

1. SG90舵机与51单片机的基础认知 第一次接触SG90舵机时,我盯着那三根彩色导线发愣——这玩意儿怎么就能精准控制角度呢?后来发现它其实是微型伺服系统的典型代表,红色接5V电源,褐色接地线,黄色信号线接任意IO口&#…...

Arm DynamIQ架构缓存一致性协议解析与优化

1. Arm DynamIQ架构中的缓存一致性技术解析在异构计算架构中,缓存一致性协议是确保多核处理器高效协同工作的关键技术。作为Arm体系结构的重要组成部分,DynamIQ共享单元(DSU)通过AMBA ACE和CHI协议实现了灵活的系统级缓存一致性管理。这两种协议虽然设计…...

STM32驱动段码屏实战:手把手教你用HT1621B做个简易电子钟(附完整代码)

STM32与HT1621B打造高精度电子钟:从硬件连接到动态显示全解析 在嵌入式开发领域,能够将理论知识转化为实际项目的能力至关重要。本文将带您完成一个完整的电子钟项目,使用STM32微控制器和HT1621B驱动器来驱动段码液晶屏。不同于简单的驱动演示…...

在模型广场中根据任务需求与预算选择合适的模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在模型广场中根据任务需求与预算选择合适的模型 面对文本生成、代码编写、逻辑推理等多样化的任务,开发者常常需要从众…...

JetBrains IDE终极代码高亮指南:MultiHighlight让复杂代码一目了然

JetBrains IDE终极代码高亮指南:MultiHighlight让复杂代码一目了然 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors 🎨💡 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight …...

离线语音模块在塔扇智能化中的集成与应用实践

1. 项目概述:当塔扇“听懂”你的话 家里的塔式风扇,你是不是也经常遇到这样的场景:晚上躺在床上,风扇对着吹有点冷,想调小一档或者关掉,结果发现遥控器不知道被塞到哪个沙发缝里了,只能挣扎着爬…...

3分钟搞定网易云音乐NCM解密:ncmdump工具让你的音乐随处播放

3分钟搞定网易云音乐NCM解密:ncmdump工具让你的音乐随处播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为网易云音乐下载的歌曲只能在特定客户端播放而烦恼?当你想要在车载音响、智能音箱或其他…...

应用连接协议桥接器:打通异构系统,实现数据自动化流转

1. 项目概述:一个连接不同应用生态的“桥梁”最近在折腾一些自动化流程,发现不同平台、不同应用之间的数据互通是个老大难问题。比如,你在A平台创建了一个任务,希望它能自动同步到B平台的日历,或者把C应用里的数据变化…...

告别模组冲突:3分钟掌握Nexus Mods App终极游戏模组管理方案

告别模组冲突:3分钟掌握Nexus Mods App终极游戏模组管理方案 【免费下载链接】NexusMods.App Home of the development of the Nexus Mods App 项目地址: https://gitcode.com/gh_mirrors/ne/NexusMods.App 还在为《赛博朋克2077》的模组冲突而烦恼吗&#x…...