用于 Ultralytics YOLO11 的 Sony IMX500 导出
本指南涵盖了如何将 Ultralytics YOLO11 模型导出并部署到配备 Sony IMX500 传感器的 Raspberry Pi AI Camera 上。
在计算能力有限的设备(例如 Raspberry Pi AI Camera)上部署计算机视觉模型可能比较棘手。使用针对更快性能优化的模型格式会带来巨大的差异。
IMX500 模型格式旨在以极低的功耗为神经网络提供高性能。它允许你优化 Ultralytics YOLO11 模型,以实现高速和低功耗推理。在本指南中,我们将指导你如何导出模型并将其部署为 IMX500 格式,同时让你更容易地在 Raspberry Pi AI Camera 上运行模型。
为什么要导出到 IMX500?
Sony 的 IMX500 智能视觉传感器 是边缘 AI 处理领域的一项颠覆性硬件技术。它是世界上第一个具备片上 AI 功能的智能视觉传感器。该传感器有助于克服边缘 AI 中的许多挑战,包括数据处理瓶颈、隐私问题和性能限制。 当其他传感器仅传递图像和帧时,IMX500 能传递完整的信息。它直接在传感器上处理数据,使设备能够实时生成洞察。
用于 YOLO11 模型的 Sony IMX500 导出
IMX500 旨在改变设备处理数据的方式,使其能够直接在传感器上处理,而无需将其发送到云端进行处理。
IMX500 适用于量化模型。量化可以在不损失太多 精度 的前提下,使模型更小、更快。它非常适合边缘计算的有限资源,通过减少延迟和允许在本地进行快速数据处理(无需依赖云端)来帮助应用程序快速响应。本地处理还能保持用户数据的私密性和安全性,因为数据不会发送到远程服务器。
IMX500 主要特性:
- 元数据输出: IMX500 不仅仅传输图像,还可以同时输出图像和元数据(推理结果),甚至仅输出元数据,从而最小化数据大小、减少带宽并降低成本。
- 解决隐私问题: 通过在设备上处理数据,IMX500 解决了隐私问题,非常适合以人为中心的应用程序,如人员统计和占用情况监测。
- 实时处理: 快速的传感器端处理支持实时决策,非常适合边缘 AI 应用程序,例如自动驾驶系统。
开始之前: 为获得最佳结果,请按照我们的 模型训练指南、数据准备指南 和 超参数调优指南 为模型导出做好充分准备。
支持的任务
目前,你只能将包含以下任务的模型导出为 IMX500 格式。
IMX 导出专为 YOLOv8n 和 YOLO11n (nano) 设计并进行了基准测试。不支持其他架构和模型规模。
使用示例
将 Ultralytics YOLO11 模型导出为 IMX500 格式,并使用导出的模型运行推理。
在这里我们执行推理只是为了确保模型能按预期工作。但是,对于在 Raspberry Pi AI Camera 上的部署和推理,请直接跳至 在部署中使用 IMX500 导出 部分。
from ultralytics import YOLO
# Load a YOLO11n PyTorch model
model = YOLO("yolo11n.pt")
# Export the model
model.export(format="imx", data="coco8.yaml") # exports with PTQ quantization by default
# Load the exported model
imx_model = YOLO("yolo11n_imx_model")
# Run inference
results = imx_model("https://ultralytics.com/images/bus.jpg") from ultralytics import YOLO
# Load a YOLO11n-pose PyTorch model
model = YOLO("yolo11n-pose.pt")
# Export the model
model.export(format="imx", data="coco8-pose.yaml") # exports with PTQ quantization by default
# Load the exported model
imx_model = YOLO("yolo11n-pose_imx_model")
# Run inference
results = imx_model("https://ultralytics.com/images/bus.jpg") from ultralytics import YOLO
# Load a YOLO11n-cls PyTorch model
model = YOLO("yolo11n-cls.pt")
# Export the model
model.export(format="imx", data="imagenet10") # exports with PTQ quantization by default
# Load the exported model
imx_model = YOLO("yolo11n-cls_imx_model")
# Run inference
results = imx_model("https://ultralytics.com/images/bus.jpg", imgsz=224) from ultralytics import YOLO
# Load a YOLO11n-seg PyTorch model
model = YOLO("yolo11n-seg.pt")
# Export the model
model.export(format="imx", data="coco8-seg.yaml") # exports with PTQ quantization by default
# Load the exported model
imx_model = YOLO("yolo11n-seg_imx_model")
# Run inference
results = imx_model("https://ultralytics.com/images/bus.jpg")Ultralytics 包会在运行时安装额外的导出依赖项。第一次运行导出命令时,你可能需要重启控制台以确保其正常工作。
导出参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
format | str | 'imx' | 导出模型的目标格式,定义与各种部署环境的兼容性。 |
imgsz | int 或 tuple | 640 | 模型输入的所需图像尺寸。可以是正方形图像的整数,也可以是特定维度的元组 (height, width)。 |
int8 | bool | True | 激活 INT8 量化,进一步压缩模型并以极小的准确性损失加快推理速度,主要适用于边缘设备。 |
data | str | 'coco8.yaml' | 数据集配置文件的路径(默认:coco8.yaml),这对量化至关重要。 |
fraction | float | 1.0 | 指定用于 INT8 量化校准的数据集比例。允许在完整数据集的子集上进行校准,这对于实验或资源受限时非常有用。如果在启用 INT8 时未指定,将使用完整数据集。 |
nms | bool | False | 将非极大值抑制 (NMS) 添加到导出的模型中。当设置为 True 时,也支持 conf、iou 和 agnostic_nms 参数。 |
device | str | None | 指定导出时使用的设备: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 Camera 上进行推理。
硬件前提条件
请确保你拥有以下硬件:
- Raspberry Pi 5 或 Raspberry Pi 4 Model B
- Raspberry Pi AI Camera
将 Raspberry Pi AI Camera 连接到 Raspberry Pi 上的 15 针 MIPI CSI 接口,然后为 Raspberry Pi 通电
软件前提条件
本指南已在运行 Raspberry Pi OS Bookworm 的 Raspberry Pi 5 上进行测试
第 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 步:使用 aitrios-rpi-application-module-library 示例 中提供的以下脚本,运行 YOLO11 对象检测、姿态估计、分类和分割任务。
在运行这些脚本之前,请确保根据你的环境替换 model_file 和 labels.txt 目录。
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 DPS 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 Camera 上使用 imx 模型格式进行,并测量了速度和精度。
| 模型 | 格式 | 尺寸(像素) | packerOut.zip 的大小 (MB) | mAP50-95(B) | 推理时间 (ms/im) |
|---|---|---|---|---|---|
| YOLOv8n | imx | 640 | 2.1 | 0.470 | 58.79 |
| YOLO11n | imx | 640 | 2.2 | 0.517 | 58.82 |
| YOLOv8n-pose | imx | 640 | 2.0 | 0.687 | 58.79 |
| YOLO11n-pose | imx | 640 | 2.1 | 0.788 | 62.50 |
| 模型 | 格式 | 尺寸(像素) | packerOut.zip 的大小 (MB) | acc (top1) | acc (top5) | 推理时间 (ms/im) |
|---|---|---|---|---|---|---|
| YOLOv8n-cls | imx | 224 | 2.3 | 0.25 | 0.5 | 33.31 |
| YOLO11n-cls | imx | 224 | 2.3 | 0.25 | 0.417 | 33.31 |
上述基准测试的验证使用的是检测模型的 COCO128 数据集、姿态估计模型的 COCO8-Pose 数据集以及分类模型的 ImageNet10 数据集。
幕后工作原理?
Sony 模型压缩工具包 (MCT)
Sony 的模型压缩工具包 (MCT) 是一个通过量化和剪枝来优化深度学习模型的强大工具。它支持多种量化方法,并提供先进的算法来在不显著损失精度的情况下减小模型大小和计算复杂度。MCT 对于在资源受限的设备上部署模型特别有用,可确保高效的推理和降低延迟。
MCT 支持的特性
Sony 的 MCT 提供了一系列旨在优化神经网络模型的功能:
- 图优化:通过将批归一化 (batch normalization) 等层合并到前置层中,将模型转换为更高效的版本。
- 量化参数搜索:使用均方误差 (Mean-Square-Error)、无裁剪 (No-Clipping) 和平均绝对误差 (Mean-Average-Error) 等指标最小化量化噪声。
- 高级量化算法:
- 负值偏移修正:解决对称激活量化导致的性能问题。
- 异常值过滤:使用 Z 分数检测并移除异常值。
- 聚类:利用非均匀量化网格以获得更好的分布匹配。
- 混合精度搜索:根据灵敏度为每一层分配不同的量化位宽。
- 可视化:使用 TensorBoard 观察模型性能洞察、量化阶段和位宽配置。
量化
MCT 支持多种量化方法以减小模型大小并提高推理速度:
- 训练后量化 (PTQ):
- 可通过 Keras 和 PyTorch API 获取。
- 复杂度:低
- 计算成本:低(CPU 分钟数)
- 基于梯度的训练后量化 (GPTQ):
- 可通过 Keras 和 PyTorch API 获取。
- 复杂度:中
- 计算成本:中等(2-3 个 GPU 小时)
- 量化感知训练 (QAT):
- 复杂度:高
- 计算成本:高(12-36 个 GPU 小时)
MCT 还支持针对权重和激活的各种量化方案:
- 2 的幂次 (硬件友好)
- 对称
- 均匀
结构化剪枝
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 网站。
常见问题 (FAQ)
如何将 YOLO11 模型导出为适用于 Raspberry Pi AI Camera 的 IMX500 格式?
要将 YOLO11 模型导出为 IMX500 格式,请使用 Python API 或 CLI 命令:
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model.export(format="imx") # Exports with PTQ quantization by default导出过程将创建一个目录,其中包含部署所需的文件,包括 packerOut.zip。
使用 IMX500 格式进行边缘 AI 部署有哪些主要好处?
IMX500 格式为边缘部署提供了几个重要优势:
- 片上 AI 处理可降低延迟和功耗
- 同时输出图像和元数据(推理结果),而不仅仅是图像
- 通过在本地处理数据而不依赖云端,增强了隐私保护
- 实时处理能力非常适合对时间敏感的应用
- 针对资源受限设备进行优化的量化,实现高效模型部署
IMX500 部署需要哪些硬件和软件先决条件?
部署 IMX500 模型时,你需要:
硬件:
- Raspberry Pi 5 或 Raspberry Pi 4 Model B
- 带有 IMX500 传感器的 Raspberry Pi AI Camera
软件:
- Raspberry Pi OS Bookworm
- IMX500 固件和工具 (
sudo apt install imx500-all)
我能期望 YOLO11 模型在 IMX500 上达到什么样的性能?
根据 Ultralytics 在 Raspberry Pi AI Camera 上的基准测试:
- YOLO11n 可实现每张图像 62.50ms 的推理时间
- 在 COCO128 数据集上的 mAP50-95 为 0.492
- 量化后模型大小仅为 3.2MB
这表明 IMX500 格式在为边缘 AI 应用保持良好精度的同时,提供了高效的实时推理能力。