Ultralytics YOLO27:
Get Started

Ultralytics YOLO11 的 Sony IMX500 导出#

本指南介绍如何将 Ultralytics YOLO11 模型导出并部署到搭载 Sony IMX500 传感器的 Raspberry Pi AI 摄像头。

在 Raspberry Pi AI 摄像头等计算能力有限的设备上部署计算机视觉模型可能颇具挑战。使用针对更快性能进行优化的模型格式,会带来显著提升。

IMX500 模型格式旨在以尽可能低的功耗为神经网络提供快速性能。它可让你优化 Ultralytics YOLO11 模型,实现高速、低功耗推理。本指南将带你了解如何将模型导出并部署为 IMX500 格式,让模型能够在 Raspberry Pi AI 摄像头上发挥出色性能。

Raspberry Pi AI Camera with Sony IMX500 sensor

为什么要导出为 IMX500 格式?#

Sony 的 IMX500 智能视觉传感器是边缘 AI 处理领域的一项突破性硬件。它是全球首款具备片上 AI 功能的智能视觉传感器。该传感器有助于克服边缘 AI 面临的诸多挑战,包括数据处理瓶颈、隐私问题和性能限制。 其他传感器只能传输图像和帧,而 IMX500 能呈现完整的场景信息。它直接在传感器上处理数据,使设备能够实时生成洞察。

Sony IMX500 对 YOLO11 模型的导出#

IMX500 旨在改变设备直接在传感器上处理数据的方式,无需将数据发送到云端进行处理。

IMX500 支持量化模型。量化可以缩小模型并提高速度,同时不会明显降低精度。它非常适合资源有限的边缘计算环境,可通过降低延迟并支持本地快速处理数据,让应用迅速响应,而不依赖云端。本地处理也能保护用户数据的隐私和安全,因为数据不会发送到远程服务器。

IMX500 的主要特性:

  • 元数据输出:IMX500 不仅可以传输图像,还可以同时输出图像和元数据(推理结果);也可以仅输出元数据,以尽量减小数据量、降低带宽占用和成本。
  • 解决隐私问题:IMX500 在设备上处理数据,有助于解决隐私问题,非常适合人数统计和占用情况跟踪等以人为中心的应用。
  • 实时处理:快速的传感器端处理支持实时决策,非常适合自动化系统等边缘 AI 应用。

开始之前:为获得最佳效果,请按照我们的模型训练指南、数据准备指南和超参数调优指南,确保 YOLO11 模型已为导出做好充分准备。

支持的任务#

IMX500 导出支持 Ultralytics 七种任务中的四种,且仅适用于 YOLOv8n 和 YOLO11n:不支持其他模型系列、尺寸和架构;导出语义分割、OBB 或深度估计模型会引发错误。

任务YOLOv8YOLO11YOLO26
检测✅✅❌
分割✅✅❌
语义分割❌❌❌
深度估计❌❌❌
分类✅✅❌
姿态✅✅❌
OBB❌❌❌

使用示例#

将 Ultralytics YOLO11 模型导出为 IMX500 格式,并使用导出的模型运行推理。

IMX500 格式支持导出、预测和验证模式。推理和验证在 Raspberry Pi AI 摄像头(IMX500)上运行。

注意

这里执行推理只是为了确认模型能按预期工作。不过,如需在 Raspberry Pi AI 摄像头上部署和运行推理,请跳转到在部署中使用 IMX500 导出部分。

目标检测
from ultralytics import YOLO

# 加载 YOLO11n PyTorch 模型
model = YOLO("yolo11n.pt")

# 导出模型
model.export(format="imx", data="coco8.yaml")  # 默认使用 PTQ 量化进行导出

# 加载导出的模型
imx_model = YOLO("yolo11n_imx_model")

# 运行推理
results = imx_model("https://ultralytics.com/images/bus.jpg")
姿势估计
from ultralytics import YOLO

# 加载 YOLO11n-pose PyTorch 模型
model = YOLO("yolo11n-pose.pt")

# 导出模型
model.export(format="imx", data="coco8-pose.yaml")  # 默认使用 PTQ 量化进行导出

# 加载导出的模型
imx_model = YOLO("yolo11n-pose_imx_model")

