【连载1.3】什么是图像加速引擎
0赞我们做的Sobel、Canny边缘检测、中值、均值、高斯滤波,腐蚀膨胀连通运算,以及帧间加减乘除运算等,其实他的合集就是OpenCV玩过OpenCV 小朋友对这些应该非常熟悉,Lib已经帮你封装好了这些功能,你可以直接调用。。OpenCV用于实现基本的计算机视觉,如上图所示,这就是最基本的应用(深度学习我们另说,这个本文说不清楚)。
那么继续发散一下思维,如何设计一个图像加速引擎呢?这部分内容超出了本教程,但是个人觉得还是得简单的讲一讲。对于终端产品(比如IPC相机)而言,采用CPU实现一系列实时的OpenCV算子非常吃力,毕竟ARM不是让你进行图像处理的,但是如果有一个图像处理引擎,计算只需要调用接口读取结果进行流水线操作,那么日子就好过多了,而这个引擎及就实现了很多个图像运算模块——算子,其功能可以用FPGA实现,或者ASIC中RTL实现。典型的海康集成FPGA的相机,或者采用Hisilicon的IPC IC的芯片,就是这样的结构:CPU只负责调用,硬件负责加速运算。
首先我们身边,监控无处不在,我们无时不刻暴漏在网络中,没有隐私的同时当然安全系数提高了一些,那么监控芯片除了Sensor最重要的SOC,就是IPC芯片了。这类芯片曾经的安霸已经被海思干趴下,现在还有君正,升迈,Mstar等,大家都是ARM+图像加速引擎+其他模块的结构。那么我们简单介绍一下海思3516的CV算子——IVE,IPC的只能加速引擎,如下所示:
该引擎主要的算子如下所示,惊奇的发现,几乎所有的算子我竟然都已经玩过一遍了,虽然我到后面才知道这已经不是什么新鲜的事,但至少被大家认可的硬件加速方式,是值得推说的。
事实证明设计一个OpenCV加速引擎并不是什么很难得事情,这只是一个合集,做的好一点可以实现多个算子的Pipeline运算(据说某对手做了)。但有一个完备的功能和优秀的性能,就不是一朝一夕的事,并且最重要的是有能服务客户的强大生态,以及准确的上层应用,比如家用监控中的遮挡检测,入侵检测,以及人脸检测灯等,就对性能有一定的要求。
然后某些熟悉Xilinx Revison观众要High起来了,是不是好熟悉的问题,因为Vivadp的Revision,竟然也集成了这些很多相似但又更多的算子,如下所示。看来采用FPGA或ASIC进行图像计算的加速,是一个大家公认的架构,并且这样的结构已经成熟应用于目前99.9%的IPC相机,机器视觉产品等。
https://www.xilinx.com/products/design-tools/embedded-vision-zone.html#computer
其实本人也在公司设计过IPC芯片,其中的CV算子就是我负责而设计的,当时非常的high,因为90%的算子我在研究生时代就对着冈萨雷斯的《数字图像处理(Matlab版)》实现过了,因此玩的飞起,最终产品遮挡检测、移动侦测、人脸检测就是基于这个CV引擎,用弱鸡的ARM调用实现的。如下所示,一个简单又够玩基本应用的图像加速引擎,Made By CrazyBingo(由于已经在IEEE Paper发表,因此拿出来说没毛病)。
OK,我们继续往大的说,继续往大的说,传统的CV引擎和我们的现在炙手可热的深度学习加速有什么关联呢?其实关系大而去 。传统检测就是个分类,而卷积神经网络也是个分配匹配的问题,只是一个是正向的检测,另一个是通过学习训练来收敛权重,最后通过打分得到结果。下图是经典的lenet字符识别网络,采用一系列卷积运算得到最终的打分结果。
采用FPGA实现深度学习功能这几年玩的很火,通用的架构无非两:PC+FPGA或ARM+FPGA,而在FPGA只做一个工作,那就是乘加运算,通常说的算力也就是频率*乘加数量。。相应的HLS和OPENCL也火起来了,虽然这两个东东在实现性能上还不能跟人工对比,但是可以快速采用高级语言给你综合出RTL,用于验证算法的可行性。
整体思路和我们设计传统CV引擎是类似的,也就是怎么将浮点定点话,然后流水线/并行的思维实现整个网络的运算。想了解更多FPGA深度学习加速引擎的小伙伴,可以看本人《FPGA设计技巧与案例开发详解(第三版)》的FPGA深度学习相关的内容,再此为了销量,不做展开了。
最后,赶紧清醒清醒,下面的章节我们将回归整体,介绍基于CrazyBingo设计的VIP Mini视频图像算法开发板(如下图所示),实现的FPGA图像处理硬件加速功能,加油加油,最后一次更新了!