项目背景
摄像头受到雾天环境中浑浊媒介对场景反射光的削弱以及大气光成像的影响,导致获取图像的可视性不佳,严重影响城市监控、卫星遥感等系统的图像处理。近年来,基于深度学习的去雾算法凭借端到端自动特征提取的优势取得了显著效果,但庞大的参数量和极高的计算复杂度使其难以在功耗与成本受限的边缘端设备上部署。
本项目旨在采用软硬协同设计的理念,基于低成本的PYNQ-Z2(Zynq-7020)平台,打造一套高能效的实时视频去雾系统。在算法端实施网络轻量化与量化压缩;在硬件端定制层间并行的深度学习加速器,利用FPGA的流水线级并行能力打破算力瓶颈。
技术方案概览
- 针对FPGA存储与计算资源限制,对AOD-Net去雾网络进行算子裁剪与QAT量化压缩
- 研发基于FPGA的流式神经网络加速器,实现层间流水线并行处理
- 设计片上行缓存(Line Buffer)数据交互策略,最大化特征图的片上复用率
- 依托PYNQ框架搭建“USB摄像头 -> AOD-Net加速器 -> HDMI显示器”的端到端实时视频流
个人贡献
-
完成AOD-Net的模型精简,并基于TensorFlow实现QAT量化,将模型参数压缩至1.61kB,在保持较高精度(SSIM: 0.872, PSNR: 22.79dB)的同时满足边缘端部署需求
-
设计硬件加速IP架构,并参与核心逻辑的RTL实现,包括核心PE计算阵列与行缓冲模块
-
独立完成基于PYNQ开发板的完整去雾系统搭建,涵盖Block Design硬件架构开发与上层软件驱动编写
详细技术实现
💡 提示:点击对应模块可展开阅读。
1.算法轻量化:AOD-Net 的裁剪与量化
目标硬件 xc7z020 芯片的片上BRAM资源十分有限。AOD-Net 原始网络中存在较多的分支结构,这要求加速器必须在片外或片内长期缓存大规模的特征图,造成了不可接受的存储开销。综合评估后,我采取了如下优化策略:
- 网络裁剪: 剔除了原始模型中跨层暂存时间最长、显存占用率最高的 Concat 节点。
- INT8 QAT量化: 引入量化感知训练(Quantization-Aware Training),将模型从浮点精度压缩为INT8。
优化后的轻量化网络结构如图1所示,模型参数体积仅为 1.61kB。在RESIDE测试集上,优化后的模型依然保持了出色的去雾能力(SSIM达到 0.872,PSNR为 22.79dB)。

2.硬件微架构设计:层间流水并行加速器 IP
为了最大化吞吐量,加速器采用了层间流水线架构(如图2所示)。针对每一层卷积均定制专用计算模块,当上一层输出部分有效数据后,下一层即可立即启动计算,极大削减了计算单元的空载等待时间。

在计算阵列设计上,我们应用了 输入固定数据流(Input Stationary, IS) 与 循环展开(Loop Unroll) 的并行优化策略。输入特征驻留在 Input Buffer 中,乘加单元遍历 Weight RF 完成计算,生成的中间部分和经加法树结构累加后写入 Output Buffer(IS数据流演示详见图3)。对于累加后的INT32结果,硬件内置了乘加移位及ReLU激活逻辑,最后将其再量化(Re-quantize)为INT8输出(核心PE架构如图4)。
此外,为了提高数据复用率,我们采用了一种行缓冲策略(Line Buffer)(如图5)。在卷积核滑窗下移时,仅需将新扫描到的一行像素载入Buffer,通过硬件级的数据交织逻辑保证数据排列正确,从而将数据复用率提升至极限。


3.系统级集成:基于PYNQ的端到端视频流
利用 PYNQ 框架能将底层 PL(可编程逻辑)资源自动映射到上层 Linux 用户空间的优势,我构建了一套“数据采集-AI推理-图像显示”的视频链路(架构见图6,Block Design见图7):
- 将定制的 AOD-Net 加速引擎封装为标准 AXI-Stream 接口 IP,由 DMA 控制数据搬运。
- 依据大气散射模型(ASM),将去雾所需的图像后处理逻辑同样封装为硬件IP并接入DMA,卸载CPU压力,实现端到端的推理。


