「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...
![火星探索](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000017620_avatar_big.jpg)
人类是有思想的。如果一个机器或机器人有智能的功能,那么它身上一定有“思想”——程序(工程师一般称之成为算法)。
汽车要实现自动驾驶这种智能功能,也是根据“思想”,采集各种数据比如 GPS、雷达信息和图像信息,然后对这些数据进行处理、学习和分析,才能控制汽车自动驾驶。这些都是通过人类编写程序,让汽车按照算法程序运行来实现的。
你有没有想过这么多算法,究竟是谁在算,在哪算,怎么算?
以 RoboMaster 比赛中的一套视觉处理系统为例,我们首先需要读取摄像头的图像,然后用算法处理图像,把处理好的数据发给主控,主控就可以控制机器人了。
那我们就需要有一个计算平台去读数据、用算法、发数据。最会计算的是什么?算盘?计算器?别逗了,当然是计算机啦。就像我们可以把 U 盘插进电脑,处理文件,最后再拷出来。
机器人要时刻进行运算,总不能让它背着电脑到处跑吧?这样看起来一点都不智能。机智的人类发明了嵌入式超级计算机,这种计算机很小,专门用来处理数据,可以嵌入机器人里。
它相当于一台电脑的小主机,如果接上了显示屏、键盘鼠标等外设,就能像常见的电脑一样打吃鸡、上网和看视频了。
嵌入式超级计算机比普通电脑小,而且用途不同,在性能上也有很大差别。
针对不同的功能,它特定的性能会被优化,比如加强了读取照片速度、图像处理的计算能力、语音识别能力等等。像打游戏和上网这些在机器人身上几乎不需要的功能就会被弱化。
今天就教大家利用嵌入式超级计算机做一套视觉处理系统,来简单了解视觉的开发。在 RoboMaster 比赛中,如果机器人能够检测和识别目标,就相当于拿到了大 Buff。即使脱离了比赛,也可以用来做其他的识别应用。
计算设备选型
嵌入式超级计算机有很多种,不同的体积、性能和价格适用于不同的应用,我们要找到适合机器人处理图像使用的一种,可以从分析需求入手:
读取图像
几乎每个计算设备都能读取单个摄像头,但如果我们需要同时读取多个摄像头,一般的计算设备就无法满足了。比如普通的 X86 平台,同时读取三个摄像头就会卡顿。
处理数据
做图像处理的时候,可能需要使用深度学习,巨大的数据处理量在性能较低的平台上跑不动,但也不能直接上个 TITAN(一万多元的图形处理显卡),就像打吃鸡时,敌人就在眼前可你却拿着八倍镜去瞄准他。
机器人特性
机器人一般体积小,背着电池到处跑,而不是插在插座上随时充电。如果带着耗电量超高的设备,就要背着超多的电池,就像出门旅游要背着很多充电宝一样心累。所以计算设备要选择功耗低、体积小的。
我们选择一款有代表性的嵌入式超级计算机,NvidiaJetson TX2(以下简称 Jetson TX2)。机器人姿态估计,路径规划和自动检测都可以用它进行计算数据采集和算法解算。
我们简单看下这个计算机的参数,分析它在机器人中是否适用:
1、功耗低:作为可移动设备,功耗越低,机器人持续工作的时间就越长。
2、256 颗 CUDA 核心的 GPU:CUDA 是一种并行计算架构,并行就是大家一起来计算,复杂的计算也可以完美解决。
深度学习的网络一般有上万个神经元,每个神经元的参数都是浮点型数据,CPU 在进行一次运算大概需要几秒甚至十几秒,而使用 GPU 大概只需要几十毫秒。
CPU 就像跑车,虽然快,但是每次处理的内容极少,GPU 就像大卡车,虽然慢,但处理量特别大。所以用带有 CUDA 的 GPU 可以加速算法的运行。
3、8G 内存:在运行深度学习网络之前,需要把网络的参数都加载到内存中,而网络的参数是非常巨大的,8G 内存足够我们使用。
4、提供了 PCIE 接口:如果硬盘空间不足,还可以外接一块硬盘。
5、核心板小巧:JetsonTX2 的核心板(左图)非常小,如果觉得 JetsonTX2 开发板(右图)太大,可以不要开发板,直接给核心板换一个小的载板,使用起来更加轻便。
RoboMaster 参赛队员在选择视觉程序运行平台时,也会综合各方面考虑。
华南理工大学的队员说,选择平台时他们主要考虑三方面:运行效率、底层嵌入式设备的连接、硬件安装与拓展。Jetson TX2 有两个好处,一是它专注于视觉识别,有配套的适于开发视觉功能的包,运行效率高;二是可拓展性好,它的核心板子可以连接其他设备,与机器人比赛需要的嵌入式设备的亲和度高。
计算设备选型完毕,我们可以开始设计视觉处理软件的架构。
软件架构设计
我们以检测机器人装甲板和识别手写字的功能为例,简单分析一下需求:
1、装甲板检测和手写字识别是两套完全不同的算法,需要做两个框架。
2、装甲板检测有很多种算法可以实现,我们要设计一个多种算法都能使用的框架,提高框架代码的利用率。就像做一个通用的轮子让单车摩托车大卡车都能用。
3、数字识别需要使用机器学习技术,就一定要用 CUDA 去加速计算,不然有那么多东西要学,等机器学成归来,我们的头也秃了。
4、俗话说眼观四方,一台机器人需要用多个摄像头检测四周,所以框架也要包含多个摄像头数据读取。
分析完需求,我立马变出了一个架构,但这绝对是我勤勤恳恳设计出来的软件架构,不信我们分析一下。
它主要分为四层:
第一层:驱动层(让外部硬件设备动起来)
我们用四个线程来读取四个相机,分别获得图像。就像同时让四个人去拍照,而不是一个人抓着四个相机轮流拍。
第二层:缓存层(放图片的小口袋)
一般我们拍了照就会把内存放到硬盘里,要用的时候再拿出来。而缓存层就像随身带的一个小口袋,图片读取了就放进去,不用每次都慢慢地去硬盘里找。
我们把每个相机的图像放到一个双 buffer 容器(图中颜色相同的方框,如 buffer10、buffer11 共同组成一个双 buffer 容器),第一帧放到第一个 buffer 中,第二帧放到第二个 buffer 中,往复循环,这样可以降低算法的延时。
不过这么做也有缺点,因为是用空间换取了时间。但是我们有 8G 的内存呀,空间表示毫无压力。
第三层:算法层(图像处理深度学习的部分)
算法层这里只需要声明 image_buffer 的一个对象,然后调用获取图像的函数,把 camera_id(相机编号)传递进去就可以得到相应 camera 的最新图像了。之后我们就可以用该图像做滤波、特征提取等等处理。
整个流程就像,首先让四个人去拍照,拍完放在他们的小口袋里,要的时候就直接去他们的小口袋里掏出来拿去处理。
如果是效率低的框架,就要一个人拍四张,然后放进整理箱,我们要用的时候再去打开整理箱,把照片搬过来,然后再处理,过程就很慢。
第四层:用户层(使用服务的用户)
用户层可以通过".xml"或者".prototxt"等配置文件来选择用什么算法,非常简单方便。就像顾客直接通过菜单点菜就能得到要的算法了,而不需要他再自己种菜买菜洗菜切菜做菜。
把检测和识别的结果传进Decision-Making 层,在这一层做出决策。然后将决策结果传递给 MCU(机器人的主控,用来控制机器人要逃跑还是要射击)或者传递给操作手,以此完成整个流程。
搭建视觉处理框架
思路当然是最重要的,思路有了,代码实现就非常容易了,我们分两个模块:
1、 Jetson TX2 环境配置(框架中有很多模块,比如说视觉处理和加速模块等等,环境配置就是告诉大家这些模块在哪,才能找到并使用它们。)
2、运行例程(知道模块位置在哪后,运行例程就是使用这些模块。)
环境配置
有基础的小伙伴们可以到[NVIDIA](https://developer.nvidia.com/embedded/jetpack-notes)官网参考 JetPack 的手册,按照教程一步步配置环境。
不会配置环境的小伙伴不要方,我们已经帮大家把环境配置好了,你只需要将[系统镜像](https://mega.nz/#!ekImlDCR!Rlv88 ... -Vd6nfF7MqteRPuijA4)克隆到你自己的 Jetson TX2 就可以了,克隆方法参考[官方教程](https://elinux.org/Jetson/TX2_Cloning)。
环境配置好之后,我们需要写个代码运行例程。因为代码太复杂了,我们已经将所有代码工程上传到 github 了,现在只需要在自己的 Jetson TX2 上按照如下步骤进行操作。
先打开命令行,然后敲入如下命令
添加个环境变量:
运行例程
这样就可以在终端对程序进行控制了,输入 1 启动子程序进行装甲板检测,输入 2 暂停,输入 3 终止。
Jetson TX2 还可以应用于很多领域,比如无人机目标检测、三维建图,无人车行人车辆检测、交通等识别,智能公交站实施显示天气、公交信息等都可以用 Jeton 作为计算平台。
手写字识别怎么做呢?这里就给大家留个作业,大家可以参考往期同类文章:《机器人如何在复杂的环境下进行视觉识别?》,做完可以在后台留言哦。如果你对代码系统设计、算法、TX2 相关的方面有新的想法,也欢迎和小R 交流。
本期作者
请问这篇文章对你有用吗?
「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...