ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FPGA 部署 YOLO 完整指南:从模型量化到 Zynq PS+PL 硬件加速

FPGA 部署 YOLO 完整指南:从模型量化到 Zynq PS+PL 硬件加速 关键词FPGA、YOLO、Zynq、Vivado HLS、INT8 量化、AXI DMA、卷积加速器、PSPL 协同设计在 PC 或服务器上运行 YOLO通常只需要 Python、PyTorch 和 Ultralytics输入图片 ↓ PyTorch 模型推理 ↓ 输出检测框但在 FPGA 上部署 YOLO流程完全不同。FPGA 不能直接运行 PyTorch也不能直接把 ONNX 文件下载进去执行。FPGA 部署 YOLO 的本质是把 YOLO 的卷积、池化、上采样等运算 转换为 FPGA 中的硬件电路本文介绍 FPGA 部署 YOLO 的完整流程、硬件架构、开发工具、量化方法和常见注意事项。一、为什么 FPGA 部署 YOLO 和 PC 不一样1. PC 上的 YOLOPC 上运行 YOLO 依赖软件框架Python ↓ PyTorch ↓ YOLO 模型 ↓ CPU 或 GPU你只需要执行yolo predict modelyolov8n.pt sourcetest.jpg devicecpuPyTorch 会自动完成所有计算。2. FPGA 上的 YOLOFPGA 没有 PyTorch也不会自动解释神经网络。FPGA 需要卷积硬件模块池化硬件模块上采样硬件模块激活函数模块数据缓存AXI 总线DMAARM 控制程序。整体关系是ARM PS ↓ 控制层调度 ↓ AXI DMA ↓ FPGA PL ↓ 卷积/池化/上采样硬件 ↓ 检测结果因此ONNX 只是中间格式ONNX ≠ 可以直接在 FPGA 上运行ONNX 需要进一步转换为 HLS、RTL 或专用加速器支持的数据和指令格式。二、FPGA 部署 YOLO 的总体流程完整流程通常如下训练 YOLO 模型 ↓ PC 端验证模型 ↓ 导出 ONNX ↓ INT8 量化 ↓ 设计卷积和池化加速器 ↓ 搭建 Vivado Block Design ↓ 编写 PS 端控制程序 ↓ 单层验证 ↓ 完整网络验证 ↓ 接入摄像头或视频 ↓ 优化性能和资源其中最关键的四步是模型量化卷积加速器设计AXI DMA 数据搬运PS 与 PL 协同工作。三、目标器件资源评估如果使用 Zynq-7015例如xc7z015clg485-2它的 PL 资源比较有限资源大致规模Logic Cells约 74KDSP约 160BRAM约 3.3 Mb因此需要明确完整 YOLOv8n 640×640 基本不可行YOLOv8n 320×320 也很困难YOLOv3-tiny、YOLOv4-tiny 更适合必须进行 INT8 量化输入分辨率需要降低卷积并行度不能太高特征图和权重必须放在 DDR 中不能全部放在 BRAM。比较现实的目标是YOLOv3-tiny 或 YOLOv4-tiny INT8 量化 160×160 或 192×192 输入 低并行度卷积加速器 PS 负责预处理和后处理不要一开始就尝试YOLOv8n 640×640这个规模对小型 Zynq 器件来说太大。四、推荐模型和输入分辨率1. 模型选择模型FPGA 部署难度说明YOLOv3-tiny较低网络较小资料较多YOLOv4-tiny较低比 YOLOv3-tiny 精度稍好YOLOv5n中等需要较多优化YOLOv8n较高网络结构较复杂YOLOv8s 及以上很高不建议小型 FPGA 使用对于 Zynq-7015优先选择YOLOv3-tiny YOLOv4-tiny2. 输入分辨率建议从160×160 192×192开始成功后可以尝试224×224 256×256分辨率越高特征图越大对 BRAM 和 DDR 带宽要求越高。五、PS 与 PL 如何分工Zynq 是 ARM PS FPGA PL 的异构结构适合软硬件协同设计。推荐分工如下模块负责内容PS / ARM图像预处理、权重加载、层调度、后处理PL / FPGA卷积、池化、上采样、激活函数DDR输入图片、特征图、权重、输出结果AXI DMAPS 与 PL 之间搬运数据BRAM缓存当前卷积窗口、局部权重和行缓存整体架构摄像头或图片 | v ARM PS 图像缩放、颜色转换、归一化、量化 | v DDR | v AXI DMA | v FPGA PL 卷积、池化、上采样、激活 | v DDR | v ARM PS YOLO 解码、置信度过滤、NMS、画框 | v HDMI 或显示设备六、第一步在 PC 上完成模型先在 PC 上完成训练、验证和推理。使用 Ultralyticsyolo train modelyolov8n.pt datadata.yaml epochs50 imgsz640 devicecpu yolo val modelruns/detect/train/weights/best.pt datadata.yaml devicecpu yolo predict modelruns/detect/train/weights/best.pt sourcetest.jpg devicecpu建议先确认模型能正常加载图片能正常检测检测框位置正确类别和置信度正确输出数据格式明确。只有 PC 端模型正确后续 FPGA 部署才有意义。七、第二步导出 ONNX导出模型yolo export modelyolov8n.pt formatonnx opset12生成yolov8n.onnxONNX 可以用于ONNX RuntimeOpenCV DNNTensorRT模型转换工具后续量化和分析。但是 ONNX 不能直接下载到 FPGA 运行。它只是表示模型结构 权重还需要硬件加速器来执行这些运算。八、第三步INT8 量化FPGA 不适合大量浮点运算通常需要将模型从 FP32 转换为 INT8。流程FP32 模型 ↓ INT8 量化 ↓ 量化权重 ↓ 量化输入 ↓ 量化输出量化内容包括输入图片特征图卷积权重偏置中间累加结果激活函数输出。常见量化方式训练后量化 PTQ量化感知训练 QAT。YOLO 的检测头对量化比较敏感建议分别比较量化前 mAP量化后 mAP置信度变化小目标检测效果检测框位置误差。如果精度下降过多可以使用分通道量化混合精度QAT只量化卷积层保留部分层为 FP16。九、第四步设计卷积加速器卷积是 YOLO 中最主要的计算部分。1. HLS 方案使用 Vivado HLS 编写3×3 卷积1×1 卷积行缓存权重缓存乘加阵列ReLU / Leaky ReLU输出流合并。核心优化包括数组分割 流水线 数据复用 双缓冲 并行乘加2. Verilog RTL 方案直接设计MAC 阵列行缓存权重缓存特征图缓存AXI4-Stream 接口状态机控制。RTL 控制更精细但开发周期更长。3. 常见加速器结构输入特征图 ↓ 行缓存 Line Buffer ↓ 3×3 卷积窗口 ↓ 乘加阵列 MAC Array ↓ 累加器 ↓ 激活函数 ↓ 输出特征图为了减少 DDR 访问需要权重复用输入特征复输出 Ping-Pong 缓存分块计算 Tiling多通道并行。十、第五步实现池化和上采样最大池化2×2 窗口 ↓ 取最大值 ↓ 输出特征图上采样输入特征图 ↓ 2 倍放大 ↓ 输出特征图这些模块比卷积简单但仍然需要行缓存地址控制AXI Stream 握手输出缓存。十一、第六步搭建 Vivado Block Design典型结构Processing System 7 | -- AXI Interconnect | -- AXI DMA | -- AXI Stream Switch | -- Convolution IP -- Max Pool IP -- Upsample IP -- Activation IP | -- DDR 控制器需要重点设置PS7 的 DDR 参数HP 端口AXI DMA 读写通道AXI Stream 数据位宽时钟和复位中断地址映射位流生成。十二、第七步编写 PS 端控制程序PS 端负责控制所有硬件模块初始化系统 ↓ 加载权重 ↓ 加载输入图片 ↓ 启动 DMA ↓ 启动卷积 IP ↓ 等待完成 ↓ 启动池化 IP ↓ 等待完成 ↓ 执行所有网络层 ↓ 读取输出 ↓ 执行 YOLO 解码 ↓ 执行 NMS ↓ 输出检测框开发方式裸机 Bare-metalXilinx SDKVitisPetaLinuxPYNQ。对于 Zynq-7015建议先从裸机开始便于调试。十三、第八步验证与调试建议按照以下顺序验证第一层单层卷积 第二层卷积 激活 第三层卷积 池化 第四层完整 YOLO 网络 第五层单张图片 第六层视频 第七层摄像头实时检测每完成一层都需要与 PC 端结果比较输入数据是否一致输出特征图是否一致量化误差是否可接受地址是否正确DMA 是否完成中断是否触发。十四、工具选择建议工具适用场景Vivado HLS自定义卷积加速器Verilog RTL精细控制资源和时序Vitis AI DPU更适合 Zynq UltraScaleFINN适合小型量化神经网络hls4ml适合小型网络PYNQ适合 Zynq-7000 快速验证ONNX Runtime用于 PC 端参考推理对于 Zynq-7015推荐路线是Vivado HLS 自定义卷积加速器 AXI DMA PS 端控制程序Vitis AI DPU 通常更适合 Zynq UltraScale不建议直接用于 XC7Z015 这类小型 Zynq-7000 器件。十五、优化方向FPGA 部署 YOLO 时性能通常受以下因素限制DDR 带宽BRAM 容量DSP 数量卷积并行度权重加载速度特征图访问次数量化误差后处理速度。常用优化方法使用 INT8降低输入分辨率减少网络通道数增加输入和权重复用使用 Ping-Pong 缓存使用流水线设计合并卷积、BN 和激活将特征图放在 DDR只把当前层权重送入 PLPS 端使用高效 NMS。十六、常见误区误区一ONNX 可以直接下载到 FPGA错误。ONNX 只是模型文件FPGA 需要硬件加速器来执行计算。误区二FPGA 上可以直接运行 YOLOv8n 640×640对于小型 Zynq 器件通常不可行。应优先选择YOLOv3-tiny YOLOv4-tiny 160×160 或 192×192 INT8误区三所有计算都放在 FPGA 里不建议。推荐PS预处理、调度、后处理 PL卷积、池化、上采样 DDR特征图和权重误区四只关注卷积计算数据搬运往往比计算更关键。需要重点设计AXI DMADDR 带宽行缓存权重复用双缓冲。十七、最小可行开发路线不要一开始就做完整 YOLO。建议按以下顺序进行第一步单层卷积输入 160×160 ↓ 一层 3×3 卷积 ↓ INT8 输出第二步卷积加激活加入 ReLU 或 Leaky ReLU。第三步卷积加池化验证行缓存和池化逻辑。第四步多层小网络先实现一个简化 CNN。第五步完整 Tiny YOLO实现 YOLOv3-tiny 或 YOLOv4-tiny。第六步接入图片先测试单张图片。第七步接入摄像头或视频最后再考虑实时视频检测。十八、总结FPGA 部署 YOLO 的核心流程是训练 YOLO ↓ 导出模型 ↓ INT8 量化 ↓ 设计卷积和池化加速器 ↓ AXI DMA 连接 PS 和 PL ↓ PS 负责调度和后处理 ↓ 得到检测结果对于 Zynq-7015不要直接部署 640×640 YOLOv8n优先选择 YOLOv3-tiny 或 YOLOv4-tiny输入分辨率建议 160×160 到 224×224使用 INT8 量化PS 负责预处理和 NMSPL 实现卷积、池化、上采样先完成单层卷积再扩展到完整网络优先解决数据搬运和 DDR 带宽问题。一句话总结PC 上运行 YOLO是软件推理。 FPGA 上部署 YOLO是把神经网络的每一层拆开做成硬件电路。这就是 FPGA YOLO 部署真正要做的事情。
返回列表