前面一篇文章中,已经详细的分析了引导滤波的理论,公式的推导,以及和双边滤波的对比分析,即在边缘的处理上双边滤波会引起人为的黑/白边。我们已经知道何博士引导滤波的优秀之处,那么本篇文章,我带你推演,如何用FPGA并行高速运算,最小的代码实现实时的引导滤波算法。

首先,给出上篇中最后的matlab 引导滤波的代码,如下所示。

其中框框中为主要的计算过程,下一图为计算a/b的最后的公式(引导图=本身)。

双边滤波由于其只是在空间距离及像素相似度上进行权重计算,加权滤波,相对算法不是特别复杂,FPGA也易于实现(某司的USB工业相机2D滤波就是双边滤波),但是确实效果上不如引导滤波,那么引导滤波FPGA计算真有那么难吗?为此我翻阅了一些资料,也从头到尾推到计算了一遍,略有所成,出来和大家分享下。

在Matlab/C的加速中,引导滤波采用了盒式滤波的方式去加速,将运算复杂度从O(MN)的降低到了O(4),其方法就是先计算当前像素到原点像素组成的矩形区域的和/平方和等,对于线程的Matlab/C而言确实有很大的加速作用,相关的文章可以参考如下,对于软件加速而言还是很不错:

https://www.cnblogs.com/lwl2015/p/4460711.html

于是网上就有了一篇所谓的采用FPGA进行引导滤波加速的专利,链接如下:

https://www.doc88.com/p-4377429794731.html?r=1

另附上架构实现图,但我估计这几个小朋友还没有想明白boxfilter是怎么回事,生搬硬套软件boxfilter加速的思维嘛???

图中,计算均值,平方均值,a的均值,b的均值采用了4个boxfilter,也就是说如果输入1280*720的图像,那就需要缓存4个那么大地址空间的区域来存储中间变量,这显然是不适合FPGA加速运算的啊。FPGA的意义在于高速并行技术,尽可能的避免冲入进入缓存,而是以Pipeline的方式流水线完成运算,实现真正低延时+实时处理的目标。

所以为什么不能流水线完成所有的计算操作呢?

不服来战,没有啥难度的……下面开始我的表演:


【第一步】

以3*3的滤波为例(这里的引导图都是原图),按行从传感器或者DDR中读取原图,采用移位寄存后得到3*3的矩阵行,如下所示:

如上图中,以P00-P22为例,这9个像素,我们可以通过计算得均值,以及平方的均值,紧接着继续计算得到a与吧,详见下图,其中相关的参数定义如下:

序号

缩写

定义

1

P

原始图像像素集

2

Pm

以当前像素为中心的3*3像素的均值

3

PPm

以当前像素为中心的3*3像素平方的均值

4

sum1

以当前像素为中心的3*3像素的和

5

Sum2

以当前像素为中心的3*3像素平方的和

6

a

以当前像素为中心计算的参数a

7

b

以当前像素为中心计算的参数b

8

am

以当前像素为中心的3*3像素的a均值

9

bm

以当前像素为中心的3*3像素的b均值

10

Q

滤波后图像像素集

从上图可知,通过三行组成的矩阵,以流水线方式,最快用了6个时钟得到了参数a与b;

由于全图流水线运行,因此从第6个时钟开始,将持续的输出每一个像素对应的a与b,等同于我们通过这一阶段的实现方式,得到了参数a/b阵列。

另外,上图中可知,除以9的运算我已经默默转换为乘法与移位,clk4中将涉及到的小数点,已经提前扩大了1024倍,同等的b中也做了变更(红/蓝色字体),这就是FPGA定点化的加速的方式。

再者,由于最后的计算还需要P的参与,因此上述步骤中,需要将输入的原始图像进行移位延时,最终能和后续am/bm对齐。


【第二步】

接下来,进一步计算am与bm,这个就简单的多了,类似第一步,直接缓存3行得到3*3的矩阵行,通过加权后得到am与bm。这个过程中am与bm的计算可以完全并行,每个am/bm的计算耗时3个时钟。

详见下图计算流:


【第三步】

此时我们已经同时得到了am,bm,以及通过移位delay后和am/bm对齐的P,那么直接套用公式,我们就可以计算出每一个像素滤波后的值:

即输出Q=(am*P+bm)>>10

这里还需要右移10bit,是因为前面第一步中,由于涉及到了小数,我们提前进行了1024倍的扩大,来减少计算误差的损失。

至此,流水线操作,没有使用boxfilter,没有将数据回写入DDR,我们采用了若干行line buffer的形式,完成了实时引导滤波的FPGA加速实现。

整体流程再梳理一下,相关的依赖以及流水方式,如下图所示,应该可以看的更明白。其中绿色为第一步计,灰色为第二步计算,红色为最后一步计算。

所以,这就是FPGA并行加速运算的价值与意义,按照我的实现方式,可以用最小的代码实现实时的引导滤波,甚至连低端的EP4CE6E都不是问题。

同样一个算法,可以有n种实现方式,你甚至可以把算法挪到MPSOC的PS中执行,然后忍受龟速的同时你可能还会抱怨FPGA跑的慢,CPU性能不足之类的,但是永远不要忘记,架构的意义。正如软件的优化,其实很多时候,并不是算法本身不行,而是你对系统底层,对计算优化的能力不行。


为什么我喜欢用FPGA加速,因为每一个门级电路,以何种并行度何种方式进行计算,一切都可以在我的掌控之中。