# 运行推理
results = imx_model("https://ultralytics.com/images/bus.jpg")
分类
from ultralytics import YOLO

# 加载 YOLO11n-cls PyTorch 模型
model = YOLO("yolo11n-cls.pt")

# 导出模型
model.export(format="imx", data="imagenet10")  # 默认使用 PTQ 量化进行导出

# 加载导出的模型
imx_model = YOLO("yolo11n-cls_imx_model")

# 运行推理
results = imx_model("https://ultralytics.com/images/bus.jpg", imgsz=224)
实例分割
from ultralytics import YOLO

# 加载 YOLO11n-seg PyTorch 模型
model = YOLO("yolo11n-seg.pt")

# 导出模型
model.export(format="imx", data="coco8-seg.yaml")  # 默认使用 PTQ 量化进行导出

# 加载导出的模型
imx_model = YOLO("yolo11n-seg_imx_model")

# 运行推理
results = imx_model("https://ultralytics.com/images/bus.jpg")
验证
from ultralytics import YOLO

# 加载导出的 IMX500 模型
model = YOLO("yolo11n_imx_model")

# 在 COCO8 数据集上验证准确率
metrics = model.val(data="coco8.yaml")
警告

IMX 导出仅支持在 Linux 上运行,要求 Python 3.9 或更高版本,并且需要 Java 17 或更高版本。Ultralytics 包会在运行时安装其他导出依赖项。首次运行导出命令时,你可能需要重启控制台,以确保命令正常运行。

导出参数#

参数类型默认值说明
formatstr'imx'导出模型的目标格式,用于定义与各种部署环境的兼容性。
imgszint 或 tuple640模型输入所需的图像尺寸。正方形图像可使用整数;若要指定具体尺寸,则可使用元组 (height, width)。
quantizeint 或 str8/自动量化精度。IMX500 要求使用 8 (INT8/PTQ),并会自动启用。不支持仅使用 FP32 或 FP16 导出。此设置取代已弃用的 half/int8 标志。
datastrNone数据集 YAML 文件的路径,是量化所必需的;分类任务则需要数据集目录或内置数据集名称。如果未指定,Ultralytics 会根据模型任务选择默认校准数据集。
fractionfloat、int 或 list1.0校准子集,可按比例、图像数量或 [train, val, test] 比例/数量指定。包含两个项目的列表会让 test 保持完整,而 0 会跳过它。
nmsbool,可选None选择原始输出(None,默认)、嵌入式 NMS(True)或无 NMS 检测头(False)。对于检测、分割和姿态任务,IMX 要求使用 nms=True,并会自动选择该选项。
devicestrNone指定导出设备:GPU(device=0)、CPU(device=cpu)。
提示

如果你在支持 CUDA 的 GPU 上进行导出,请传入参数 device=0,以加快导出速度。

有关导出流程的更多详情,请访问 Ultralytics 导出文档页面。

导出过程会生成一个用于量化验证的 ONNX 模型,以及一个名为 <model-name>_imx_model 的目录。该目录将包含 packerOut.zip 文件,这是将模型打包并部署到 IMX500 硬件所必需的。此外,<model-name>_imx_model 文件夹中会包含一个文本文件(labels.txt),其中列出了与模型关联的所有标签。

文件夹结构
yolo11n_imx_model
├── dnnParams.xml
├── labels.txt
├── packerOut.zip
├── model_imx.onnx
├── model_imx_MemoryReport.json
└── model_imx.pbtxt

在部署中使用 IMX500 导出#

将 Ultralytics YOLO11n 模型导出为 IMX500 格式后,即可将其部署到 Raspberry Pi AI 摄像头上进行推理。

硬件前提条件#

请确保你拥有以下硬件:

  1. Raspberry Pi 5 或 Raspberry Pi 4 Model B
  2. Raspberry Pi AI Camera

将 Raspberry Pi AI 摄像头连接到 Raspberry Pi 的 15 针 MIPI CSI 接口,然后启动 Raspberry Pi

软件前提条件#

注意

本指南已在 Raspberry Pi 5 上运行的 Raspberry Pi OS Bookworm 中完成测试

步骤 1:打开终端窗口,执行以下命令,将 Raspberry Pi 软件更新到最新版本。

sudo apt update && sudo apt full-upgrade

