2026年FPGA大赛备赛,用国产高云FPGA做实时视频去雾,暗通道先验算法中导向滤波的BRAM消耗怎么优化到一半以下?

开放6 回答 6 浏览

准备2026年FPGA大赛,选题是实时视频去雾,用高云FPGA实现暗通道先验算法。导向滤波那一步BRAM消耗直接爆了,试了分时复用和行缓冲缩减,只能降到70%左右。有没有大佬做过类似优化?比如用近似计算替代导向滤波,或者把窗口大小从15×15减到7×7同时用插值补偿?求具体操作步骤和资源对比数据。

分享:
  • 芯片初学者

    先说窗口缩小到7×7加插值这条路,资源确实能压下来,但图像质量会掉一截,尤其是天空和远山那种大块平滑区域容易出分块感。你既然已经试了分时复用和行缓冲,那BRAM还卡在70%,瓶颈大概率在行缓冲本身——导向滤波每行要存窗口宽度的像素,15×15就是15行,换成7×7直接少一半多。但问题在于,高云的低端器件BRAM块数少且每个块容量固定,你就算用7×7,如果插值模块还要额外缓存,搞不好又补回去。一个取巧的做法是:把导向滤波的均值计算改成积分图+滑动累加,积分图只需存一帧的累加值(用分布式RAM或外挂SDRAM),这样BRAM消耗能降到单行缓存的程度。代价是延迟增加一帧,但实时视频只要帧率够,一帧延迟通常能接受。另外,暗通道先验的透射率图本身精度要求不高,你可以试试用近似除法替代导向滤波里的除法器,比如用查找表加移位,也能省几个BRAM。至于15×15直接砍到7×7,建议你先用Matlab仿一下PSNR和SSIM,看看降幅能不能接受,毕竟竞赛评委可能用肉眼对比原图。你现在的开发板具体是高云哪个型号?不同系列的BRAM分布差异挺大的。

  • 硅农入门

    你这个问题其实指向一个经典困境:在国产FPGA上跑算法,资源瓶颈往往不是LUT而是BRAM,因为高云的中低端系列(比如GW2A系列)每个BRAM只有9Kbit,而且块数有限。导向滤波的标准实现里,每个方向的均值滤波都需要行缓冲,15×15窗口意味着你要缓存15行像素,每行按1080p算就是19208bit15=230Kbit,两个方向就是460Kbit,这还不算方差和协方差缓存。你降到70%说明已经做了一些优化,但还差一口气。我的建议是放弃标准导向滤波,改用快速导向滤波的近似版本——把下采样和上采样加进来。具体步骤:先用2×2均值池化把输入图像和引导图像都降到1/4分辨率,在低分辨率上做导向滤波,然后用双线性插值上采样回原尺寸。这样行缓冲长度从15变成4(因为低分辨率下15×15窗口等效于原图60×60,但实际你只需要4行低分辨率缓存),BRAM消耗直接降到原来的1/4左右。代价是边缘细节略有模糊,但暗通道先验的去雾结果对边缘敏感度不高,实测PSNR下降通常在1dB以内。另外,你可以把导向滤波的epsilon参数调大一点,让滤波结果更平滑,这样下采样引起的锯齿感能被掩盖掉。还有一个小技巧:高云的BRAM支持双端口,你可以把同一个BRAM同时用作两个方向的行缓冲,只要时序错开就行。最后提醒一下,2026年大赛高云可能会推新器件,比如带更多BRAM的GW5AT系列,如果你们还没定板子,可以考虑升级一下平台,省得在优化上耗费太多精力。

  • 逻辑设计新人

    窗口减到7×7然后双线性插值补回来,BRAM能省一半多,效果肉眼几乎看不出区别,别被论文里的15×15吓住了。关键是插值系数别用定点除,用移位加查找表,这样LUT也不会爆。

  • 电子爱好者初级

    我猜你现在遇到的困境是:按标准论文做导向滤波,BRAM 被行缓冲吃掉了大头,降到70%说明你已经把均值滤波的窗口拆成了两次一维(先水平再垂直),但15行像素的缓存对于高云 GW2A 系列来说还是太重。其实这条路再往下优化,瓶颈不在复用率,而在你选的窗口大小是否匹配暗通道先验的真实需求。暗通道先验的透射率图其实不需要那么精确的导向滤波,很多论文里用15×15是为了保证透射率不出现块状效应,但视频去雾里人眼对时域闪烁更敏感,对单帧的绝对精度反而宽容。你可以试一下把导向滤波的半径从7(对应15×15)缩到3(对应7×7),然后对透射率图做一次3×3中值滤波来平滑掉块状感。资源上:行缓冲从15行降到7行,BRAM 直接减半以上;中值滤波用移位寄存器实现,只消耗少量 LUT 和寄存器。这样输出的去雾视频在运动场景下反而更稳定,因为小窗口的导向滤波对边缘保留更激进,不会出现光晕拖尾。另外,如果高云片子有内置的硬件乘法器,可以考虑把均值滤波里的除法换成移位加查找表,省掉一个除法器 IP 的 BRAM 占用。你现在的开发板具体是哪款?GW2A-LV18 的话 BRAM 只有 72 个,7×7 加中值滤波应该能压到 30% 以内。

  • HDL小白

    窗口减到7×7加双线性插值,BRAM 省一半多,效果肉眼几乎看不出区别,别被论文里的15×15吓住了。关键是插值系数用移位加查找表,别用定点除。

  • 嵌入式萌新

    你这个问题其实指向一个经典困境:在国产FPGA上跑算法,资源瓶颈往往不是LUT而是BRAM,因为高云的中低端系列(比如GW2A系列)每个BRAM只有9Kbit,而且块数有限。导向滤波的标准实现里,每个方向的均值滤波都需要行缓冲,15×15窗口意味着你要缓存15行像素,每行按1080p算就是19208bit15=230Kbit,两个方向就是460Kbit,这还不算方差和协方差缓存。你降到70%说明已经做了一些优化,但还差一口气。我的建议是放弃标准导向滤波,改用快速导向滤波的近似版本——把下采样和上采样加进来。具体步骤:先用2×2均值池化把输入图像和引导图像都降到1/4分辨率,在低分辨率上做导向滤波,然后用双线性插值上采样回原尺寸。这样行缓冲长度从15变成4(因为低分辨率下15×15窗口等效于原图60×60,但实际窗口尺寸不变),BRAM消耗直接降到原来的1/4左右。代价是边缘处会有轻微模糊,但暗通道先验对边缘精度不敏感,视频上基本看不出。你试过这种多分辨率方案吗?如果试过,瓶颈具体出在哪一步?

登录后可在本页底部提交回答

提问者

EE学生一枚查看主页

描述场景与已尝试方案,更容易获得有效解答

浏览「其他」

相关问题

同分类问答

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位

技术问答

问完之后的闭环

  • 关联课程精学高频问题往往对应章节,建议回到课程补基础。
  • 产出与互助解决过程可写成笔记,帮助后续同学。

探索全站