面向 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?#
索尼的 IMX500 Intelligent Vision Sensor 是边缘 AI 处理领域具有变革意义的硬件。它是世界上第一个具有片上 AI 功能的智能视觉传感器。该传感器有助于克服边缘 AI 中的许多挑战,包括数据处理瓶颈、隐私问题和性能限制。 当其他传感器只是简单地传递图像和帧时,IMX500 能够讲述完整的故事。它直接在传感器上处理数据,使设备能够实时生成洞察。
用于 YOLO11 模型的 Sony IMX500 导出#
IMX500 旨在改变设备直接在传感器上处理数据的方式,而无需将其发送到云端进行处理。
IMX500 适用于量化模型。量化使模型更小、更快,而不会损失太多 accuracy。它非常适合边缘计算有限的资源,通过减少延迟使应用程序能够快速响应,并允许在本地进行快速数据处理,而无需依赖云。由于不会发送到远程服务器,本地处理也能确保用户数据的私密性和安全性。
IMX500 关键特性:
- 元数据输出: IMX500 不仅传输图像,还可以同时输出图像和元数据(推理结果),并且可以仅输出元数据以最小化数据大小、减少带宽并降低成本。
- 解决隐私问题: 通过在设备上处理数据,IMX500 解决了隐私问题,非常适合以人为本的应用,如人数统计和占用跟踪。
- 实时处理: 快速的片上处理支持实时决策,非常适合边缘 AI 应用,如自动驾驶系统。
开始之前: 为获得最佳结果,请遵循我们的Model Training Guide、Data Preparation Guide和Hyperparameter Tuning Guide,确保你的 YOLO11 模型为导出做好充分准备。
支持的任务#
IMX500 导出支持 Ultralytics 七项任务中的四项,且仅限 YOLOv8n 和 YOLO11n:不支持其他模型系列、规模和架构,导出语义分割、OBB 或深度估计模型会引发错误。
使用示例#
将 Ultralytics YOLO11 模型导出为 IMX500 格式,并使用导出的模型进行推理。
IMX500 格式支持 Export、Predict 和 Validate 模式。推理和验证在 Raspberry Pi AI Camera (IMX500) 上运行。
这里我们执行推理只是为了确保模型按预期工作。但是,有关在 Raspberry Pi AI Camera 上的部署和推理,请跳转至Using IMX500 Export in Deployment部分。
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") from ultralytics import YOLO
# Load the exported IMX500 model
model = YOLO("yolo11n_imx_model")
# Validate accuracy on the COCO8 dataset
metrics = model.val(data="coco8.yaml")Ultralytics 软件包会在运行时安装额外的导出依赖项。第一次运行导出命令时,你可能需要重启控制台以确保其正常工作。
导出参数#
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
format | str | 'imx' | 导出模型的目标格式,定义了与各种部署环境的兼容性。 |
imgsz | int 或 tuple | 640 | 模型输入的所需图像大小。对于正方形图像可以是整数,或者对于特定尺寸可以是元组 (height, width)。 |
quantize | int 或 str | 8/auto | 量化精度。8 (INT8/PTQ) 为 IMX500 自动启用;"w8a16" 导出带有 FP16 激活的 INT8 权重。不支持 FP32 和仅 FP16 的导出。取代了已废弃的 half/int8 标志。 |
data | str | None | dataset YAML 的路径,对量化至关重要;分类则采用数据集目录或内置数据集名称。如果在 quantize=8 或 'w8a16' 中省略,Ultralytics 将为模型任务选择默认的校准数据集。 |
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 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 application module library
pip install git+https://github.com/SonySemiconductorSolutions/aitrios-rpi-application-module-library.git步骤 5:使用aitrios-rpi-application-module-library examples中提供的以下脚本运行 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 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 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) | 准确率 (top1) | 准确率 (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's Model Compression Toolkit (MCT) 是一个强大的工具,可通过量化和剪枝来优化深度学习模型。它支持各种量化方法,并提供高级算法来减小模型大小和计算复杂度,同时不会显著牺牲精度。MCT 对于在资源受限的设备上部署模型特别有用,可确保高效推理并减少延迟。
MCT 支持的功能#
Sony 的 MCT 提供了一系列旨在优化神经网络模型的功能:
- 图优化:通过将批归一化 (Batch Normalization) 等层折叠到前面的层中,将模型转换为更高效的版本。
- 量化参数搜索:使用均方误差 (Mean-Square-Error)、无剪辑 (No-Clipping) 和平均绝对误差 (Mean-Average-Error) 等指标最小化量化噪声。
- 先进的量化算法:
- 移位负修正:解决对称激活量化带来的性能问题。
- 异常值过滤:使用 z-score 检测并移除异常值。
- 聚类:利用非均匀量化网格以实现更好的分布匹配。
- 混合精度搜索:根据灵敏度为每一层分配不同的量化位宽。
- 可视化:使用 TensorBoard 观察模型性能洞察、量化阶段和位宽配置。
量化#
MCT 支持多种量化方法来减小模型大小并提高推理速度:
- 训练后量化 (PTQ):
- 可通过 Keras 和 PyTorch API 获取。
- 复杂度:低
- 计算成本:低(CPU 分钟级)
- 基于梯度的训练后量化 (GPTQ):
- 可通过 Keras 和 PyTorch API 获取。
- 复杂度:中
- 计算成本:中等(2-3 个 GPU 小时)
- 量化感知训练 (QAT):
- 复杂度:高
- 计算成本:高(12-36 个 GPU 小时)
MCT 还支持多种针对权重和激活的量化方案:
- 2 的幂 (Power-of-Two)(硬件友好型)
- 对称 (Symmetric)
- 均匀 (Uniform)
结构化剪枝#
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 的摄像头上进行高效推理。通过利用先进的量化技术,你可以在不显著牺牲准确性的情况下,减小模型大小并提高推理速度。
有关更多信息和详细指南,请参考索尼的 IMX500 website。
常见问题解答#
要将 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 模型,你需要:
硬件:
- 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 应用良好准确性的同时,提供了高效的实时推理能力。