|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
上个视频《FPGA图像处理中二值算子的一些妙用》里介绍了一个我写的,并开源了的C-sharp小软件,还用“数细胞个数”这个实际例子介绍了二值图像算子的一些用法。这个视频打算讲一些用FPGA做图像处理的基础知识,比如在一些工业领域用的图像传感器有哪些?FPGA完成某些机器视觉任务的处理流程,为什么用FPGA进行数据处理能达到最高的实时性等。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在讲之前想向刚入坑FPGA的朋友推荐一套FPGA基础教程:B站上的《从零开始系统学FPGA》。这套视频我大致浏览过,讲的比较细致,所以推荐给大家,我还写了一个观看顺序和重点提示,见上图。其中基本概念问题中的第二、三两条是非常重要的,建立时间、保持时间、插入流水线寄存器提高电路频率等这些概念都是面试必问的。用实时流水线的方式处理各种数据是FPGA运用的精髓,如果不会用Verilog写这样的代码,那就基本上等于不会用FPGA。
观看顺序:
一、P1到P7,以及P14. 了解FPGA结构和原理,P1和P7 讲的Block RAM比较重要,其余的先大概了解一下即可。P8,P9先不用看。
二、P15,P21,P22,P23. 这几个讲时序基础的是重点中的重点,建立时间,保持时间,RTL电路能跑多高的频率是怎么算的,这些概念一定要烂熟于心。
三、P10,P13,P18,P19,P16,P17. P19主要看Vivado仿真工具的使用,P20可以暂时不用看。P11,P12不用看。
看教学视频的时候要特别注意下面这些基本概念问题:
1、什么是时序逻辑电路?什么是组合逻辑电路?D触发器的行为如何?
2、什么是建立时间,保持时间,RTL电路能跑多高的频率是怎么算的?
3、电路的频率达不到要求能怎么办?什么叫流水线寄存器?
4、FPGA实现可编程逻辑的基本原理是什么?其中的组合逻辑电路的延时和什么有关?
5、FPGA有哪些主要的时序约束要加?
6、Verilog中什么样的代码会综合出组合电路?什么会综合出寄存器?
7、为什么一个输出信号可以驱动很多输入信号,但一个输入信号为什么不能接多个驱动信号?(multi-driver多重驱动错误是啥意思?这个错误不叫多重赋值啊,叫多重驱动!)
8、实际的数字电路中,时钟信号能不能被当作数据信号,数据信号又能不能被当作时钟信号?为什么?
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
先来说一下工业上用到的图像传感器种类和部分我知道的厂家。如上图所示,工业上除了会用到手机和相机中常见的面阵传感器之外,还会用到线阵传感器。线阵传感器的分辨率是几k乘1,也就是它只扫描一行图像,主要用于扫描仪里,和一些需要扫描传送带上的物料的工业应用场合。上图的“长光辰芯”就是国内这两种传感器都做的公司。做面阵图像传感器的还有索尼,安森美等厂家,线阵的有东芝和一些我也不太了解的厂家。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
上图就是这一种典型的线阵相机在工业领域应用的示意图。物料传送、机器视觉、执行机构三个部分构成了一个物料检测分选系统。相机采样并识别物料,有缺陷的物料会被执行机构筛选掉。由于物料在皮带上是匀速运动的,所以在这种场景下用线阵相机固定在皮带上方横向扫描一行图像就可以了。随着物料从相机下走过,相机就能扫描到完整的物料图片并进行识别,如果被判定为要选掉的物料,则会控制机械臂或喷嘴等执行机构把物料抓走、或是用压缩空气吹掉。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
线阵传感器输出的图像没有帧的概念,就是一行接着一行。如上图所示,面阵传感器输出的是矩形图像,线阵传感器输出的图像可以认为是无限长的,因为只要机器在运行就会不断有图像输出。讲到这有两个问题想问大家。第一个问题是:现在神经网络技术也应用到了工业视觉检测领域,而要做目标检测Yolo系列则是最常用的。但现在不论Yolo的哪个版本,输入图像都是某个固定宽高的一帧图像,那要在线阵相机输出的无限长图像上用Yolo做目标检测该怎么弄呢?把它拆成一帧一帧的图像再送给Yolo处理?那要是有个目标正好跨在被拆分的两帧之间呢?能不能改一下Yolo的代码,让它适应这种应用场景呢?我不是神经网络方面的高手,也不知道这个该咋改,大家有兴趣的可以思考一下,如果有高手知道还请不吝赐教!
第二个问题是一个简单的新手思考题:假如线阵传感器的分辨率是4096,拍摄的皮带宽度是50cm,皮带的运动速度是3米每秒,请问如果要让线阵传感器扫描到的物体图像保持原有物体的长宽比,也就是一个圆形物体过去后扫描到的图像也正好是圆的,不会被拉长或压扁,那请问线阵相机扫描的行频需等于多少?答案在视频最后。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在上述工业应用场景中,FPGA的处理流程大致如上图。首先图像传感器输出的数据信号会直接接到FPGA上。要用FPGA连接工业图像传感器的原因之一就是:工业图像传感器输出的LVDS数据编码格式似乎没有一个统一的标准,各家的都有些不一样,可能找不到合适的专用芯片去对接图像传感器。有的线阵传感器,比如一些红外线阵传感器,输出的还是模拟信号,还得自己整模数转换芯片,然后也只能让FPGA去采样AD之后的数字信号了。另外传感器的输入时钟也需要FPGA提供,因为这个时钟频率一般不是固定的,是需要根据实际需求修改的。
FPGA首先要解码LVDS信号中编码的信号,得到RAW数据。此时的Raw数据可能还需要进行解拜耳插值运算才能得到RGB模式的图像数据,RGB数据有时也还需要转为HSL颜色模式数据才会开始接下来的各种图像处理。
再看一下前面这张图,由于相机采样图像的位置和机械臂等执行机构执行操作的位置之间还有一段距离,所以FPGA把图像处理结果转为执行机构的控制信号后一般还需存储延时一段时间才能发出,好让执行机构能够精准抓住或吹到目标。
这个从相机视线到执行操作的距离间隔有时是很短的,比如只有几厘米,换算成时间大概在几十毫秒量级,换算成图像高度大概在一两百行。所以此时如果你传几百行图像给CPU或GPU后再开始处理,那延时就太长了。所以处理这种线扫的图像就不应该用很大的一帧做为单位,而是应该以一行做为单位,也就是来一行处理一行的流水线式处理。这样所需缓存的图像就是若干行,而不是要缓存很大的一帧,如此FPGA的片上存储就有可能够用.
所以在上述的应用场景中,FPGA是有可能不需要外接DDR缓存图像数据的。这也是要用FPGA做这种流水线图像处理的原因之一,因为在CPU或GPU中片上的存储并不能由用户编程控制,所以可能无法高效的实现某些我们需要的算法,只有片上存储完全可以被编程控制的FPGA才能做到。不过由于现在的GPU速度很快,也能在几毫秒内算完一帧图像,所以也是能用在这种场景的。只不过一般情况下也需要FPGA把采样到的图像数据通过某种线路传给GPU。然后处理结果可能还要传回FPGA,因为可能还是需要FPGA去控制执行机构。FPGA当然也能实现神经网络的推理,而且有它的一些优势,只不过现在用FPGA跑神经网络还是稍微麻烦了点,没有GPU那么容易编程。
上面简单讲了一下FPGA在工业上的一个典型应用流程。下面再讲一下为啥高实时性是FPGA做各种数据处理的重要优势。关于这个问题大家可以先去看一下我在某乎上的两篇文章。一篇是《FPGA图像处理的前景如何?》这个问题下的最高赞回答。另一个是《深入理解FPGA加速原理——不是随便写个C代码去HLS一下就能加速的》。
这里再来举一个简单的例子说明为什么只有FPGA才能达到最高的数据处理实时性。大家都听说过金融领域的高频交易算法也要用FPGA加速。高频交易要处理的数据来自交易所的服务器,所以如果要加快响应时间,除了网络延时要小之外,本地服务器处理的速度也要快,延时要小。那为啥要用FPGA加速呢?
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
请看上面这张图。一般以太网数据包是由网卡接收,并负责核查校验,校验没问题就把数据送到内存里并通知CPU进行处理。也就是说CPU就算速度再快,主频再高,也要等到一个或多个数据包被接收完整、检查校验并传到内存之后才能开始处理。但FPGA就不一样了,FPGA可以做到来一个字节处理一个字节,先看一下包头,确认这包数据的确是发到我这要处理的就可以开始处理后面的数据包了。
还能这样?难倒不需要等到算完包尾的CRC校验再开始处理?实际上是不需要的,可以先处理着,如果最后的校验出错,那就把当前的处理结果丢弃不采纳即可。由于校验出错是小概率事件,所以这样做几乎不会在错误的数据包上浪费计算资源。反而是充分利用了数据传输所需的这段时间,一边收数据一边处理,等数据接收完了,FPGA也差不多处理完了,能给出结果了。而这时如果是用CPU,则可能刚收到数据,才开始处理。
FPGA能做到一个时钟周期的数据来了之后,就在下个时钟周期把这个数据所需要的计算算完。以一个3乘3卷积核的图像卷积运算为例,在这样的卷积运算中,如果是一个时钟周期来一个像素数据,那每个时钟周期就需要进行9次乘法运算。在FPGA里可以并行9个寄存器、9个乘法器在下个时钟周期就完成这9次乘法运算。
这样以一个时钟周期为单位的实时数据处理只有能硬件编程的FPGA才能做到。这样就能充分利用了数据在传输过程中的这段时间,一边收数据就一边处理了,如此才能达到最高的实时性,也不可能比这更高了。会写代码实现这样的实时处理算法才算是会用FPGA进行计算加速。
在图像处理中也是一样,假如处理的是30帧的视频流,传输一帧图像的时间就需要33毫秒,如果等一帧图像都传完了再交给GPU处理,那相比于FPGA实现的一边传一边处理,得到结果的延时或许就会多出33毫秒。百公里行驶的车33毫秒内行驶的距离大约是1米,算法反应速度快这么一点,或许就能避免一些碰撞、追尾。
最后再来说一下FPGA相对于GPU到底有何优势。这个问题英特尔官网上的这篇文章:《FPGA vs. GPU for Deep Learning》已经帮我们总结了。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
上图是自动翻译的。主要优势讲了三大点:一是高吞吐量、低延时,二是高性价比、产品寿命长,三是低功耗。在讲低延迟的时候还讲了“确定性延迟”,这个确定性延迟又是啥意思呢?为啥说了低延迟之后还要说确定性延迟?
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
回想一下上个视频中数细胞的那个例子,得出上图结果的是连通域识别算法,用CPU实现的,这个算法可能就会出现所需处理时间不确定的情况,也就是算法给出结果的延迟不确定。因为按照CPU计算的常理,如果一幅图片上的连通域比较多,CPU所需的处理时间也得多一些,这很好理解。不好理解的就是,如果是用FPGA以上述实时流水线处理方式实现这个连通域识别算法的话,那就能做到不论图片上有多少个连通域,FPGA算法都能在固定延时内给出识别结果,延时大概是一行时间,也就是在连通域结束后的下一行给出结果。
这就叫做FPGA的确定延迟处理能力,这个能力在前面讲的目标检测和分选应用中就很关键。你不能说传送带上的物料一多,我给出处理结果的时间就要变长,如果物料密度很大时,等物料走到执行机构下面还没给出结果,那这套系统就算是失效了。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
英特尔这篇文章下面还讲了FPGA在消除内存缓冲和克服I/O瓶颈方面非常有用,还说了“这是AI系统性能最大限制因素之一”。这里的内存缓冲指的就是在运算中我们要把一些结果存回到DDR内存中再读出来。比如在做多层图像卷积时,按照常规CPU的处理思路,会先把图像从内存读到CPU进行计算再把结果存内存,等一帧图像第一层卷积都算完了,再去读刚才存的结果算第二层卷积。这种把第一层卷积的结果先全存回DDR再读出来的方式既浪费时间也非常耗能,而且DDR的带宽往往会成为速度和吞吐量的瓶颈。
[backcolor=rgba(18, 18, 18, 0.5)]
编辑切换为居中
添加图片注释,不超过 140 字(可选)
从上面这张PPT中可以看出,DDR读写的能耗是一般计算的千倍,所以要想省功耗,关键就是要减少对外部DDR内存的读写。FPGA可以通过灵活运用片上内存来达到这一目的,比如在上述的多层卷积运算中,第一层卷积的结果可以缓存在FPGA的片上Ram中,然后就开始第二层卷积的运算,中间结果无需存回DDR再读出来,这样既能克服内存带宽瓶颈,减少延时,也能减少很多功耗。那这样的多层卷积在FPGA中又该如何实现呢?之后的视频会继续讲述!
(所需频率:3000/(500mm/4096) = 24.576kHz)
|
|