步骤 2:安装运行 IMX500 传感器所需的 IMX500 固件。

sudo apt install imx500-all

步骤 3:重启 Raspberry Pi,使更改生效

sudo reboot

步骤 4:安装 Aitrios Raspberry Pi 应用模块库

pip install git+https://github.com/SonySemiconductorSolutions/aitrios-rpi-application-module-library.git

步骤 5:使用以下脚本运行 YOLO11 目标检测、姿态估计、分类和分割。这些脚本位于 aitrios-rpi-application-module-library 示例中。

注意

运行这些脚本之前,请根据你的环境替换 model_file 和 labels.txt 目录。

Python 脚本
import numpy as np
from modlib.apps import Annotator
from modlib.devices import AiCamera
from modlib.models import COLOR_FORMAT, MODEL_TYPE, Model
from modlib.models.post_processors import pp_od_yolo_ultralytics

class YOLO(Model):
    """YOLO model for IMX500 deployment."""

    def __init__(self):
        """Initialize the YOLO model for IMX500 deployment."""
        super().__init__(
            model_file="yolo11n_imx_model/packerOut.zip",  # replace with proper directory
            model_type=MODEL_TYPE.CONVERTED,
            color_format=COLOR_FORMAT.RGB,
            preserve_aspect_ratio=False,
        )

        self.labels = np.genfromtxt(
            "yolo11n_imx_model/labels.txt",  # replace with proper directory
            dtype=str,
            delimiter="\n",
        )

    def post_process(self, output_tensors):
        """Post-process the output tensors for object detection."""
        return pp_od_yolo_ultralytics(output_tensors)

device = AiCamera(frame_rate=16)  # Optimal frame rate for maximum FPS of the YOLO model running on the AI Camera
model = YOLO()
device.deploy(model)

annotator = Annotator()

with device as stream:
    for frame in stream:
        detections = frame.detections[frame.detections.confidence > 0.55]
        labels = [f"{model.labels[class_id]}: {score:0.2f}" for _, score, class_id, _ in detections]

        annotator.annotate_boxes(frame, detections, labels=labels, alpha=0.3, corner_radius=10)
        frame.display()

基准测试#

以下 YOLOv8n、YOLO11n、YOLOv8n-pose、YOLO11n-pose、YOLOv8n-cls 和 YOLO11n-cls 基准测试由 Ultralytics 团队在 Raspberry Pi AI 摄像头上使用 imx 模型格式运行,测量速度和精度。

模型格式尺寸(像素)packerOut.zip 的大小(MB)mAP50-95(B)推理时间 (ms/im)
YOLOv8nimx6402.10.47058.79
YOLO11nimx6402.20.51758.82
YOLOv8n-poseimx6402.00.68758.79
YOLO11n-poseimx6402.10.78862.50
模型格式尺寸(像素)packerOut.zip 的大小(MB)准确率 (top1)准确率 (top5)推理时间 (ms/im)
YOLOv8n-clsimx2242.30.250.533.31
YOLO11n-clsimx2242.30.250.41733.31
注意

上述基准测试使用 COCO128 数据集验证检测模型,使用 COCO8-Pose 数据集验证姿态估计模型,并使用 ImageNet10 验证分类模型。

底层原理#

Sony IMX500 YOLO model deployment workflow

Sony 模型压缩工具包 (MCT)#

Sony 的模型压缩工具包(MCT)是一款功能强大的工具,可通过量化和剪枝优化深度学习模型。它支持多种量化方法,并提供高级算法,在不显著牺牲精度的情况下降低模型大小和计算复杂度。MCT 特别适合在资源受限的设备上部署模型,可确保高效推理并降低延迟。

MCT 支持的功能#

Sony 的 MCT 提供了一系列旨在优化神经网络模型的功能:

  1. 计算图优化:将批归一化等层折叠到前置层中,从而将模型转换为更高效的版本。
  2. 量化参数搜索:使用均方误差、无裁剪和平均绝对误差等指标,将量化噪声降至最低。
  3. 高级量化算法:
    • 负向偏移校正:解决对称激活量化导致的性能问题。
    • 离群值过滤:使用 z 分数检测并移除离群值。
    • 聚类:利用非均匀量化网格,更好地匹配分布。
    • 混合精度搜索:根据敏感度为每一层分配不同的量化位宽。
  4. 可视化:使用 TensorBoard 查看模型性能洞察、量化阶段和位宽配置。

