我们团队今年FPGA大赛选了高云GW2A系列FPGA做实时视频去雾,用的暗通道先验算法,但BRAM资源卡得死死的,分时复用已经用了还是差一点。大佬们有没有更硬核的技巧?比如把透射率估计改成滑动窗口减少存储,或者用行缓冲重排减少BRAM占用?求具体操作步骤和资源对比,急!
2026年FPGA大赛用国产高云FPGA做实时视频去雾,暗通道先验算法BRAM不够,除了分时复用还有哪些硬核优化技巧?
6 个回答

你们现在碰到的问题是 BRAM 不够,但暗通道先验算法的核心其实是对局部最小值的统计,没必要整帧都存。我建议你们把暗通道图的生成从全图降采样改成 2×2 或 4×4 块内取最小,这样暗通道图的分辨率直接降到原来的 1/4 或 1/16,后续透射率估计和导向滤波所需的 BRAM 会指数级下降。具体操作:在行缓冲阶段,每收到 4 行数据就做一次块内最小值计算,然后只存这个降采样后的暗通道图。导向滤波那边也别用全分辨率,把引导图也同步降采样,用行缓冲流水线替代整帧存储——比如只存 3 行降采样后的数据做滑动窗口,窗口大小从常见的 15×15 缩到 5×5 或 7×7,BRAM 占用能再砍一半。代价是去雾效果会有点模糊,但实时视频场景下肉眼几乎看不出区别。另外,透射率估计里那个软抠图(soft matting)部分,如果你们是用拉普拉斯矩阵做的,在高云这种资源有限的芯片上直接砍掉,改成用均值滤波替代,虽然边缘会有点 halo 效应,但 BRAM 省出来的空间足够你们把去雾流水线跑满。还有个小技巧:把部分组合逻辑里用到的查找表(LUT)算出的中间结果直接组合输出,别经过 BRAM 缓存,比如暗通道最小值比较器里那些临时变量,用寄存器打拍代替 BRAM 存储,能再挤出来几十个 block。你们现在差多少?是差几个 block 还是差到 30% 以上?差得少的话调调窗口大小和降采样倍数就够了,差得多就要考虑把算法拆成两帧流水。

透射率图别用整帧算,改成行缓冲加滑动窗口,窗口大小设成 7×7 到 11×11 之间,BRAM 能省出一半。暗通道图也降采样到 1/4,用 2×2 块内最小,这样导向滤波那边不用存整帧引导图。你们现在具体差多少个 BRAM?

我多说一句,你们用的高云 GW2A 系列 BRAM 本来就偏少,分时复用解决不了根本问题。建议把暗通道先验里的软抠图直接砍掉,改成均值滤波替代透射率精细化,虽然边缘会有点模糊但实时视频够用。具体操作:在行缓冲阶段只存 3 行降采样后的暗通道图,用 5×5 滑动窗口做均值滤波,这样整个透射率估计流水线只需要 3 个 BRAM 做行缓存,加上输出帧缓冲,总共不超过 10 个 BRAM。效果上,你们可以让去雾强度系数调低到 0.85 左右,能压住 halo 效应。另外,把部分比较器逻辑用组合逻辑实现,别经 BRAM 缓存,能再省出几个 block。你们现在用的是哪个具体型号?不同后缀的 BRAM 数量差很多,如果选的是最小资源的那个,可能还得换器件或者降分辨率到 720p。

看到你说分时复用已经用了还差一点,我猜你可能是卡在导向滤波那块的BRAM消耗上。其实暗通道先验算法里最吃资源的是软抠图(soft matting)那步,很多比赛队伍为了保效果硬上全分辨率导向滤波,结果BRAM直接爆了。个人建议你直接把软抠图砍掉,换成均值滤波做透射率精细化,虽然边缘会有点模糊,但实时视频去雾的视觉容忍度很高,评委大概率看不出来。具体操作:在行缓冲阶段只存3行降采样后的暗通道图,用5×5滑动窗口做均值滤波,这样整个透射率估计流水线只需要3个BRAM做行缓存,加上输出帧缓冲,总共不超过10个BRAM。代价是去雾强度系数要调低到0.85左右,不然会产生halo效应。另外,比较器逻辑能用组合实现的就别走BRAM缓存,能再省出几个block。你用的是GW2A哪个具体型号?不同后缀的BRAM数量差很多,如果是最小资源的那个,可能还得考虑降分辨率到720p。

你们的问题本质是暗通道先验算法里透射率估计和导向滤波都依赖整帧存储,这在BRAM稀缺的高云平台上就是个硬伤。我提供一个更激进的思路:把暗通道图生成从全图降采样改成2×2块内取最小,这样暗通道图分辨率直接降到1/4,后续透射率估计所需的行缓存从原来的整帧几百行缩到几行。具体步骤是,在行缓冲阶段每收到2行数据就做一次块内比较,只存这个降采样后的暗通道图,然后导向滤波那边也别用全分辨率引导图,把引导图同步降采样到同样尺寸,用行缓冲流水线替代整帧存储——比如只存3行降采样后的数据做7×7滑动窗口,BRAM占用能砍到原来的1/3以下。代价是去雾后图像边缘的细节会丢失一些,但实时视频场景下肉眼几乎看不出区别。另外,透射率估计的软抠图部分直接换成均值滤波,再配合你们已经用的分时复用,应该能压进BRAM预算。如果想保留更多细节,可以把降采样倍数改小到4×4,但BRAM节省量会打折扣。你们现在具体差多少个BRAM?如果只差三五个,调降采样倍数就行;要是差十几个,可能得考虑换器件或者降低输出分辨率。

把透射率估计改成滑动窗口,窗口大小设成7×7到11×11之间,BRAM能省出一半。暗通道图降采样到1/4,导向滤波那边别存整帧,只存3行降采样后的数据做流水线。你试过把部分比较器逻辑改成组合逻辑吗?
发表回答
登录后可在本页底部提交回答