[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
工程火星探索
2019-4-1 16:26:30 显示全部楼层

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
image001.jpg
人类是有思想的。如果一个机器或机器人有智能的功能,那么它身上一定有“思想”——程序(工程师一般称之成为算法)。
汽车要实现自动驾驶这种智能功能,也是根据“思想”,采集各种数据比如 GPS、雷达信息和图像信息,然后对这些数据进行处理、学习和分析,才能控制汽车自动驾驶。这些都是通过人类编写程序,让汽车按照算法程序运行来实现的。
image002.jpg
你有没有想过这么多算法,究竟是谁在算,在哪算,怎么算?

以 RoboMaster 比赛中的一套视觉处理系统为例,我们首先需要读取摄像头的图像,然后用算法处理图像,把处理好的数据发给主控,主控就可以控制机器人了。
image003.gif
那我们就需要有一个计算平台去读数据、用算法、发数据。最会计算的是什么?算盘?计算器?别逗了,当然是计算机啦。就像我们可以把 U 盘插进电脑,处理文件,最后再拷出来。
image004.jpg
机器人要时刻进行运算,总不能让它背着电脑到处跑吧?这样看起来一点都不智能。机智的人类发明了嵌入式超级计算机,这种计算机很小,专门用来处理数据,可以嵌入机器人里。

它相当于一台电脑的小主机,如果接上了显示屏、键盘鼠标等外设,就能像常见的电脑一样打吃鸡、上网和看视频了。
image005.jpg
嵌入式超级计算机比普通电脑小,而且用途不同,在性能上也有很大差别。
针对不同的功能,它特定的性能会被优化,比如加强了读取照片速度、图像处理的计算能力、语音识别能力等等。像打游戏和上网这些在机器人身上几乎不需要的功能就会被弱化。

image006.gif
今天就教大家利用嵌入式超级计算机做一套视觉处理系统,来简单了解视觉的开发。在 RoboMaster 比赛中,如果机器人能够检测和识别目标,就相当于拿到了大 Buff。即使脱离了比赛,也可以用来做其他的识别应用。
image007.jpg
计算设备选型
嵌入式超级计算机有很多种,不同的体积、性能和价格适用于不同的应用,我们要找到适合机器人处理图像使用的一种,可以从分析需求入手:
读取图像

几乎每个计算设备都能读取单个摄像头,但如果我们需要同时读取多个摄像头,一般的计算设备就无法满足了。比如普通的 X86 平台,同时读取三个摄像头就会卡顿。
处理数据


做图像处理的时候,可能需要使用深度学习,巨大的数据处理量在性能较低的平台上跑不动,但也不能直接上个 TITAN(一万多元的图形处理显卡),就像打吃鸡时,敌人就在眼前可你却拿着八倍镜去瞄准他。
image008.jpg
机器人特性


机器人一般体积小,背着电池到处跑,而不是插在插座上随时充电。如果带着耗电量超高的设备,就要背着超多的电池,就像出门旅游要背着很多充电宝一样心累。所以计算设备要选择功耗低、体积小的。
image009.jpg
我们选择一款有代表性的嵌入式超级计算机,NvidiaJetson TX2(以下简称 Jetson TX2)。机器人姿态估计,路径规划和自动检测都可以用它进行计算数据采集和算法解算。
我们简单看下这个计算机的参数,分析它在机器人中是否适用:
image011.jpg
1、功耗低:作为可移动设备,功耗越低,机器人持续工作的时间就越长。
2、256 颗 CUDA 核心的 GPU:CUDA 是一种并行计算架构,并行就是大家一起来计算,复杂的计算也可以完美解决。

深度学习的网络一般有上万个神经元,每个神经元的参数都是浮点型数据,CPU 在进行一次运算大概需要几秒甚至十几秒,而使用 GPU 大概只需要几十毫秒。
image012.jpg
CPU 就像跑车,虽然快,但是每次处理的内容极少,GPU 就像大卡车,虽然慢,但处理量特别大。所以用带有 CUDA 的 GPU 可以加速算法的运行。
image013.jpg
3、8G 内存:在运行深度学习网络之前,需要把网络的参数都加载到内存中,而网络的参数是非常巨大的,8G 内存足够我们使用。
4、提供了 PCIE 接口:如果硬盘空间不足,还可以外接一块硬盘。

5、核心板小巧:JetsonTX2 的核心板(左图)非常小,如果觉得 JetsonTX2 开发板(右图)太大,可以不要开发板,直接给核心板换一个小的载板,使用起来更加轻便。
image014.jpg
RoboMaster 参赛队员在选择视觉程序运行平台时,也会综合各方面考虑。
华南理工大学的队员说,选择平台时他们主要考虑三方面:运行效率、底层嵌入式设备的连接、硬件安装与拓展。Jetson TX2 有两个好处,一是它专注于视觉识别,有配套的适于开发视觉功能的包,运行效率高;二是可拓展性好,它的核心板子可以连接其他设备,与机器人比赛需要的嵌入式设备的亲和度高。
计算设备选型完毕,我们可以开始设计视觉处理软件的架构。
软件架构设计

我们以检测机器人装甲板和识别手写字的功能为例,简单分析一下需求:
image015.jpg
1装甲板检测和手写字识别是两套完全不同的算法,需要做两个框架。
2装甲板检测有很多种算法可以实现,我们要设计一个多种算法都能使用的框架,提高框架代码的利用率。就像做一个通用的轮子让单车摩托车大卡车都能用。
3数字识别需要使用机器学习技术,就一定要用 CUDA 去加速计算,不然有那么多东西要学,等机器学成归来,我们的头也秃了。
4俗话说眼观四方,一台机器人需要用多个摄像头检测四周,所以框架也要包含多个摄像头数据读取。
分析完需求,我立马变出了一个架构,但这绝对是我勤勤恳恳设计出来的软件架构,不信我们分析一下。

image016.jpg
它主要分为四层:
第一层:驱动层(让外部硬件设备动起来)

我们用四个线程来读取四个相机,分别获得图像。就像同时让四个人去拍照,而不是一个人抓着四个相机轮流拍。
image017.jpg
第二层:缓存层(放图片的小口袋)


一般我们拍了照就会把内存放到硬盘里,要用的时候再拿出来。而缓存层就像随身带的一个小口袋,图片读取了就放进去,不用每次都慢慢地去硬盘里找。
image018.jpg

我们把每个相机的图像放到一个双 buffer 容器(图中颜色相同的方框,如 buffer10、buffer11 共同组成一个双 buffer 容器),第一帧放到第一个 buffer 中,第二帧放到第二个 buffer 中,往复循环,这样可以降低算法的延时。
不过这么做也有缺点,因为是用空间换取了时间。但是我们有 8G 的内存呀,空间表示毫无压力。
第三层:算法层(图像处理深度学习的部分)

算法层这里只需要声明 image_buffer 的一个对象,然后调用获取图像的函数,把 camera_id(相机编号)传递进去就可以得到相应 camera 的最新图像了。之后我们就可以用该图像做滤波、特征提取等等处理。
image019.jpg
整个流程就像,首先让四个人去拍照,拍完放在他们的小口袋里,要的时候就直接去他们的小口袋里掏出来拿去处理。
如果是效率低的框架,就要一个人拍四张,然后放进整理箱,我们要用的时候再去打开整理箱,把照片搬过来,然后再处理,过程就很慢。
第四层:用户层(使用服务的用户)

用户层可以通过".xml"或者".prototxt"等配置文件来选择用什么算法,非常简单方便。就像顾客直接通过菜单点菜就能得到要的算法了,而不需要他再自己种菜买菜洗菜切菜做菜。
image020.jpg


把检测和识别的结果传进Decision-Making 层,在这一层做出决策。然后将决策结果传递给 MCU(机器人的主控,用来控制机器人要逃跑还是要射击)或者传递给操作手,以此完成整个流程。
image021.jpg

搭建视觉处理框架
思路当然是最重要的,思路有了,代码实现就非常容易了,我们分两个模块:
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 上按照如下步骤进行操作。
先打开命令行,然后敲入如下命令
image022.jpg
添加个环境变量:
image023.png
运行例程

image024.jpg
这样就可以在终端对程序进行控制了,输入 1 启动子程序进行装甲板检测,输入 2 暂停,输入 3 终止。
image025.jpg


Jetson TX2 还可以应用于很多领域,比如无人机目标检测、三维建图,无人车行人车辆检测、交通等识别,智能公交站实施显示天气、公交信息等都可以用 Jeton 作为计算平台。
image026.png
手写字识别怎么做呢?这里就给大家留个作业,大家可以参考往期同类文章:《机器人如何在复杂的环境下进行视觉识别?》,做完可以在后台留言哦。如果你对代码系统设计、算法、TX2 相关的方面有新的想法,也欢迎和小R 交流。
本期作者
image027.jpg




image029.jpg





image010.jpg
跳转到指定楼层

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
工程火星探索
 楼主| 2019-4-20 11:25:52 显示全部楼层
永不言弃 发表于 2019-4-8 21:03
我知道一块小小的电路板我需要吃土一周

不慌 一周就能买,换到我要吃土一个月

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
梯队队员风一般的控制
2019-9-5 16:12:16 显示全部楼层
楼主你好,智能公交站实施显示天气是指获取互联网上的数据还是通过检测环境数据判断天气?

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
英雄视觉小白
2019-4-21 21:17:45 显示全部楼层
你有没有想过一块小小的电路板将会要你啃多少时间的馒头

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
工程花师小哲
2019-4-1 16:38:55 显示全部楼层
TX2啊,可以可以,虽然我们不用

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
步兵拍卖小行家
2019-4-1 18:13:29 显示全部楼层
支持下吧~~哈哈哈哈

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
补给站robomaster
2019-4-8 14:37:14 显示全部楼层
顶一下嗨
回复

使用道具 举报

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
正式队员气旋
2019-4-8 18:29:47 显示全部楼层
你有没有想过一块小小的电路板将会要你啃多少时间的馒头

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
英雄永不言弃
2019-4-8 21:03:58 显示全部楼层
我知道一块小小的电路板我需要吃土一周

[嵌入式] 「2019-6」【每周分享】小小电路板竟让处理视觉信息效率...

[复制链接]
顾问yuan道
2019-6-19 19:44:07 显示全部楼层
都是有钱银
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表