出品 | 智东西公开课
讲师 | 张先轶 澎峰科技CEO
提醒 | 关注智东西公开课公众号,并回复关键词 嵌入式02,即可获取课件。
导读:
3月17日,澎峰科技CEO张先轶在智东西公开课进行了嵌入式AI合辑第二讲的直播讲解,主题为《利用AI开发板实现嵌入式视觉应用开发》。
在本次讲解中,张先轶老师从嵌入式AI开发板的设计经验、主流嵌入式AI开发板的差异,并结合澎峰科技Perf-RK3399开发板及PerfFace人脸识别算法,为我们系统讲解如何实现双目人脸识别应用开发。
本文为此次课程主讲环节的图文整理:
正文:
大家好,我是张先轶,今天我要分享的主题为《利用AI开发板实现嵌入式视觉应用开发》,我们会分为4个部分:
1、嵌入式AI开发板设计
2、主流嵌入式AI开发板介绍
3、利用Perf-RK3399开发板开发双目人脸识别应用
4、产品案例:实现人脸面板机
嵌入式AI开发板设计
我主要从用户或团队或者商业的角度来看,首先可能要回答两个问题,一个是我们为什么要自己去做一款嵌入式AI开发板?我们的需求在哪里?因为在市场上或者淘宝搜一搜,是不是已经有类似的产品、开发板可以买过来用,或者公司可以直接用,没必要再去做。因为开发板并不是一个赚大钱的业务,就像大家认为树莓派是非常成功的,但是树莓派在2019年底,它累计的销售额大概达到了3000万,这已经是他成立大概七八年多的时间累计获得一个量,这个量其实不算很大。但另一方面来说,它实际上还是很非常有利于培养社区的,如果大家对开源的精神或者社区建设有兴趣,可能是做一款合适的开发板,培养整个社区和生态。
当我们在解决为什么这么做时,你的需求肯定会在于差异性,例如你要做一款板子,如果你做的跟其他人的雷同性非常高,那代表着没有你存在的价值,直接买别人的就可以。比如你是用了新的主芯片,或外设接口,或价格更低,还是在这上面的配套的软件和案例更多,这些就是找准差异性。
对于如何做一款AI的开发板,首先是芯片选型,因为你现在肯定会去找一些带NPU的芯片,现在带NPU的SOC其实越来越多,找到一款合适的带NPU的SOC并不难,然后你的接口可能要配上摄像头、麦克风阵列,因为现在AI处理在边缘端主要与图像或语音相关,对于其他更复杂的情况,目前还无法实现。你还要做成本控制、配套的软件和案例等。最后开发板设计完后,它并不是开发板结束,它才代表了开始,后续的服务和社区的建设,或者你收集用户的反馈与迭代下一代的产品,或者你这基础上做一些专案设计,这才是你工作真正开始的地方。
主流嵌入式AI开发板介绍
我们用过很多AI开发板,据此稍微对比一下,如果我们在做边缘端的计算,他该怎么入手,因为市面上有很多不同种类,我其实是按种类来划分,第一个推荐是GPU类的产品,比如NVIDIA TX2或Nano,还有自动驾驶里可能用NVIDIA的GPU产品,相应AMD APU的SoC可能也有一些,比如v1605B。我把GPU放在最前面的原因就是一般这类型的开发板或者板卡,其实是很多客户或开发者最开始接触嵌入式AI方面上手的第一款的板子,它最大的优势就是生态非常好,不管是跑什么库,不管是跑TensorFlow、Caffe、PyTorch,它本身另一个系统都装了,你基本在unbuntu下载这些都很流畅的装起来,python也能跑,它可能跟服务器开发的体验几乎是一致的。
你可能在服务器上调的这些模型,放到TX2上,用同样的python脚本代码,你需要装SDK,然后可以直接做推理计算。比如通过USB摄像头或者通过网络传进来,或者通过其他方式传进来,你可能通过Opencv就把摄像摄像头的流就获取到,然后每帧做好模型,结果就出来了,它开发起来的速度还是挺快的,而且性能也还可以,再加上他本身的模型可以转化成浮点16比特,也就是模型的转换和部署是比较简单,基本上训练出来的单精度模型,你可以通过TensorRT转换,就可以直接调用,调试也很容易,这是他最大的优势。它的劣势是成本问题,比如自动驾驶的套件其实就价格都比较贵,这是在你的部署中会遇到硬件成本的问题,而且它的性能也没有那么好。
第二类是一些传统的嵌入式SoC,这里我中间放了一张抖音的图,这张图放在这里意思并不是所有做边缘端的AI计算,必须要NPU,它其实存在一些中低算力的需求,可能用一些已有的CPU或者一些集成的GPU就可以解决,典型的是一些美颜直播或者人脸门禁,他可能只运行在你的手机上,它的优势肯定是整体更成熟,硬件更成熟,成本更低,它支持安卓系统或者其他系统,可能界面开发更容易。挑战就是算力不够,如果模型大,可能跑不了那么高的帧数,可能一秒只能跑几帧,再加上它的性能优化很多部分在于使用了什么样的前端推理框架,比如说常用的NCNN或阿里的MNN或者你自己去优化自己的框架,因为这一部分的框架决定了你最后的性能和你最后使用的难易程度,后面会分享一下这部分的策略。
第三类是带NPU的SoC,这类型的板子在市面上越来越多,它们的算力也不错,基本上都可能3T、4T或者更高。从华为、瑞芯微到地平线,还有其他很多公司都在生产这类的板子。但我个人是比较喜欢这种NPU与主处理器或者AP是集成在一起的SoC产品,如果是分离式的,比如只是一个加速棒,可以通过USB插到这个板卡上,这种的方式我个人其实不大喜欢,因为这部分数据传输量其实也不低,而且最后硬件的稳定性上怎么弄,这可能都会有问题。单主芯片这种方案肯定是最好的,它的优势是性能高、硬件成本适中。他的一个挑战是模型的部署难,因为现在大部分的NPU都是定点模型,都是靠INT8的一个推理的模型。
在INT8的推理模型时,就必然涉及到量化和转换的过程,而量化和转换的部分,很多芯片公司都是要用自己的工具来转换,这里面可能要涉及到去调精度,这个精度是否能满足你的浮点模型的转换精度需求,这就要依赖于芯片公司的部署工具链是不是成熟?还有一点是很多时候这种转换它没有可编程性,因为一些应用它不只是做深度学习,它有可能还有一些别的处理部分,就造成那一部分的处理上没办法利用NPU这部分算力。
像华为的Atlas系列,因为里边有一些类似于计算阵列的存在,可能还可以做一些通用计算,但是有些可能做不到,这部分是设计的时候考虑的一些问题。
下一部分是FPGA, FPGA市面上用的不是特别多,因为它主要是满足一些对实时性要求比较高或工业级的应用,这些可能在车载用的比较多,像自动驾驶或辅助驾驶里边,他有一些可能会用FPGA来做。最大的挑战就是开发难度会比之前说那些都要更高一些,因为用FPGA,你可以用赛思灵提供的,或深鉴做的那一套工具IP,你也可以自研FPGA的AI core来做,这就涉及到底下加速盒的设计,上面你还有一套工具链你要做,上图右边是我们自己做的一套自研AI加速FPGA逻辑,我们支持了8比特量化。
如果你要自己自研,可能就涉及到量化方案怎么做,一般还要做下剪枝,来把模型的计算量降下来。之后涉及到转换,编译的过程,实际上就生成参数文件生成指定流,相当于把二进制文件烧到FPGA上,然后开始运行,大概是这样的过程。当然底下加速IP可能是要自己设计,这是FPGA方面的要做的一个事情。
最后是IoT级别或RISC-V相关的板卡,这部分有很多IoT+AI的需求,大部分是做语音的方面,也有做图像的,在这两种情况下,比如语音唤醒的系列,它的计算量并不高,并不是一个高计算量的的应用,我觉得可能用Cortex-M级别或者是AMR9这种比较旧的处理器就直接能做。
但是如果做图像这部分,肯定是处理不了的,一般都要加一个NPU或加一个小阵列进去,现在有一些RISC-V架构的芯片,包括Canaan k210、GreenWaves GAP8等。
如果你本身对Perf-V感兴趣,可以用一些我们的Perf-GAP8的FPGA板卡,他们在IoT级别主要就关注他的功耗的优势和小尺寸,由于本身的板卡可以做得很小,它的小尺寸可以用在这种非常小的手掌级的小无人机,或者智能门铃等。它的挑战还是算力,因为它本身比较小,它的算力没那么强。
最后,总结可能分为这几类,如果是新入门的开发人员,建议用NVIDIA TX2或AMD APU,这些比较好上手。如果你是做手机APP或对安卓有需求,可能就是大部分ARM开发板或者是买个手机试试,这里的核心问题是要选择合适的深度学习推理框架,然后要做这种软件的性能优化。然后其他的嵌入式有相同需求,可以选择带NPU的SoC。在低功耗的这一级别,基本上就是以IoT级别的开发板为主,这些需要根据你的具体的芯片来选择。
利用Perf-RK3399开发板开发双目人脸识别应用
下面是做一个人脸识别应用,这部分用到的是Rk3399开发板,它是一个没有带NPU的版本,是一个最传统的SoC,然后他支持Linux系统,可以跑安卓,支持单目或双目摄像头,因为它这本身就是标准的操作系统,这些推理框架也都可以做。我们之前做了人脸SDK的比对,人脸底库数量可以支持到1万人,然后支持本地的人脸注册和识别,速度可能是在150毫秒左右,这是做一个人脸的整个流程的识别。适应场景可能就是人脸的面板机或者是广告机的类似的场景,它的假设就是说摄像头里边的人脸数量不多,我的人脸的可能是一个人脸或是一个中近位置的距离,这部分可能要涉及到要用什么前向推理框架,这里面前向推理框架非常多了,我就不做过多列举。
上图是前向推理框架目前要设计做的点,核心点是我们设备支持的数量是不够多,我可能支持 CPU、GPU还是把DSP也支持,或FPGA也支持,肯定是支持越多,越容易能胜出。第二个是支持的模型种类更多,像支持网络结构和文件格式、支持浮点、支持定点、支持BF16、FP16等。第三是卷积、池化,因为卷积在软件层的优化可能是以矩阵乘为主,也可能做Winograd、直接卷积、FFT。
如果对于一些NPU来说,它可能把卷积做硬件的实现了,可能在硬件上实现了3*3卷积,我就是直接调用硬件部分,或者硬件支持的是一个矩阵,比如说是一个16×16或者4×4的矩阵或一个16×16的一个矩阵的直接矩阵乘法,我只要把我转换的数据排成矩阵的格式,我再给一点一点算出来就行。
对于定制算子,他可能是涉及到一个前后的计算量不高的部分,那一部分很多时候可能有时候会放回主核或者放到GPU上,很多时候那部分其实不是一个性能的重点,因为大部分的网络或者图像里边,这些网络大部分都是在卷积的操作上,上面的性能图比较旧,只是展示一下软件优化的效果,我只是做了一些不同化的切分,我可能性能就提高了一倍,就因为做了这种切分之后,我可以做多核并行化,所以说它的性能提升比较明显,这是之前的一个工作,只是说下软件优化的作用,其实很多时候还是有很多点可以挖掘。
对于做双目的人脸识别应用来说,人脸识别的整个流程的核心是把人脸转换成特征,它的流程主要有4步,第一步是人脸检测,把人脸框框出来,然后做关键点定位,知道他的鼻子或者是嘴在哪里,第三步是在定位的基础上做人脸的矫正,因为人脸有可能是歪的或扭的,我要把它正过来,形成比较正的矫正的方式在这里。在这前提下,做一个跑人脸特征提取的模型,这样我就把人脸转换成一个几百维的特征。
在1:N的人脸识别的意思就是我预先存入了100张的人脸,我就一张张传进去,然后每张人脸都走前面这4步的流程,然后转换成特征,然后我存了100个特征存到我的数据库里,通过摄像头获取到当前的人脸,我就会取到一个特征,拿这一个特征跟数据库里边100个特征去做对比,你可以理解为算一个距离,我看他离哪个更近,我就认为他可能是属于每个人,当然中间可能会存在置信度或阈值判定的问题,因为有可能这100个人都不像。
在双目摄像头应用里面的人脸检测这部分,主要衡量的点还是要平衡准确率和算力的需求,因为3399的硬件的算力比较低,所以我可能也不是在原图上做处理,因为原图做处理它的计算需求还是非常高的,这部分我就会做图像的缩放。对于缩放问题,你缩放到多大,其实是跟我们的任务目标有关系,如果是你想识别距离比较远,就意味着这个人脸在图像里的占比比较小,我一缩放完可能就把人脸色缩放没了,我肯定没办法去识别与检测。
如果我们的场景是人脸面板机这种,人靠的很近,可能就两米或一米,人脸在画面里的占比比较多,我缩放一下它其实还是能检测出来的,这时候缩放还是可以的。我们做了一个人脸检测,把人脸缩放到320*224,然后通过我们的框架和库做了一些的加速的操作。如果你本身是做NPU,比如安防摄像头,就是在1080p的原图上做的话也可以,然后我检测到人脸去识别。
在关键点定位上和人脸矫正的算力需求比较低,因为关键定位一般都是比较小的模型,然后人脸矫正就是一个映射旋转,还有Opencv的函数就可以,这可能不是一个重点,它的消耗比较少。然后在特征提取这部分上是大家PK的地方,可能你在服务器级别上是一个非常大的模型,但是你在边缘端肯定就会要做一个小模型,这决定你的人脸底库N大概能存多少,因为你存的多可能就区分不出来。
这块模型同时还要评估你的算力,一秒能识别多少张人脸,你也许性能很强,但10秒才能识别出来一张人脸,这可能就失去了边缘端计算的意义,它太慢了,还不如你把这图像传回云端,由云端来做。至于这个人脸特征匹配就查找的过程,这部分相对还好,不是特别慢,但是当你底库N很大的时候,这部分是有优化空间,比如说上万,但如果只是几千这种级别,这部分的时间占比还是比较低的。
提到活体检测,我们这部分活体上用了一个偷懒的方法,我们直接拿双目来做。活体常有配合式、非配合式,配合式就点头、眨眼,非配合是可以用单目的直接做,或者用双目来做,或者用3D摄像头来做,我们实际上是用了一个简单双目,比如对于手机屏幕这种成像,就可见光的摄像头里面实际上是成出来像的,但是右侧的这张你看是这种进红外的的摄像头,它实际上在手机屏幕上成不出人脸,实际上就是靠这个方法通过同时在两个摄像头里做人脸检测,看看是不是都能找到,或者只是在近红外做人脸检测,能不能找到人脸,然后用可见光的那个人脸去做识别,可能大概是这样的方法来做,就是防屏幕的操作。
在GPU的这部分上,刚才有人提到用GPU是不是会比CPU好,上图展示了我们在RK3099的平台上做的一个效果。在GPU上是非常强,它只是一个四核的还是T860,这是比较旧的一部分的做法,可以看到我们用了GPU优化之后,就YOLOv2版本,可以达到了190毫秒,要用CPU跑可能要六七百毫秒,可以看到性能还是提高了几倍的竞争效果。如果你在更新一代的处理器上,在GPU比较强的情况下,它可能能做的事情会更多了。
产品案例:实现人脸面板机
人脸面板机的主芯片选择非常多,现在主流还是用海思,比如海思3516DV300的比较多,因为他可以支持双目,之前不少用RK3288和RK3399,摄像头你可以选择单目、双目、3D还是用USB摄像头MIPI摄像头,然后是屏幕的尺寸,你的接口是不是带NFC读卡还是指纹,是否测温,这些可能都是在产品设计时候考虑的做的事情,还包括你的外壳。
上图是基于RK3399板子做的一个安卓上的效果,比如软件部分,除了刚才我讲的1:N的人脸识别类的应用来说,可能有些底库管理、注册模块、支持批量导入、设备配置、日志管理,这些可能都是一些常用的。 在这基础上可能还会再做一个服务器的管理平台,做设备的管理,你做具体的业务相关的开发或者什么那些或支持二次开发。实际上是自己做门禁用,做打卡机用,所以说这部分也有一些需求。