用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缓存了之后再读出来处理。
这样的数据流处理显然是次序读取数据的,那么也就只能完结那些次序读取数据的算法,也便是图画处理中那一大类用3×3到NxN的算子进行的滤波、取边际、胀大腐蚀等算法。或许咱们会觉得这些运算好像都是最根本的图画处理运算,仅仅个前端的预处理,好像用途不大。但问题是只要FPGA做这样的运算才是速度最快功率最高的,比方用CPU做一个取边际的算法根本就达不到实时。别的别小看了这种NxN算子法,它能够有各种组合和玩法,能够完结分选多种色彩,乃至分辩简略形状等功能。FPGA进行的这种算子法处理是并行流水线算法,其延时是固定的,比方用3×3的算子进行处理其给出成果的延时是两行图画的时刻。还有这个算子法和现在卷积神经网络中最前面的卷积层运算是相似的。
FPGA中的Block Ram是重要和稀缺资源,能缓存的图画数据行数是有限的,所以这个NxN的算子中的N不能特别大。当然FPGA也能够接DDR把图画缓存到其间再读出来进行处理,但这种处理形式就和CPU差不多了,达不到最高的实时性。其实有些咱们以为需求随机读取数据的图画处理算法也是能够并行流水线化的。
在密布运算中,耽误时刻和耗费功耗的操作往往不是运算自身,而是把数据从内存中搬来搬去。GPU,CPU在进行运算时要把数据从内存中取出来,算好了在放回去。这样内存带宽往往成了运算速度的瓶颈,数据转移过程中的功耗占的比重也不会小。FPGA则能够经过堆许多核算硬件的办法把要做的运算都打开,然后数据从中流过,完结一个阶段的运算之后就直接流入第二个阶段,不需求把一个核算阶段完结后的数据再送回内存中,再读出来交给下一个阶段的运算。这样就会节约许多时刻和功耗。现在用FPGA做图画处理便是这样干的,比方先用一个3×3的算子进行滤波,再用一个3×3的算子进行取边际,在FPGA流水线算法中,滤波处理完了数据当即就会进行取边际处理,是不需求像CPU那样存回内存再读出来的。
FPGA进行图画处理的远景仍是挺宽广的,越来越多的工业使用场合都要求更高的实时性,而这正是FPGA所合适的。还有机器学习范畴,神经网络这种层状的,不需求很随机的读取数据的运算是比较合适用FPGA来做的。不过FPGA不拿手浮点运算,如果能整出不需求浮点运算的神经网络,那么FPGA在这方面的使用将会更大。
前些年用matlab和opencv做图画处理。近一段时刻经过FPGA处理摄像头视频数据,有太多感受,杂乱的算法先不提及,单是上面文章中说到的一些处理手法及战略,十分受用。