量化#

MCT 支持多种量化方法,可缩小模型并提升推理速度:

  1. 训练后量化(PTQ):
    • 可通过 Keras 和 PyTorch API 使用。
    • 复杂度:低
    • 计算成本:低(CPU 分钟级)
  2. 基于梯度的训练后量化(GPTQ):
    • 可通过 Keras 和 PyTorch API 使用。
    • 复杂度:中
    • 计算成本:中等(2-3 GPU 小时)
  3. 量化感知训练(QAT):
    • 复杂度:高
    • 计算成本:高(12-36 GPU 小时)

MCT 还支持对权重和激活使用多种量化方案:

  1. 二的幂次(适合硬件)
  2. 对称
  3. 均匀

结构化剪枝#

MCT 引入了针对特定硬件架构设计的结构化、硬件感知模型剪枝技术。该技术通过剪除 SIMD 组,利用目标平台的单指令多数据(SIMD)能力。这样可以缩小模型并降低复杂度,同时优化通道利用率,使其与 SIMD 架构相匹配,从而有针对性地利用权重内存占用。可通过 Keras 和 PyTorch API 使用。

IMX500 转换工具(编译器)#

IMX500 转换工具是 IMX500 工具集的重要组成部分,可将模型编译为适用于 Sony IMX500 传感器(例如 Raspberry Pi AI Camera)的部署版本。该工具可帮助将经 Ultralytics 软件处理的 Ultralytics YOLO11 模型转换为兼容指定硬件且运行高效的模型。模型量化后的导出流程会生成包含必要数据和设备专属配置的二进制文件,从而简化在 Raspberry Pi AI Camera 上的部署过程。

实际应用场景#

导出为 IMX500 格式适用于多个行业。以下是一些示例:

  • 边缘 AI 和物联网:在无人机或安防摄像头上实现目标检测,这类场景需要在低功耗设备上进行实时处理。
  • 可穿戴设备:在健康监测可穿戴设备上部署针对小规模 AI 处理进行优化的模型。
  • 智慧城市:使用导出为 IMX500 格式的 YOLO11 模型进行交通监控和安全分析,实现更快的处理速度和更低的延迟。
  • 零售分析:在销售点系统或智能货架中部署优化后的模型,提升店内监控能力。

结论#

将 Ultralytics YOLO11 模型导出为 Sony 的 IMX500 格式后,你就可以在基于 IMX500 的摄像头上部署模型,实现高效推理。借助先进的量化技术,你可以缩小模型并提升推理速度,同时不会显著影响精度。

如需了解更多信息和详细指南,请参阅 Sony 的 IMX500 网站。

常见问题#

  • 要将 YOLO11 模型导出为 IMX500 格式,请使用 Python API 或 CLI 命令:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n.pt")
    model.export(format="imx")  # 默认使用 PTQ 量化导出

    导出过程会创建一个目录,其中包含部署所需的文件,包括 packerOut.zip。

  • IMX500 格式为边缘部署提供了多项重要优势:

    • 芯片上的 AI 处理可降低延迟和功耗
    • 同时输出图像和元数据(推理结果),而不只是图像
    • 在本地处理数据,无需依赖云端,从而增强隐私保护
    • 具备实时处理能力,适合对时效性要求高的应用
    • 经过优化的量化方式,可在资源受限的设备上高效部署模型
  • 要部署 IMX500 模型,你需要:

    硬件:

    • Raspberry Pi 5 或 Raspberry Pi 4 Model B
    • 配备 IMX500 传感器的 Raspberry Pi AI Camera

    软件:

    • Raspberry Pi OS Bookworm
    • IMX500 固件和工具(sudo apt install imx500-all)
  • 根据 Ultralytics 在 Raspberry Pi AI Camera 上进行的基准测试:

    • YOLO11n 单张图像推理耗时为 58.82ms
    • 在 COCO128 数据集上的 mAP50-95 为 0.517
    • 量化后模型大小仅为 2.2MB

    这表明 IMX500 格式能够实现高效的实时推理,同时为边缘 AI 应用保持良好的精度。

评论