YOLO Vision 2026:

适用于 Ultralytics YOLO 模型的 Ambarella CVflow 导出#

Ambarella SoC 上部署 Ultralytics YOLO 模型需要使用 Ambarella 的编译工具进行模型针对 CVflow 架构优化的模型在推理时性能更佳。此 Ultralytics 分支将 Ambarella 的 SpongeTorch 压缩工具包直接集成到训练、验证和导出流程中,使开发者能够生成用于在 Ambarella 硬件上高效部署的优化模型。

本指南涵盖当前的目标检测部署工作流,从压缩感知训练到设备端推理(完整流程请参见工作流概览)。

AmbaPB 检查点格式是 ONNX IR 规范的 Ambarella 专用扩展,它支持 CVflow 计算基元并打包了 SDK 工具生成的工件。它是用于在部署前验证编译模型准确性的主机端工件;为目标设备生成的独立 Cavalry 二进制文件才是真正在板端运行的文件。

注意

此工作流依赖于未在 PyPI 上提供的专有 Ambarella SDK 组件。要获取所需的 SDK 软件包,请在开发者专区注册并通过 Cooper™ 开发者平台申请访问权限。

支持

此集成由 Ambarella 维护。有关该分支、SpongeTorch 或 SDK 的问题,请向 Ambarella 支持报告。

什么是 Ambarella?#

Ambarella 总部位于加利福尼亚州圣克拉拉,是一家设计边缘 AI SoC 的半导体公司。其处理器结合了图像信号处理、视频编码和片上 AI 计算,广泛应用于安防、汽车、机器人、工业和消费类设备中。

什么是 CVflow?#

CVflow 是 Ambarella 的视觉处理架构。它使用独立于 CPU 和 GPU 的专用视觉引擎来运行计算机视觉和神经网络工作负载。在诸如 PyTorch 等框架中训练的模型在引擎上运行之前,需使用 Ambarella SDK 编译为 CVflow 的本地格式。

当前的 CVflow SoC 系列及其典型应用:

SoC 系列典型应用
CV72 / CV754K AI 安防摄像头、智能摄像头、工业视觉
CV5 / CV52无人机、运动相机、机器人、多摄像头系统
N1-655本地部署式生成式 AI 和多路视频分析设备

为什么要在 Ambarella 上部署 YOLO?#

  • 每瓦性能:CVflow SoC 专为全天候运行的边缘 AI 而设计,能够在摄像头级功耗预算内运行实时目标检测
  • 压缩感知训练:SpongeTorch 在训练期间应用剪枝,帮助模型在保持准确性的同时变得更稀疏、更高效,从而适应 CVflow 部署。
  • 集成相机流水线:Ambarella SoC 结合了图像信号处理器(ISP)、超高清视频编码和 CVflow,以低功耗支持各种相机系统,因此单个 Ambarella SoC 即可处理完整的 AI 相机流水线。

工作流概览#

该流水线分为六个阶段:

  1. 压缩感知训练 — 使用 SpongeKit 配置(amba_config)进行训练,使 SpongeTorch 在训练期间逐步应用非结构化剪枝。在后训练量化(PTQ)准确性无法满足要求的情况下,SpongeTorch 还支持量化感知训练(QAT),但该路径尚未接入当前的 Ultralytics 集成中,计划在未来的版本中推出。
  2. ONNX 导出 — 使用相同的 amba_config 导出压缩后的检查点,在 ONNX 图中保留压缩结构。
  3. 编译 — 使用 SDK 编译工具将 ONNX 模型编译为 AmbaPB 检查点,这些工具会为 CVflow 引擎应用后训练量化(PTQ)。
  4. 主机验证 — 通过 AmbaPB 后端运行编译后的 *.ambapb.ckpt.onnx 模型,并使用 Ultralytics 的 predict/val 在部署前验证准确性。
  5. Cavalry 转换 — 使用 SDK 工具将验证后的 AmbaPB 检查点转换为 Cavalry 二进制文件。
  6. 在设备上运行 — 使用 Ambarella 的 SDK 运行时库在设备上运行 Cavalry 二进制文件。

SpongeTorch 训练和导出工作流是可选的,可以替换为纯 ONNX 导出(请参阅在没有 SpongeTorch 的情况下导出)。

前置条件#

安装#

安装此 Ultralytics 分支,然后设置 Ambarella CVflow SDK(其中包含编译工具和 cvflowbackend 库),并安装与其一同分发的 spongetorch wheel:

安装
# Install this Ultralytics fork from source
git clone https://github.com/Ambarella-Inc/ultralytics
cd ultralytics
git checkout amba_v8.4.46
pip install -e .

# Access and set up the Ambarella SDK compilation tools
# After the environment is ready, install the spongetorch library
pip install /path/to/spongetorch-*.whl

AutoBackend 通过 SDK 编译工具的 tv2 命令(tv2 -libpath cvflowbackend)来定位 cvflowbackend,因此在运行使用编译模型的推理或验证之前,必须安装 SDK 编译工具并将其添加到您的 PATH 中。

SpongeKit 配置文件#