部署与综合性能评估
在113MHz工作频率和640×480输入分辨率下,论文定型版本的AOD-Net纯网络硬件处理延迟为26ms,对应38.3FPS。该指标不包含PYNQ软件侧的图像采集、预处理、后处理数据组织、解量化和HDMI输出开销。
1. 综合性能指标
| 评估维度 | 核心指标 | 数据表现 |
|---|---|---|
| 算法精度 (RESIDE数据集) | PSNR / SSIM | 22.79 dB / 0.872 |
| 模型存储开销 | 参数量 | 1.61 kB (INT8 QAT量化) |
| 硬件推理速度 (640×480) | 纯网络层延迟 / 吞吐率 | 26 ms / 38.3 FPS |
| 系统能耗与效能 | 运行总功耗 / 能效比 | 2.491 W / 42.61 GOPS/W |
2. 硬件双机对照组演示
为了直观验证加速效能,我搭建了硬件双机对照组演示环境(图8)。由2块PYNQ-Z2、2个显示器、1个USB摄像头、1个HDMI分配器和1台上位机组成。其中一块PYNQ开发板用于驱动USB摄像头获取图像并输出HDMI信号,经过分流后:一路送给左侧显示器显示原始图像;另一路送给另一块PYNQ开发板进行去雾处理,最终结果通过HDMI接口输出到右侧显示器。

实测效果如图9、图10所示,系统能够在边缘侧流畅处理动态雾天场景视频、提升画面对比度与清晰度。
总结与思考
个人评价:从理论到实践
本项目是我首次跑通“从算法轻量化到定制底层硬件”的完整软硬协同设计流程。通过算法轻量化策略与硬件层间并行流水线,将原本庞大的神经网络模型部署到了资源极度受限的Zynq芯片中。
然而,在开发过程中我也深刻体会到全定制化设计的局限性:这种为单一算法强定制的数据通路与计算阵列,一旦算法发生迭代,整个IP就需要推倒重来。这种缺乏灵活性的痛点,成为了我后续开始探索领域定制架构(DSA, Domain Specific Architecture)和可编程AI芯片研究的重要契机。
AI系统:阿姆达尔定律的约束
正如集创赛项目中总结与思考所述,AI推理系统的整体性能受制于阿姆达尔定律,在本项目中亦是如此。
项目开发阶段保留了一组基于PYNQ/Jupyter的单帧调用链剖析程序,打印图像获取、预处理、硬件调用、后处理及输出等关键节点的时间戳,用于分析软件原型中各阶段的时间分布,结果如表1所示。
表 1 端到端推理各阶段延迟统计
| 处理阶段 | 耗时 (ms) |
|---|---|
| 摄像头获取图像 | 11.09 |
| 数据预处理 | 176.43 |
run_kernel_0()调用区间 (DMA收发与AOD-Net) |
1.38 |
| 后处理数据准备 | 155.09 |
run_kernel_1()调用区间 (后处理硬件计算) |
8.76 |
| 图像解量化 | 47.96 |
| HDMI 视频输出 | 5.24 |
| 端到端总延迟 | 405.95 |
该程序记录的run_kernel_0()调用区间约为 1.38ms,run_kernel_1()调用区间约为 8.76ms;包含摄像头读取、Python预处理、硬件调用、后处理数据组织、解量化和HDMI输出在内的完整单帧耗时约为 405.95ms。其中,数据预处理与后处理数据准备分别耗时176.43ms和155.09ms,是该软件原型的主要系统瓶颈。
瓶颈剖析与解决思路: 罪魁祸首是 PYNQ 框架所依赖的 Python 运行环境。ARM 核在调用 PIL/OpenCV 库进行图像预处理、格式转换以及跨态数据拼接时,带来了灾难性的软件串行开销。PYNQ 牺牲了执行效率来换取应用层极大的开发便利性,但也因此掩盖了底层 FPGA 优异的算力表现。
要彻底打破这一困局,系统架构必须进行重构:
- 软件层下沉: 摒弃低效的 Python 生态,采用 C++ 与 OpenCV 结合的方式重构应用层,通过多线程或 NEON 指令集加速预处理环节。
- 构建纯 PL 视频流: 将摄像头图像的裁剪、缩放、格式装配完全下放至 FPGA 端实现。利用 VDMA 构建不经过 CPU 内存拷贝的纯硬件数据通路,让数据始终在 PL 侧并行。
这次项目经历我又一次认识到要实现系统级调优,一定要关注数据搬运与协议转换过程。