所以当年我说过一句话:掌握了FPGA,你便掌握了整个世界。

至此,从均值滤波到中值滤波、高斯滤波、双边滤波、引导滤波这些通用的2D降噪算法(其他的算法详见我公众号/知识星球),我都已经通过公众号/知识星球/博客的方式,从原理到FPGA加速实现阐述明白。

如果在这之间有任何疑问,或者我有什么不到之处的,欢迎以各种方式来跟我讨论(伸手党麻烦出门右转)。

谢谢大家,I am CrazyBingo!


 成也FPGA,败也FPGA;

        FPGA图像算法加速,我将持续的跟大家分享架构思维,愿能畅所欲言。

基于FPGA的引导滤波并行加速实现相关推荐

  1. 基于FPGA的深度学习算法加速

    学习总结--基于FPGA的深度学习算法加速 1.深度学习算法加速的方法 2.为什么用FPGA来加速YOLOV2 3.FPGA简介 4.PYNQ框架与HLS加速理论 5.实验结果 1.深度学习算法加速的 ...

  2. 讯琥科技基于FPGA 的区块链硬件加速服务性能直逼100,000 TPS

    区块链是一种防篡改的去中心化账本,可建立必要的信任机制,从而在免去中间环节的情况下交换价值.据IDC预测,到2025年,全球物联网(IoT)设备数将达到416亿台.当前,物联网行业高度碎片化.相互孤立 ...

  3. 目标检测YOLO实战应用案例100讲-基于FPGA的目标检测硬件加速技术及其应用研究

    目录 基于FPGA的目标检测加速器设计 目标检测算法与加速方法 2.1 YOLO v2算法

  4. 基于fpga的均值滤波

    1.功能要求: 输入图像大小为 256256.在clk时钟下进行 55均值滤波之后的结果. 难点分析,主要是时序分析和边界对齐等问题. 2.模块划分: 模块一:行数据的统计.图像数据中的行数据流在时钟 ...

  5. 基于fpga的微电网模拟系统

    微电网模拟系统设计报告 题目:微电网模拟系统 摘要 本文针对微电网模拟系统研究背景,设计了可编程逻辑器件FPGA为控制核心的两个三相逆变器系统.本系统的硬件主要由逆变主电路系统和FPGA控制电路系统构 ...

  6. 快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用...

    来源:机器之心 本文约6000字,建议阅读10分钟 本文介绍了基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用. 典型的实时流式自动语音识别业务如语音搜索.语音输入等和用户操作相关,直接影 ...

  7. AI周报丨快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用

    AI周报 - 热门论文 - 题目:On Training Implicit Models 本文主要研究无限层隐式模型的训练问题.具体地说,以前的工作采用隐式微分,并为反向传播计算精确的梯度.然而,是否 ...

  8. 基于FPGA的快速傅里叶变换加速(三)

    基于FPGA的快速傅里叶变换加速(三) 硬件加速介绍及部分verilog代码实现 1. 硬件加速 1.1 FPGA 1.1.1 FPGA介绍 概念: 基本结构: 工作原理: 1.1.2 开发板 开发板 ...

  9. 基于Nvidia jetson +fpga(ZYNQ)的人工智能图像加速板卡设计

    Nvidia NX平台使用FPGA设备采集mipi视频数据调试记录 Jetson NX与ZYNQ通过Pcie通信. 驱动调试 硬件原理图 基于ZYNQ+Jetson多目标识别方案设计 FPGA+Xav ...

最新文章

  1. squid 优化指南
  2. oracle中lock的解释
  3. 化身“监工”的AI,我们该如何相处?
  4. 【数据挖掘】贝叶斯公式在垃圾邮件过滤中的应用 ( 先验概率 | 似然概率 | 后验概率 )
  5. 10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令
  6. ajax datatype_小白跟我一起学习ajax
  7. JZOJ 5376. 【NOIP2017提高A组模拟9.19】Candy
  8. python3安装模块的命令_如何为PythonPython3安装gi模块?
  9. 分值展示时,只显示评委分数,但不显示评委名称或评委编号等标识,如何进行前期准备操作?
  10. C++ 虚函数实现:虚函数表 虚表指针
  11. Linux中国 QQ 交流群 大全
  12. 简单实现dom4j解析xml
  13. [转]CTF密码学——常见编解码及加解密总结
  14. SQL常用脚本整理,建议收藏
  15. gbk, gb2312,big5,unicode,utf-8,utf-16的区别
  16. 什么是损失函数?什么是梯度
  17. 投资理财启蒙之如何能够挣到100万?
  18. JAVA实现简易的酒店管理系统
  19. uniapp 富文本编辑器
  20. 变频器LED显示灯闪烁_雷克萨斯LX570经常启动不着火,胎压灯闪烁且胎压显示不正确...

热门文章

  1. C语言刷题训练营-自我补全
  2. 才子佳人与QQ游戏美女找茬外挂实现
  3. Migrate DB data using expdp/impdp
  4. 搭建syslog服务器+log4j2输出日志到syslog
  5. 考研数据结构历年真题(算法设计题)整理
  6. 计算机专业上哈工大还是华中科技,中国工科第二的高校到底是哪所?浙大、上交、哈工大还是华科?...
  7. R语言ggplot2教程 十张图带你入门ggplot2
  8. 创建Vue-Cli脚手架
  9. 并联串联混合的电压和电流_中考物理热点1:电荷、电流、电压、串并联电路专题讲解...
  10. mybatis-plus自定义sql报错 ew.customSqlSegment