SpongeTorch 由 SpongeKit 配置文件(protobuf 文本格式,.prototxt)驱动,该文件定义了剪枝轮次、稀疏度目标和压缩时间表。从您的 Ambarella SDK 版本中获取示例配置和匹配的架构文档。为了保持训练、验证和部署之间的一致性,每当验证需要重新准备模型时,请使用训练配置,并且在导出压缩检查点时务必始终使用相同的配置。

Amba 参数#

以下两个参数控制 trainvalexport 模式中的 SpongeTorch 集成:

参数类型默认值描述
amba_configstrNone传递给 spongetorch.prepare() 的 SpongeKit 配置路径。启用压缩感知训练和 SpongeTorch 感知导出。
amba_chipsetstrNone传递给 spongetorch.set_target_chipset() 的目标芯片组名称,例如 CV72

该分支还新增了一个通用导出参数:

参数类型默认值描述
export_filestrNone自定义导出输出路径/名称,例如 '/tmp/model.onnx''model.onnx'

压缩感知训练#

启用 SpongeTorch 压缩,训练(或微调)你的模型:

使用方法
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="coco8.yaml",
    epochs=100,
    amba_config="config.prototxt",
    amba_chipset="CV72",
)

设置 amba_config 后,训练器会在设置时使用 spongetorch.prepare() 包装模型和优化器。压缩按步数计划逐步应用,因此网络在变得稀疏的同时能够学会保持准确性。训练好的检查点存储了 SpongeTorch 的稀疏状态(_orig/_mask 张量),后续的导出步骤需要用到这些张量。配置文件会作为 amba_config.prototxt 复制到运行目录中,以确保可重复性。

检查点门控

在 SpongeTorch 压缩计划超过其 end_step 之前,best.ptlast.pt 会被有意不保存——半压缩检查点无法使用。确保 epochs 足够长,以便配置中的计划完成;日志会报告何时开始保存检查点。如果训练在计划完成前结束,最终 epoch 仍会在警告下保存,但不应部署此类检查点。

使用微调,而不是从头训练

为了获得最佳准确率,先正常训练你的模型(或从预训练检查点开始),然后在训练好的权重上使用 amba_config 进行较短的压缩微调。

验证压缩检查点#

使用相同配置,在编译前验证准确率:

使用方法
yolo val model=runs/detect/train/weights/best.pt data=coco8.yaml \
  amba_config=config.prototxt amba_chipset=CV72

验证器会在需要时重新应用 spongetorch.prepare(),并禁用 Conv+BN 融合,以保留压缩结构。将 mAP 与未压缩基线进行比较;如果准确率下降过大,请调整 SpongeKit 配置并重新训练。

导出为 ONNX#

使用训练期间使用的相同 amba_config 导出压缩检查点:

使用方法
from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")
model.export(
    format="onnx",
    amba_config="config.prototxt",
    amba_chipset="CV72",
)

导出器重建模型,使用您的配置重新应用 spongetorch.prepare(),将稀疏检查点权重重新加载到准备好的结构中,并在禁用 Conv+BN 融合的情况下追踪到 ONNX,从而生成 SDK 编译工具期望的精确格式的图。

保留模型元数据#

ONNX 导出将模型任务、类名、步幅和输入大小嵌入到 ONNX 文件中,而 AmbaPB 后端则从编译模型旁边的 metadata.yaml 附带文件中读取此信息。除非您的 SDK 编译工具创建了此附带文件,否则请在编译前从 ONNX 模型中将其提取出来:

import onnx

from ultralytics.utils import YAML

model = onnx.load("model.onnx")
YAML.save("metadata.yaml", {item.key: item.value for item in model.metadata_props})

metadata.yaml 与编译后的 *.ambapb.ckpt.onnx*.ambapb.fastckpt.onnx 文件放在同一目录中。

警告
  • 检查点必须包含 SpongeTorch 压缩状态。尝试在设置了 amba_config 的情况下导出未压缩的检查点会引发:“检查点没有 SpongeTorch 剪枝状态... 导出前请使用 amba 训练中的压缩检查点。”
  • 该配置必须与训练期间使用的配置相匹配。使用不同的配置可能会导致无法正确加载检查点权重。

使用 SDK 工具进行编译#

按照 SDK 的编译指南,使用 SDK 编译工具为目标芯片组编译导出的 ONNX 模型。这些工具将图映射到 CVflow AI 引擎上(应用后训练量化(PTQ)、调度和内存规划),并生成用于主机验证的 AmbaPB 检查点。

后训练量化(PTQ)使用校准图像应用 INT8 量化(按照 SDK 编译指南中的说明准备),并且编译工具在准确性和运行时延迟之间进行平衡:将更多操作映射到 INT8 可以降低延迟但可能会降低准确性,而将更多操作保留在 FP16 中则可以以较高的延迟保持准确性。当后训练量化(PTQ)无法在延迟预算所需的 INT8 级别达到准确性目标时,使用 SpongeTorch 的量化感知训练(QAT)便是预期的补救措施 — 它训练模型以适应更激进的 INT8 量化,从而在较低延迟的运行点恢复准确性。该集成中尚未提供量化感知训练(QAT),计划在未来的版本中推出。

