Ambarella CVflow 导出适用于 Ultralytics YOLO 模型#
本指南为早期预览版,尚未完成,也未经 Ambarella 验证。随着供应商反馈的不断完善,命令、兼容性细节和工作流步骤可能会有所更改。目前没有 format="ambarella" 导出目标;该工作流将标准 ONNX 导出(format="onnx")与 amba_config/amba_chipset 参数相结合,然后使用 Ambarella 的 CVflow 工具链离线将生成的 ONNX 模型编译为可部署的 AmbaPB 格式。
在 Ambarella SoC 上部署 Ultralytics YOLO 模型需要针对 CVflow® AI 引擎优化的模型格式。此 Ultralytics 分支将 Ambarella 的 SpongeTorch 压缩工具包直接集成到训练、验证和导出流程中,使你能够生产在 Ambarella 硬件上高效运行的剪枝和量化优化模型。本指南概述了当前的目标检测工作流:感知压缩训练、ONNX 导出、使用 CVflow 工具链编译以及使用编译后的 AmbaPB 模型进行推理。
此工作流需要专有的 Ambarella 工具链组件(spongetorch、CVflow 编译器和 cvflowbackend),这些组件在 PyPI 上不可用。在 Ambarella Developer Zone 上注册,通过 Cooper™ 开发者平台获取 SDK 访问权限。
什么是 Ambarella CVflow?#
Ambarella 是一家总部位于圣克拉拉的半导体公司,以其低功耗 AI 视觉 SoC 而闻名,广泛应用于 IP 安全摄像头、行车记录仪、无人机、机器人和汽车系统。其芯片围绕 CVflow® 构建,这是一个专用的神经向量处理架构(片上 AI 加速器或 NPU),能够在极低功耗下提供高推理吞吐量——CV72S 可在 3 W 以下运行 4K 安全摄像头 AI 工作负载。在部署之前,在 PyTorch 等标准框架中训练的模型会使用 Ambarella 的离线工具链编译为 CVflow 的原生格式。
当前的 CVflow SoC 系列及其典型应用:
| SoC 系列 | 典型应用 |
|---|---|
| CV72 / CV75 | 4K AI 安防摄像头、智能摄像头、工业视觉 |
| CV5 / CV52 | 无人机、运动相机、机器人、多摄像头系统 |
| CV3-AD | 汽车 ADAS 和自动驾驶域控制器 |
| N1 | 本地生成式 AI 和多流视频分析设备 |
为什么要将 YOLO 部署到 Ambarella?#
- 每瓦性能:CVflow SoC 专为全天候边缘 AI 设计,可在相机级功耗预算内运行实时目标检测。
- 感知压缩训练:SpongeTorch 在训练期间应用剪枝和量化感知优化,使模型在保持准确性的同时变得对 NPU 更加友好。
- 位精确的主机验证:编译后的 AmbaPB 模型在你的工作站上通过 Ultralytics
predict/val运行,其执行方式与芯片上的完全相同,因此你可以在接触硬件之前测量量化后的 mAP。 - 集成相机流水线:Ambarella SoC 将 AI 引擎与 ISP 和视频编码器结合在一起,使其成为 AI 摄像头的单芯片解决方案。
工作流程概述#
流水线分为四个阶段:
- 感知压缩训练 — 使用 SpongeKit 配置(
amba_config)进行训练,以便 SpongeTorch 在训练期间逐步应用剪枝/量化。 - ONNX 导出 — 使用相同的
amba_config导出压缩检查点,并在 ONNX 图中保留压缩结构。 - CVflow 编译 — 使用 CVflow 工具链将 ONNX 模型编译为 AmbaPB 工件。
- 推理和验证 — 通过 AmbaPB 后端运行编译后的
*.ambapb.ckpt.onnx模型,经过 Ultralytics 的predict/val,然后部署到板卡上。
如果你不需要 SpongeTorch 的训练时优化,SpongeTorch 训练和 SpongeTorch 感知导出可以替换为普通的 ONNX 导出(请参阅在没有 SpongeTorch 的情况下导出)。
前提条件#
安装#
安装此 Ultralytics 分支,然后从 SDK 分发包中安装 Ambarella 工具链 wheel:
!!! Tip "安装"
# 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 .
# Install Ambarella toolchain wheels from the SDK
pip install /path/to/spongetorch-*.whl
pip install /path/to/cvflowbackend-*.whlAmbaPB 推理后端通过 CVflow 工具链的 tv2 命令(tv2 -libpath cvflowbackend)来定位 cvflowbackend,因此在运行编译模型的推理或验证之前,必须安装该工具链并将其配置在你的 PATH 中。
SpongeKit 配置文件#
SpongeTorch 由 SpongeKit 配置文件(protobuf-text 格式,.prototxt)驱动,该文件定义了要应用的压缩通道:剪枝稀疏度目标、量化设置和压缩计划。从你的 Ambarella SDK 版本获取示例配置和匹配的架构文档。每当验证必须准备未准备好的模型时,都要使用训练配置,并且在导出压缩检查点时始终使用相同的配置。
Amba 参数#
两个参数控制 train、val 和 export 模式下的 SpongeTorch 集成:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
amba_config | str | None | 传递给 spongetorch.prepare() 的 SpongeKit 配置路径。启用感知压缩训练和 SpongeTorch 感知导出。 |
amba_chipset | str | None | 传递给 spongetorch.set_target_chipset() 的目标芯片组名称,例如 CV72。 |
该分支还添加了一个通用导出参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
export_file | str | None | 自定义导出输出路径/名称,例如 '/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.pt 和 last.pt 有意不会保存——半压缩的检查点将无法使用。确保 epochs 足够长,以便完成你配置中的计划;日志会报告检查点何时开始保存。如果训练在计划完成之前结束,最终轮次仍会被保存并附带警告,但此类检查点不应进行部署。
为了获得最佳准确率,请先正常训练模型(或从预训练检查点开始),然后在训练好的权重上使用 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——生成符合 CVflow 编译器期望的精确形式的图。
保留模型元数据#
ONNX 导出将模型任务、类名、步幅和输入大小嵌入到 ONNX 文件中,而 AmbaPB 后端从编译模型旁边的 metadata.yaml 辅助文件中读取此信息。除非你的 CVflow 编译器创建了此辅助文件,否则请在编译前从 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的情况下导出普通检查点会引发:"Checkpoint has no SpongeTorch pruning state... Use a compressed checkpoint from amba training before export." - 配置必须与训练期间使用的配置匹配,否则权重重载会失败。
使用 CVflow 工具链编译#
按照 SDK 的编译指南,使用 SDK 中的 CVflow 编译器为你的目标芯片组编译导出的 ONNX 模型。编译器将图映射到 CVflow AI 引擎上(量化、调度、内存规划),并生成可部署的 AmbaPB 工件。
为了让 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 以记录输入/输出详细信息用于调试。
在开发板上部署#
使用 Ambarella SDK 运行时在你的 Ambarella 设备上加载编译后的模型。预处理和后处理必须与目标检测模型编译时的要求相匹配:0–255 范围内的加黑边 RGB 输入(Ultralytics AmbaPB 后端为编译模型提供 0–255 RGB),以及输出上的标准 YOLO 检测解码。有关运行时 API,请参阅 SDK 部署文档。
在没有 SpongeTorch 的情况下导出#
如果你不需要 SpongeTorch 的训练时剪枝和量化感知优化,标准的 Ultralytics 流水线也可以生成可编译为 CVflow 的模型:
yolo export model=yolo26n.pt format=onnx使用 CVflow 工具链编译生成的 ONNX,该工具链本身执行训练后量化。此路径以牺牲一些 NPU 性能和量化准确率为代价,换取了更简单的工作流,在训练时没有 spongetorch 依赖项。
实际应用场景#
Ambarella CVflow SoC 上的 Ultralytics YOLO 模型为边缘侧的始终在线视觉提供支持:
- AI 安防摄像头:在 3W 以下的功耗预算内,在 4K IP 摄像头上实现实时人员和车辆检测。
- 无人机和机器人:在 CV5 级芯片上进行用于导航、检测和交付的板载目标检测和跟踪。
- 汽车:在 CV3-AD 域控制器上进行诸如行人和车辆检测之类的 ADAS 感知工作负载。
- 工业和零售分析:在边缘设备上进行多流人员计数、PPE 检测和货架监控。
总结#
本预览指南概述了在 Ambarella CVflow SoC 上部署 Ultralytics YOLO 模型当前的工作流:使用 SpongeTorch 进行感知压缩训练(amba_config/amba_chipset)、压缩检查点的 ONNX 导出、使用 CVflow 工具链离线编译为 AmbaPB,以及在板卡部署前通过 Ultralytics 对编译模型进行位精确验证。
有关其他边缘 AI 目标,请参阅相关的 Hailo、Rockchip RKNN、Sony IMX500、Qualcomm QNN、DEEPX 和 Axelera 指南。有关导出格式的完整列表,请访问导出模式文档和集成页面。
常见问题解答#
不可以。没有
format="ambarella"目标。导出为 ONNX(可选择通过amba_config进行 SpongeTorch 压缩),然后使用 SDK 中的 Ambarella CVflow 工具链离线将 ONNX 模型编译为 AmbaPB。CVflow 工具链支持的任何基于 CVflow 的 SoC 都可以作为目标,包括用于 AI 相机的 CV72/CV75 系列、用于无人机和机器人的 CV5/CV52 以及用于汽车的 CV3-AD。
amba_chipset参数配置了 SpongeTorch 的优化目标;编译时需单独选择匹配的目标。接受的芯片组字符串和可用性取决于安装的 SDK 版本。SpongeTorch 是 Ambarella 的模型压缩工具包,集成在 Ultralytics 的 Ambarella 分支中,用于剪枝和量化感知训练。它是可选的:普通的 Ultralytics ONNX 导出也可以使用训练后量化并通过 CVflow 工具链进行编译,但这会以一定的 NPU 性能和量化准确性为代价。
它们是专有的且不在 PyPI 上。在 Ambarella Developer Zone 上注册以请求 SDK 访问权限;
spongetorch和cvflowbackendwheel 以及 CVflow 编译器随 SDK 分发包一起提供。在安装了 Ambarella 分支的情况下运行
yolo val model=model.ambapb.ckpt.onnx data=your_data.yaml。AmbaPB 后端以位精确的方式执行编译后的模型,就像它在 CVflow AI 引擎上运行一样,因此报告的 mAP 包含了所有编译器量化效果。