华为 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 数组。

代码示例:

python 复制代码
import numpy as np
from typing import Tuple
from yolov5_utils import letterbox

def 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. 返回推理结果。

完整代码:

python 复制代码
import acl
import aclruntime
import numpy as np
from typing import List

def 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. 坐标映射 :将推理结果的坐标映射回原图尺寸。
    代码示例:
python 复制代码
from yolov5_utils import non_max_suppression, scale_coords

def 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 检测流程整合

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

python 复制代码
import cv2
from typing import List, Tuple

def 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 调用示例

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

python 复制代码
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 = box
        cv2.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 平台上的目标检测开发提供参考!如果有任何问题,欢迎留言讨论。

相关推荐
网络小白不怕黑3 小时前
华为设备 QoS 流分类与流标记深度解析及实验脚本
网络·华为
网络小白不怕黑4 小时前
华为交换机堆叠与集群技术深度解析附带脚本
网络·华为
要努力啊啊啊15 小时前
YOLOv2 正负样本分配机制详解
人工智能·深度学习·yolo·计算机视觉·目标跟踪
幽蓝计划15 小时前
HarmonyOS NEXT仓颉开发语言实战案例:动态广场
华为·harmonyos
Ailerx17 小时前
YOLOv13震撼发布:超图增强引领目标检测新纪元
人工智能·yolo·目标检测
幽蓝计划1 天前
HarmonyOS NEXT仓颉开发语言实战案例:电影App
华为·harmonyos
HMS Core1 天前
HarmonyOS免密认证方案 助力应用登录安全升级
安全·华为·harmonyos
伍哥的传说1 天前
鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)
前端·华为·前端框架·harmonyos·鸿蒙
埃菲尔铁塔_CV算法1 天前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
funnycoffee1231 天前
Huawei 6730 Switch software upgrade example版本升级
java·前端·华为