注意

要让 Ultralytics 识别编译后的模型,其文件名必须以 .ambapb.ckpt.onnx.ambapb.fastckpt.onnx 结尾。

使用编译后的模型运行推理#

编译后的 AmbaPB 模型可直接通过 Ultralytics API 加载 — AutoBackend 检测到 .ambapb 后缀并通过 cvflowbackend 路由推理,从而按模型在 AI 引擎上运行的方式执行模型:

使用方法
from ultralytics import YOLO

model = YOLO("model.ambapb.ckpt.onnx")

# Inference
results = model("https://ultralytics.com/images/bus.jpg")

# Validation
metrics = model.val(data="coco8.yaml")

这是部署到硬件前的最终准确率检查,其中包括编译器的全部量化影响。如果编译模型旁边存在 metadata.yaml 文件,后端会从中读取类别名称、步幅和任务信息。后端默认使用 CVflow 推理模式 acinf;将环境变量 ULTRALYTICS_AMBAPB_DEBUG=1 设置为日志记录输入/输出详情,以便调试。

转换为 Cavalry 二进制文件#

在 AmbaPB 检查点通过主机验证后,按照 SDK 的编译指南,使用 SDK 编译工具将其转换为用于目标设备的 Cavalry 二进制文件。Cavalry 二进制文件是 SDK 运行时库在板端执行的形式。

部署到开发板#

使用 Ambarella SDK 运行时在您的 Ambarella 设备上加载 Cavalry 二进制文件。预处理和后处理必须与检测模型的编译目标相匹配:0–255 范围内的加黑边 RGB 输入,以及输出上的标准 YOLO 检测解码。有关运行时 API,请参考 SDK 部署文档。

不使用 SpongeTorch 导出#

如果您不需要 SpongeTorch 的训练时剪枝,标准的 Ultralytics 管道也会生成一个 SDK 工具可以编译的模型:

使用方法
yolo export model=yolo26n.pt format=onnx

使用 SDK 编译工具编译生成的 ONNX,这些工具本身会执行后训练量化。此路径以牺牲一些运行时性能和量化准确性为代价,换取了更简单的工作流,在训练时没有 spongetorch 依赖项。

实际应用#

运行在 Ambarella CVflow SoC 上的 Ultralytics YOLO 模型为边缘端全天候视觉提供支持:

  • AI 安防摄像头:在 4K IP 摄像头上进行实时人员和车辆检测,功耗预算低于 3 W。
  • 无人机和机器人:在 CV5 级别芯片上为导航、巡检和配送提供板载目标检测与跟踪。
  • 工业和零售分析:在边缘设备上进行多路人员计数、PPE 检测和货架监控。

总结#

本指南概述了在 Ambarella CVflow SoC 上部署 Ultralytics YOLO 模型当前的工作流:使用 SpongeTorch(amba_config/amba_chipset)进行压缩感知训练、导出压缩检查点的 ONNX、使用 SDK 工具离线编译为 AmbaPB 检查点、通过 Ultralytics 进行主机验证,以及转换为 Cavalry 二进制文件以便使用 Ambarella SDK 进行设备端部署。

有关其他边缘 AI 目标,请参阅相关的 HailoRockchip RKNNSony IMX500Qualcomm QNNDEEPXAxelera 指南。完整的导出格式列表请参阅导出模式文档和集成页面

常见问题#

  • 没有。没有 format="ambarella" 目标。导出为 ONNX(可选择通过 amba_config 进行 SpongeTorch 压缩),然后使用 Ambarella SDK 编译工具将 ONNX 模型离线编译为 AmbaPB。

  • 您的 SDK 编译工具支持的任何基于 CVflow 的 SoC 都可以作为目标,包括用于 AI 相机的 CV72/CV75 系列以及用于无人机和机器人的 CV5/CV52。amba_chipset 参数用于配置 SpongeTorch 的优化目标;在编译时单独选择匹配的目标。接受的芯片组字符串和可用性取决于安装的 SDK 版本。

  • SpongeTorch 是 Ambarella 的 SpongeKit 模型压缩库(该库也具有 Caffe 和 TensorFlow 变体)的 PyTorch 版本,集成到了 Ultralytics 的 Ambarella 分支中,用于训练时非结构化剪枝(计划在未来的版本中推出量化感知训练)。它是可选的:纯 Ultralytics ONNX 导出也可以使用 SDK 编译工具进行编译,这些工具本身会执行量化,但这会牺牲一些运行时性能和量化准确性。

  • 它们是专有的,不在 PyPI 上。在开发者专区注册以请求 SDK 访问权限;SDK 包含编译工具(带有 cvflowbackend),并且单独分发的 spongetorch wheel 与其一同发布。

  • 在安装了 Ambarella 分支的情况下运行 yolo val model=model.ambapb.ckpt.onnx data=your_data.yaml。AmbaPB 后端会按编译模型在 CVflow AI 引擎上的运行方式执行该模型,因此报告的 mAP 包含了所有的编译器量化效应。

评论