如何开始学习用fpga进行fpga做图像处理理

能不能用fpga实现简单的图像处理自学习... | 问答 | 问答 | 果壳网 科技有意思
能不能用fpga实现简单的图像处理自学习算法?最好是能有一些例程就好了!比如数图片中大米数量等。
最好是能有一些例程就好了!比如数图片中大米数量等。
智能科学专业
你需要opencv,它支持C语言交叉编译,现有产品有很多使用板载C语言运行opencv的实例
后回答问题,你也可以用以下帐号直接登录
(C)果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:&&&&&&&&PS:笔者强烈建议诸位注册一个EETOP的账号,每天签到或者发贴、回贴就有积分了,里面的资源非常丰富,各种软件、资料都能找到。
一、入门首先要掌握HDL(HDL=verilog+VHDL)。
第一句话是:还没学数电的先学。然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL。因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它。当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多。
接下来,首先找本实例抄代码。抄代码的意义在于熟悉语法规则和编译器(这里的编译器是硅编译器又叫综合器,常用的编译器有:、、、 、的、iverilog、的、Microsemi/Actel的、),然后再模仿着写,最后不看书也能写出来。编译完代码,就打开RTL图,看一下综合出来是什么样的电路。
HDL是硬件描述语言,突出硬件这一特点,所以要用数电的思维去思考HDL,而不是用C语言或者其它高级语言,如果不能理解这句话的,可以看《》。在这一阶段,推荐的教材是《》、《》或者是《》。不看书也能写出个三段式状态机就可以进入下一阶段了。
此外,你手上必须准备Verilog或者VHDL的官方文档,《》、《》,以便遇到一些语法问题的时候能查一下。
二、独立完成中小规模的数字电路设计。
现在,你可以设计一些数字电路了,像交通灯、电子琴、DDS等等,推荐的教材是《》。在这一阶段,你要做到的是:给你一个指标要求或者时序图,你能用HDL设计电路去实现它。这里你需要一块开发板,可以选的cyclone IV系列,或者的Spantan
6。还没掌握HDL之前千万不要买开发板,因为你买回来也没用。这里你没必要每次编译通过就下载代码,咱们用(此外还有、、Diamond的Active-HDL、VCS、Debussy/等仿真工具),如果仿真都不能通过那就不用下载了,肯定不行的。在这里先掌握简单的testbench就可以了。推荐的教材是《》。
三、掌握设计方法和设计原则。
你可能发现你综合出来的电路尽管没错,但有很多警告。这个时候,你得学会同步设计原则、优化电路,是速度优先还是面积优先,时钟树应该怎样设计,怎样同步两个异频时钟等等。推荐的教材是《》、《》、《Altera
FPGA/CPLD设计》第二版的和两本。学会加快编译速度(增量式编译、LogicLock),静态(),嵌入式逻辑分析仪()就算是通关了。如果有不懂的地方可以暂时跳过,因为这部分还需要足量的实践,才能有较深刻的理解。
四、学会提高开发效率。
因为Quartus和ISE的编辑器功能太弱,影响了开发效率。所以建议使用中代码片段的功能,以减少重复性劳动。Modelsim也是常用的仿真工具,学会TCL/TK以编写适合自己的,使得仿真变得自动化,推荐的教材是《》。你可能会手动备份代码,但是专业人士都是用的,所以,为了提高工作效率,必须掌握。文件比较器也是个比较常用的工具。此外,你也可以使用来替代testbench,这样效率会更高一些。如果你是做IC验证的,就必须掌握System Verilog和验证方法学(UVM)。推荐的教材是《》、《》、《》。
掌握了TCL/TK之后,可以学习(ISE也有类似的工具)制作属于自己的调试工具,此外,有时间的话,最好再学个python。脚本,意味着一劳永逸。
五、增强理论基础。
这个时候,你已经会使用FPGA了,但是还有很多事情做不了(比如,FIR滤波器、、OFDM等),因为理论没学好。我大概地分几个方向供大家参考,后面跟的是要掌握的理论课。
1、信号处理——信号与系统、数字信号处理、数字图像处理、现代数字信号处理、盲信号处理、自适应滤波器原理、雷达信号处理
2、接口应用——如:、、、、、、、、、(10G以太网接口)、、光纤、
3、无线通信——信号与系统、数字信号处理、通信原理、移动通信基础、随机过程、信息论与编码
4、CPU设计——计算机组成原理、、计算机体系结构、编译原理
5、仪器仪表——模拟电子技术、高频电子线路、电子测量技术、智能仪器原理及应用
6、控制系统——自动控制原理、现代控制理论、过程控制工程、模糊控制器理论与应用
7、压缩、编码、加密——数论、抽象代数、现代编码技术、信息论与编码、数据压缩导论、应用密码学、音频信息处理技术、数字视频编码技术原理
现在你发现,原来FPGA会涉及到那么多知识,你可以选一个感兴趣的方向,但是工作中很有可能用到其中几个方向的知识,所以理论还是学得越多越好。如果你要更上一层,数学和英语是不可避免的。
六、学会使用MATLAB仿真。
设计FPGA算法的时候,多多少少都会用到MATLAB,比如的系数矩阵、数字滤波器系数、各种表格和文本处理等。此外,MATLAB还能用于调试HDL(用MATLAB的计算结果跟用HDL算出来的一步步对照,可以知道哪里出问题)。推荐的教材是《》和杜勇的《》。
七、足量的实践。
这个时候你至少读过几遍芯片手册(有),然后可以针对自己的方向,做一定量的实践了(期间要保持良好的,,绘制,的习惯)。比如:通信类的可以做调制解调算法,仪表类的可以做总线分析仪等等。不过这些算法,在书上只是给了个公式、框图而已,跟实际的差距很大,你甚至会觉得书上的东西都很肤浅。那么,你可以在、、、、、Q群共享、博客上面找些相关资料(校外的朋友可以在淘宝买个知网账号)。其实,当你到了这个阶段,你已经达到了职业级水平,有空就多了解一些前沿技术,这将有助于你的职业规划。
在工作当中,或许你需要关注很多协议和行业标准,协议可以在EETOP上面找到,而标准(如:国家标准GB和GB/T,国际标准ISO)就推荐《》和《》。
八、图像处理。(这部分只写给想学图像处理的朋友,也是由浅入深的路线)
1、Photoshop。花一、两周的时间学习PS,对图像处理有个大概的了解,知道各种图片格式、直方图、色相、通道、滤镜、拼接等基本概念,并能使用它。这部分是0基础,目的让大家对图像处理有个感性的认识,而不是一上来就各种各样的公式推导。推荐《》。
2、基于MATLAB或OpenCV的图像处理。有C/C++基础的可以学习OpenCV,否则的话,建议学MATLAB。这个阶段下,只要学会简单的调用函数即可,暂时不用深究实现的细节。推荐《》、《》。
3、图像处理的基础理论。这部分的理论是需要高数、复变、线性代数、信号与系统、数字信号处理等基础,基础不好的话,建议先补补基础再来。看不懂的理论也可以暂时先放下,或许学到后面就自然而然地开窍了。推荐《》。
4、基于FPGA的图像处理。把前面学到的理论运用到FPGA上面,如果这时你有前面第七个阶段的水平,你将轻松地独立完成图像算法设计(图像处理是离不开接口的,上面第五个阶段有讲)。推荐《》、《》。
5、进一步钻研数学。要在算法上更上一层,必然需要更多的数学,所以这里建议学习、、等。
下面这两个阶段是给感兴趣的朋友介绍的。
九、数电的尽头是模电。
现在FPGA内部的事情是难不到你的,但是信号出了FPGA,你就没法控制了。这个时候必须学好模电。比如:电路分析、模拟电子技术、高频电子线路、PCB设计、EMC、SI、PI等等,能设计出一块带两片DDR3的FPGA开发板,就算通关了。具体的学习路线可以参考本博客的《》和《》。
十、学无止境。
能到这个境界,说明你已经很厉害了,但是还有很多东西要学的,因为FPGA常常要跟CPU交互,也就是说你得经常跟软件工程师交流,所以也得懂点软件方面的知识。比如ARM(Xilinx的ZYNQ和Altera的SOC会用到ARM的硬核,请参考本博客的《》)、、Linux、安卓、上位机(、C#、JAVA)都可以学一下,反正学无止境的。
十一、其它问题。
a、为什么不推荐学习NIOS II和MicroBlaze等软核?
1、性价比不高,一般的软核性能大概跟Cortex M3或M4差不多,用FPGA那么贵的东西去做一个性能一般的CPU,在工程上是非常不划算的。不如另外加一块M3。
2、加上软核,可能会影响到其它的逻辑的功能。这是在资源并不十分充足的情况下,再加上软核,导致布局布线变得相当困难。
3、软核不开源,出现Bug的时候,不容易调试。
4、工程上很少使用,极有可能派不上用场。
b、为什么不推荐0基础学习ZYNQ或SOC?
1、容易让人有傍同心理。傍同心理是指一个人通过渲染与自己有亲近关系的人的杰出,来掩盖和弥补自己在这方面的不足,从而获得心理上的平衡。自己在学习很厉害的东西,然后也感觉自己很厉害,但这只是错觉而已。
2、入门应该学习尽量简单的东西,要么专心学习ARM,要么专心学习FPGA。这样更容易有成就感,增强信心。
3、ZYNQ和SOC的应用领域并不广,还有很多人没听过这种东西,导致求职的不利。
4、开发工具编译时间长,浪费较多时间。
5、绝大多数工作,都只是负责一方面,也就是说另一方面,很有可能派不上用场。
c、为什么已经存在那么多IP核,仍然需要写HDL?
1、问这种问题的,一般是学生,他们没有做过产品,没有遇到过工程上的问题。
2、IP核并非万能,不能满足所有需求。
3、尽量少用闭源IP核,一旦出问题,这种黑匣子很可能让产品难产。
4、深入理解底一层次,可以更好地使用高一层次。该法则可以适用于所有编程语言。
FPGA从零开始到大神怎么学
原创: 刘勇材
玩儿转FPGA 微信公总号1选好一本比较全,排版比较合理的verilog书
verilog作为现在最流行的FPGA开发语言,当然是入门基础,在这里小编给大家推荐一本多年来...
一位资深工程师FPGA设计经验精华,吸收后你也能强大!
从大学时代第一次接触FPGA至今已有10多年的时间。至今依然记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲。当时由于没有接触到HDL硬件描述语言,设计都是在MAX+p...
我的FPGA学习历程
回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所...
如何学习FPGA(不断更新)
个人觉得这是总结得非常好的博文:https://blog.csdn.net/k/article/details/我的FPGA之旅也是大致参照着作者的这篇文章进行步进的...
FPGA 学习之路(八)深入理解状态机
状态机定义及分类
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作(时序操作)
状态机的分类:Moore型状态机和Mealy型状态机
Moore型:状态机的变化只与当前的状态有关
FPGA学习步骤,我的体会
FPGA学习步骤,我的体会FPGA在目前应用领域非常,在目前的单板设计里面,几乎都可以看到它的身影。从简单的逻辑组合,到高端的图像、通信协议处理,从单片逻辑到复杂的ASIC原型验证,从小家电到航天器,...
学习 FPGA 经验与书籍
1、不熟悉FPGA的内部结构,不了解可编程逻辑器件的基本原理。
FPGA为什么是可以编程的?恐怕很多菜鸟不知道,他们也不想知道。因为他们觉得这是无关紧要的。他们潜意识的认为可编程嘛,肯定就是像写软件...
FPGA学习很好的一些现成的开发代码路径
altera公司的一些参考设计地址:http://www.alterawiki.com/wiki/Main_Page可以很好地协助初始开发者。...
FPGA学习之路——FIFO读写
在300000多ps时,PLL模块初始化完成,可以看到clk_20m,clk_100m,clk_sdram的波形了。
新建IP核FIFO
###### 【该随笔部分内容转载自小梅哥】
一、FPGA学习路线
  工具使用 -& 语法学习 -& 逻辑设计 -& ...
没有更多推荐了,【干货】腾讯云FPGA的深度学习算法
稿源:用户投稿
由腾讯云基础产品中心、腾讯架构平台部组成的腾讯云FPGA联合团队,在这里介绍国内首款FPGA云服务器的工程实现深度学习算法(AlexNet),讨论深度学习算法FPGA硬件加速平台的架构。背景是这样的:在1 月 20 日,腾讯云推出国内首款高性能异构计算基础设施——FPGA
云服务器,将以云服务方式将大型公司才能长期支付使用的 FPGA
普及到更多企业,企业只需支付相当于通用CPU约40%的费用,性能可提升至通用CPU服务器的30倍以上。具体分享内容如下:1.综述2016年3月份AI围棋程序AlphaGo战胜人类棋手李世石,点燃了业界对人工智能发展的热情,人工智能成为未来的趋势越来越接近。人工智能包括三个要素:算法,计算和数据。人工智能算法目前最主流的是深度学习。计算所对应的硬件平台有:CPU、GPU、FPGA、ASIC。由于移动互联网的到来,用户每天产生大量的数据被入口应用收集:搜索、通讯。我们的QQ、微信业务,用户每天产生的图片数量都是数亿级别,如果我们把这些用户产生的数据看成矿藏的话,计算所对应的硬件平台看成挖掘机,挖掘机的挖掘效率就是各个计算硬件平台对比的标准。最初深度学习算法的主要计算平台是 CPU,因为 CPU
通用性好,硬件框架已经很成熟,对于程序员来说非常友好。然而,当深度学习算法对运算能力需求越来越大时,人们发现 CPU
执行深度学习的效率并不高。CPU
为了满足通用性,芯片面积有很大一部分都用于复杂的控制流和Cache缓存,留给运算单元的面积并不多。这时候,GPU
进入了深度学习研究者的视野。GPU原本的目的是图像渲染,图像渲染算法又因为像素与像素之间相对独立,GPU提供大量并行运算单元,可以同时对很多像素进行并行处理,而这个架构正好能用在深度学习算法上。GPU 运行深度学习算法比 CPU
快很多,但是由于高昂的价格以及超大的功耗对于给其在IDC大规模部署带来了诸多问题。有人就要问,如果做一个完全为深度学习设计的专用芯片(ASIC),会不会比
更有效率?事实上,要真的做一块深度学习专用芯片面临极大不确定性,首先为了性能必须使用最好的半导体制造工艺,而现在用最新的工艺制造芯片一次性成本就要几百万美元。去除资金问题,组织研发队伍从头开始设计,完整的设计周期时间往往要到一年以上,但当前深度学习算法又在不断的更新,设计的专用芯片架构是否适合最新的深度学习算法,风险很大。可能有人会问Google不是做了深度学习设计的专用芯片TPU?从Google目前公布的性能功耗比提升量级(十倍以上的提升)上看,还远未达到专用处理器的提升上限,因此很可能本质上采用是数据位宽更低的类GPU架构,可能还是具有较强的通用性。这几年,FPGA
就吸引了大家的注意力,亚马逊、facebook等互联网公司在数据中心批量部署了FPGA来对自身的深度学习以云服务提供硬件平台。FPGA 全称「可编辑门阵列」(Field Programmable Gate Array),其基本原理是在 FPGA
芯片内集成大量的数字电路基本门电路以及存储器,而用户可以通过烧写 FPGA
配置文件来来定义这些门电路以及存储器之间的连线。这种烧入不是一次性的,即用户今天可以把 FPGA
配置成一个图像编解码器,明天可以编辑配置文件把同一个 FPGA 配置成一个音频编解码器,这个特性可以极大地提高数据中心弹性服务能力。所以说在
可以快速实现为深度学习算法开发的芯片架构,而且成本比设计的专用芯片(ASIC)要便宜,当然性能也没有专用芯片(ASIC)强。ASIC是一锤子买卖,设计出来要是发现哪里不对基本就没机会改了,但是
FPGA 可以通过重新配置来不停地试错知道获得最佳方案,所以用 FPGA 开发的风险也远远小于 ASIC。2.Alexnet 算法分析 2.1&&& Alexnet模型结构Alexnet模型结构如下图2.1所示。图2.1 Alexnet模型模型的输入是3x224x224大小图片,采用5(卷积层)+3(全连接层)层模型结构,部分层卷积后加入Relu,Pooling
和Normalization层,最后一层全连接层是输出1000分类的softmax层。如表1所示,全部8层需要进行1.45GFLOP次乘加计算,计算方法参考下文。表2.1 Alexnet浮点计算量2.2Alexnet 卷积运算特点Alexnet的卷积运算是三维的,在神经网络计算公式: y=f(wx+b)
中,对于每个输出点都是三维矩阵w(kernel)和x乘加后加上bias(b)得到的。如下图2.2所示,kernel的大小M=Dxkxk,矩阵乘加运算展开后
y = x[0]*w[0]+
x[1]*w[1]+…+x[M-1]*w[M-1],所以三维矩阵运算可以看成是一个1x[M-1]矩阵乘以[M-1]x1矩阵。图2.2 Alexnet三维卷积运算每个三维矩阵kernel和NxN的平面上滑动得到的所有矩阵X进行y=f(wx+b)运算后就会得到一个二维平面(feature
map)如图2.3 所示。水平和垂直方向上滑动的次数可以由 (N+2xp-k)/s+1
得到(p为padding的大小),每次滑动运算后都会得到一个点。a)N是NxN平面水平或者垂直方向上的大小;b)K是kernel在NxN平面方向上的大小kernel_size;c)S是滑块每次滑动的步长stride;图2.3 kernel进行滑窗计算Kernel_num 个 kernel 经过运算后就会得到一组特征图,重新组成一个立方体,参数H = Kernel_num,如图2.4所示。这个卷积立方体就是卷积所得到的的最终输出结果。图2.4 多个kernel进行滑窗计算得到一组特征图3.AlexNet模型的FPGA实现 3.1 FPGA异构平台图3.1为异构计算平台的原理框图,CPU通过PCIe接口对FPGA传送数据和指令,FPGA根据CPU下达的数据和指令进行计算。在FPGA加速卡上还有DDR DRAM存储资源,用于缓冲数据。图3.1 FPGA异构系统框图3.2 CNN在FPGA的实现 3.2.1 将哪些东西offload到FPGA计算?在实践中并不是把所有的计算都offload到FPGA,而是只在FPGA中实现前5层卷积层,将全连接层和Softmax层交由CPU来完成,主要考虑原因:(1) 全连接层的参数比较多,计算不够密集,要是FPGA的计算单元发挥出最大的计算性能需要很大的DDR带宽;(2) 实际运用中分类的数目是不一定的,需要对全连阶层和Softmax层进行修改,将这两部分用软件实现有利于修改。3.2.2 实现模式Alexnet的5个卷积层,如何分配资源去实现它们,主要layer并行模式和layer串行模式:(1)
Layer并行模式:如图3.2所示,按照每个layer的计算量分配不同的硬件资源,在FPGA内同时完成所有layer的计算,计算完成之后将计算结果返回CPU。优点是所有的计算在FPGA中一次完成,不需要再FPGA和DDR
DRAM直接来回读写中间结果,节省了的DDR带宽。缺点就是不同layer使用的资源比较难平衡,且layer之间的数据在FPGA内部进行缓冲和格式调整也比较难。另外,这种模式当模型参数稍微调整一下(比如说层数增加)就能重新设计,灵活性较差。图3.2 layer并行模式下资源和时间分配示意图(2)
Layer串行模式:如图3.3所示,在FPGA中只实现完成单个layer的实现,不同layer通过时间上的复用来完成。优点是在实现时只要考虑一层的实现,数据都是从DDR读出,计算结果都写回DDR,数据控制比较简单。缺点就是因为中间结果需要存储在DDR中,提高了对DDR带宽的要求。&图3.3 layer并行模式下资源和时间分配示意图我们的设计采用了是Layer串行的模式,数据在CPU、FPGA和DDR直接的交互过程如图3.4所示。图3.4 计算流程图3.2.3 计算单个Layer的PM(Processing Module)设计如图3.5所示,数据处理过程如下,所有过程都流水线进行:(1) Kernel和Data通过两个独立通道加载到CONV模块中;(2) CONV完成计算,并将结果存在Reduce RAM中;(3) (可选)如果当前layer需要做ReLU/Norm,将ReLU/Norm做完之后写回Reduce RAM中;(4) (可选)如果当前layer需要做Max Pooling,将Max做完之后写回Reduce RAM中;(5) 将计算结果进行格式重排之后写回DDR中。图3.5 Processing Module的结构框图3.2.4 CONV模块的设计在整个PM模块中,最主要的模块是CONV模块,CONV模块完成数据的卷积。由图3.6所示,卷积计算可以分解成两个过程:kernel及Data的展开和矩阵乘法。Kernel可以预先将展开好的数据存在DDR中,因此不需要在FPGA内再对Kernel进行展开。Data展开模块,主要是将输入的feature
map按照kernel的大小展开成可以同kernel进行求内积计算的矩阵。数据展开模块的设计非常重要,不仅要减小从DDR读取数据的数据量以减小DDR带宽的要求,还要保证每次从DDR读取数据时读取的数据为地址连续的大段数据,以提高DDR带宽的读取效率。图3.6 卷积过程示意图图3.7为矩阵乘法的实现结构,通过串联乘加器来实现,一个周期可以完成一次两个向量的内积,通过更新端口上的数据,可以实现矩阵乘法。图3.7 矩阵乘法实现结构展开后的矩阵比较大,FPGA因为资源结构的限制,无法一次完成那么的向量内积,因此要将大矩阵的乘法划分成几个小矩阵的乘加运算。拆分过程如图3.8所示。假设大矩阵乘法为O= X*W,其中,输入矩阵X为M*K个元素的矩阵;权重矩阵W为K*P个元素的矩阵;偏置矩阵O为M*P个元素的矩阵;图3.8 大矩阵乘法的拆分过程R = K/L,如果不能整除输入矩阵,权重矩阵和偏置通过补零的方式将矩阵处理成可以整除;S = P/Q,如果不能整除将权重矩阵和偏置矩阵通过补零的方式将矩阵处理成可以整除;3.2.5实现过程的关键点(1) 决定系统性能的主要因素有:DSP计算能力,带宽和片内存储资源。好的设计是将这三者达到一个比较好的平衡。参考文献[2]开发了roofline性能模型来将系统性能同片外存储带宽、峰值计算性能相关联。(2)
为了达到最好的计算性能就是要尽可能地让FPGA内的在每一个时钟周期都进行有效地工作。为了达到这个目标,CONV模块和后面的ReLU/Norm/Pooling必须能异步流水线进行。Kernel的存储也要有两个存储空间,能对系数进行乒乓加载。另外,由于计算是下一层的输入依赖于上一层的输出,而数据计算完成写回DDR时需要一定时间,依次应该通过交叠计算两张图片的方式(Batch=2)将这段时间通过流水迭掉。(3) 要选择合适的架构,是计算过程中Data和Kernel只要从DDR读取一次,否则对DDR带宽的要求会提高。3.3 性能及效益如图3.9所示采用FPGA异构计算之后,FPGA异构平台处理性能是纯CPU计算的性能4倍,而TCO成本只是纯CPU计算的三分之一。本方案对比中CPU为2颗E5-2620,FPGA为Virtex-7
VX690T,这是一个28nm器件,如果采用20nm或16nm的器件会得到更好的性能。图 3.9 计算性能对比图 3.10 归一化单位成本对比图3.11为实际业务中利用FPGA进行加速的情况,由图中数据可知FPGA加速可以有效降低成本。图3.11 某实际业务中的性能和成本对比参考文献[1] Alex Krizhevsky. ImageNet Classification with Deep Convolutional Neural Networks[2] C. Zhang, et al. Optimizing FPGA-based accelerator design for deep convolutional neural networks. In ACM ISFPGA 2015.&[3] P Gysel, M Motamedi, S Ghiasi. Hardware-oriented Approximation of Convolutional Neural Networks. 2016.[4] Song Han,Huizi Mao,William J. Dally.DEEP COMPRESSION: COMPRESSING
DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN
CODING. Conference paper at ICLR,2016
本文由站长之家用户投稿,未经站长之家同意,严禁转载。如广大用户朋友,发现稿件存在不实报道,欢迎读者反馈、纠正、举报问题()。
免责声明:本文为用户投稿的文章,站长之家发布此文仅为传递信息,不代表站长之家赞同其观点,不对对内容真实性负责,仅供用户参考之用,不构成任何投资、使用等行为的建议。请读者使用之前核实真实性,以及可能存在的风险,任何后果均由读者自行承担。如有发现
有好的文章希望站长之家帮助分享推广,猛戳这里
本网页浏览已超过3分钟,点击关闭或灰色背景,即可回到网页&用FPGA做图像处理最关键的一点优势就是:FPGA能进行实时流水线运算,能达到最高的实时性。因此在一些对实时性要求非常高的应用领域,做图像处理基本就只能用FPGA。例如在一些分选设备中图像处理基本上用的都是FPGA,因为在其中相机从看到物料图像到给出执行指令之间的延时大概只有几毫秒,这就要求图像处理必须很快且延时固定,只有FPGA进行的实时流水线运算才能满足这一要求。
所以要了解FPGA进行图像处理的优势就必须理解FPGA所能进行的实时流水线运算和DSP,GPU等进行的图像处理运算有何不同。DSP,GPU,CPU对图像的处理基本是以帧为单位的,从相机采集的图像数据会先存在内存中,然后GPU会读取内存中的图像数据进行处理。假如采集图像的帧率是30帧,那么DSP,GPU要是能在1/30秒内完成一帧图像的处理,那基本上就能算是实时处理。
FPGA对图像进行实时流水线运算是以行为单位的。FPGA可以直接和图像传感器芯片连接获得图像数据流,如果是RAW格式的则还可以进行差值以获得RGB图像数据。FPGA能进行实时流水线处理的关键是它可以用其内部的Block Ram缓存若干行的图像数据。这个Block Ram可以说是类似于CPU里面的Cache,但Cache不是你能完全控制的,但Block Ram是完全可控的,可以用它实现各种灵活的运算处理。这样FPGA通过缓存若干行图像数据就可以对图像进行实时处理,数据就这样一边流过就一边处理好了,不需要送入DDR缓存了之后再读出来处理。
这样的数据流处理显然是顺序读取数据的,那么也就只能实现那些顺序读取数据的算法,也就是图像处理中那一大类用3x3到NxN的算子进行的滤波、取边缘、膨胀腐蚀等算法。可能大家会觉得这些运算似乎都是最基本的图像处理运算,只是个前端的预处理,似乎用处不大。但问题是只有FPGA做这样的运算才是速度最快效率最高的,比如用CPU做一个取边缘的算法根本就达不到实时。另外别小看了这种NxN算子法,它可以有各种组合和玩法,可以实现分选多种颜色,甚至分辨简单形状等功能。FPGA进行的这种算子法处理是并行流水线算法,其延时是固定的,比如用3x3的算子进行处理其给出结果的延时是两行图像的时间。还有这个算子法和现在卷积神经网络中最前面的卷积层运算是类似的。
FPGA中的Block Ram是重要和稀缺资源,能缓存的图像数据行数是有限的,所以这个NxN的算子中的N不能特别大。当然FPGA也可以接DDR把图像缓存到其中再读出来进行处理,但这种处理模式就和CPU差不多了,达不到最高的实时性。其实有些我们认为需要随机读取数据的图像处理算法也是可以并行流水线化的。
在密集运算中,耽误时间和消耗功耗的操作往往不是运算本身,而是把数据从内存中搬来搬去。GPU,CPU在进行运算时要把数据从内存中取出来,算好了在放回去。这样内存带宽往往成了运算速度的瓶颈,数据搬运过程中的功耗占的比重也不会小。FPGA则可以通过堆很多计算硬件的方法把要做的运算都展开,然后数据从中流过,完成一个阶段的运算之后就直接流入第二个阶段,不需要把一个计算阶段完成后的数据再送回内存中,再读出来交给下一个阶段的运算。这样就会节省很多时间和功耗。现在用FPGA做图像处理就是这样干的,比如先用一个3x3的算子进行滤波,再用一个3x3的算子进行取边缘,在FPGA流水线算法中,滤波处理完了数据立即就会进行取边缘处理,是不需要像CPU那样存回内存再读出来的。
FPGA进行图像处理的前景还是挺广阔的,越来越多的工业应用场合都要求更高的实时性,而这正是FPGA所适合的。还有机器学习领域,神经网络这种层状的,不需要很随机的读取数据的运算是比较适合用FPGA来做的。不过FPGA不擅长浮点运算,如果能整出不需要浮点运算的神经网络,那么FPGA在这方面的应用将会更大。
前些年用matlab和opencv做图像处理。近一段时间通过FPGA处理摄像头视频数据,有太多感触,复杂的算法先不提及,单是上面文章中提到的一些处理手段及策略,非常受用。
感谢来自知乎网的图像处理讨论。非常受益!
版权所有权归卿萃科技&杭州FPGA事业部,转载请注明出处
作者:杭州卿萃科技ALIFPGA
原文地址:杭州卿萃科技FPGA极客空间 微信公众号
扫描二维码关注杭州卿萃科技FPGA极客空间
阅读(...) 评论()}

我要回帖

更多关于 基于fpga的图像处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信