嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

开始支持机器视觉:应对人机大战

对于曾多次了解这一领域的人们而言,对机器视觉的最初概念可能都来自电影终结者,影片中我们受到了红色主调的增强现实版 T-800 终结者的威胁。

Terminator_AR_40c31db00b1b41ffd25b02fcca815af8ddf3f938.jpg

 

在这张图片中,我们看到终结者正在获取图像数据,实时加以处理,然后根据从数据流中提取的重要信息做出决策。有趣的是,反应敏捷的人们(熟悉指令集,懂得 Atari 800 [或 Apple II] 编程)可能会发现 T-800 正在运行 6502 汇编代码。仔细想想:这可能就是机器人最开始产生自我意识的原因吧。对不老实的军事硬件承包商的忠告:如果您打算开发使用神经网络 CPU 且具备学习能力的杀手机器人,就不要让他们访问自己的源代码 - 当然,他们这样会把一切搞砸!起码要删了备注,把代码混淆打乱;我想“为笨蛋准备的邪恶编程”大概就是这样的……

我有点跑题了。我想说的是,终结者具备了现实机器视觉应用的所有组件,因为它拥有眼部摄像头的立体图像采集功能(搭配可调光学成像和多谱成像),可在任何距离范围和低可见光操作中支持深度感知。随后,在神经网络“学习计算机”中运用数字图像处理技术,从环境中提取所需的信息,帮助终结者制定可通过“超合金战斗底盘上的活体组织”执行的决策。实际上,这已经距离自动驾驶汽车不远了。

当然,终结者本身并不需要与图像数据相关的增强现实 (AR) 覆盖图 - 那是为我们这些观众准备的 - 但这也从另一个方面体现了机器视觉技术的前景,让人们了解如何在不久的将来运用 AR 眼镜,为现实世界里工作的人们提供额外的环境数据。很显然,率先采用这种显示屏的是军事领域,他们在航天领域的头戴式显示屏 (HUD) 中运用 AR 已经很多年了,很多人想要把这一优势扩展到步兵部队中。可是在展示信息上还有待权衡,这是为了防止这种增强的技术分散人员注意力

就目前来看,要在机器视觉应用中搭配光学和帧捕捉器或摄像头与支持实时图像处理的处理单元是非常昂贵的,除非您拥有自己资金充足的实验室,具备工业自动化检测能力或是有工业机器人指导,才有可能找到这种装备。不过好消息来了,现在您就可以接触到低成本的机器视觉,而且我们不需要终结者的“审判日”核启示。

Intel® RealSense™ ZR300 简介

ZR300 摄像头有点像在已经很紧凑的 Intel Joule 上安装您自己的电脑成像实验室。连接到嵌入在单元中的成像 ASIC 的项目包括:

  • 一台全高清 1080p RGB 彩色摄像头
  • 左右一对用于立体成像的 VGA (640 x 480) IR 摄像头
  • 一台 IR 激光投影仪(帮助确定低组织场景中的景深,即大面积平整表面的场景,如内墙)

还有:

  • 一台 VGA (640 x 480) 单色鱼眼摄像头
  • 一个 6 自由度 (6DoF) 惯性测量装置
  • 与一个 50µs 参考时钟同步的时间戳

在 ZR300 外壳内,这些功能的布局如下所示:

ZR300_casing_layout4_fde62594ad27f056125456489314de25317024d2.jpg

 

这一切意味着,您只需一个装置即可实现以下应用:

  • 对象识别、定位和追踪
  • 人员识别、追踪和手势识别
  • 6DoF 同步定位和映射 (SLAM)

基本上,我们可以提供您着手打造自己的终结者视觉系统所需的一切 - 但提供不了超合金战斗底盘上的活体组织,所以您需要自己购买。但要注意的是,我不确定终结者的 USB 3.0 连接器藏在哪里...

 将 ZR300 连接到你的 Intel Joule

之前我们已经说过连接到 Intel Joule 是很轻松的,方便我们访问一些出色的样本软件,从而在 ZR300 中利用 Intel 的 RealSense 对象库、人员库和 SLAM 库 API。对任何机器人项目来说,只要是需要感知周围环境(支持自主操作)且/或识别任何可能遇到的对象或人,这些都提供了海量的“快速入门信息”。

如果您读过我之前的贴子,就会知道如何设置自己的 Intel Joule 来运行 Ubuntu 16.04 LTS。但这一回,我们需要制作硬件模块和 BIOS 模块来支持我们的成像项目。

硬件模块

我们将要运行的图像处理应用属于高度计算密集型,这种应用会让伺服环下面的 Atom 处理器发热,但不会改变有源冷却解决方案套件的无源散热片 - 即带风扇的散热片安装此机制之后,可以确保气流向下流经散热片,使空气通过叶片输出;随后,准备好连接其余装备,包括:

  • ZR300 – 通过 ZR300 套件随附的 USB 3.0 线缆将其连接至 Joule 设备板上的 USB A 连接器。ZR300 背面有一块磁铁可供连接摄像头套件随附的 2 个不同配件,其中一个配件支持将 ZR300 安装在标准的摄像头三脚架上。另外还有固定螺丝孔,可用来连接套件随附的支架(参见下图)
    Labelled_RZ300_15_4c851d1888a840e946106caa5c6c681cf35d1377.jpg
























    Labelled_RZ300_23_c5126d1c9833064b3676a1794f0de1ae2a84a81c.jpg























  • 这一次,我们要将有源 USB 集线器(适用于键盘、鼠标及其他任何 USB 外设)连接至 USB-C 连接器,也就是需要将标准的 USB A 连接至某种不包括在套件中的 USB C 适配器。
  • 为了保证完整性,您需要确保有正确的布线  (852-5352)  及适配器,以便将监控器连接至 Joule 电路板上的微型 HDMI 连接器,同时还需要可在 12V 时提供至少 3A 电流的电源 (018-8769)

 

BIOS 模块

硬件设置完毕后,我们需要将电源开启到 11 - 实际上是 8,因为我们在 BIOS 中设置了电源限制:

  • 启动后,在 Ubuntu 开始加载之前,按 [F5] 键打开 BIOS 的设备管理器。
  • 我们按照菜单路径操作:系统设置 > CPU 配置 > CPU 电源管理

随后,确保“电源限制 1 启用”设置为 <已启用>:Screen_Grab_14_225e9494b360d8eab6a3bcca8bfd1ce8e760d257.jpg

























  • 接着,我们将降低几位,将“电源限制 1 电源”设置为“飞速”(其他情况设为 8):
    Screen_Grab_24_ad3bc76f33ccf1555424419f9f715643e5ee03ae.jpg


























  • 最后,我们保存这些设置并重启,开启全新娱乐模式

安装 RealSense SDK

完成这些模块的操作后,我们几乎已经准备好了。现在要做的就是通过样本软件使用 SDK. 

时间

首先,您要确保根据所在地区将 Joule 设置为正确的时间。Joule 不带实时时钟电池,因此在安装时通常需要将 Ubuntu 设置为自动更新网络时间和日期。要为您的 Joule 完成此设置,最简单的方法就是单击“系统设置”(通常为启动栏上的最后一个默认图标)。“时间和日期”位于系统设置窗口底部(“系统”下面):

Screen_Grab_32_e390a7964c09f286a2ab6cdb597c14ad1cbfdbc5.jpg

 

单击该图标,确保您在“设置时间”属性中设置了“从网络自动更新”单选按钮:

Screen_Grab_4.jpg3_df08f1215500297c18772b3d3c0ad18ac53119b7.png

 

当然,如果您想要手动设置时间,可以在此窗口中操作,或者在命令行中输入以下格式的命令:

$ sudo date –s “13:20 7/31/2017”

此命令还会告诉设定的日期是未来的哪一天(如果碰巧的话)...

存储库

下一步是将 RealSense 存储库添加到 Ubuntu 文件包管理器:

$ echo 'deb "http://realsense-alm-public.s3.amazonaws.com/apt-repo" xenial main' | sudo tee /etc/apt/sources.list.d/realsense-latest.list

$ sudo apt-key adv --keyserver keys.gnupg.net --recv-key D6FB2970

$ sudo apt update

安装运行时和样本

为此,我们只需安装刚刚添加的存储库中的文件包即可:

$ sudo apt install librealsense-samples beignet-opencl-icd

安装完毕后,我们可以使用以下命令在 ZR300 上预览每个摄像头的实时视频流:

$ sudo apt install librealsense-utils

最后,我们可以安装 RealSense SDK,以便开发自己的应用:

$ cpp-capture

Finally, we can install the RealSense SDK so that we can develop our own apps:

$ sudo apt install librealsense-object-recognition-dev librealsense-persontracking-dev librealsense-slam-dev

...然后克隆来自 Github 的样本软件,以便查看源代码,了解如何综合这些示例自行完成构建。首先是安装 Git 和其他必要工具:

$ sudo apt install git cmake libjpeg-dev libopencv-dev

这通常已经安装好,但若您发现自己无法编译样本软件,则可能要将 build-essential 添加到上面的安装列表中。接下来,我们将克隆来自 Github 的样本。我将此样本放入新文件夹“Projects”中:

$ mkdir Projects

$ cd Projects

$ git clone http://github.com/IntelRealSense/realsense_samples

$ cd realsense_samples

您可以根据需要构建这些示例:

$ mkdir build

$ cd build

$ cmake ..

$ make

一旦构建完毕,我们可以插入自己的 ZR300,现在机器视觉已经准备好了。

软件示例

RealSense SDK 中已经预先构建了一组完整的软件示例(您可在 /usr/bin 中找到这些可执行程序),因此您只需运行它们就可以了,不必一切都由自己构建。这些可执行程序的每个示例名称都带 rs_ 前缀:例如,对“slam_tutorial_1_web”示例预编译的可执行程序为“rs_slam_tutorial_1_web”。

如果您自行构建这些示例的话,就会发现此文件夹中每一个全新的可执行程序在“build”文件夹下面都包含此样本的源代码。而我就在如下位置找到了“slam_tutorial_1_web”可执行程序:/Projects/realsense_samples/build/samples/slam_tutorial_1_web.

另外还有几组示例使用对象库、人员库和 SLAM 库。每一组示例都是从基本教程应用开始的,主要展示如何使用函数功能。接着,后续教程应用将以前面展示的内容为基础,因此,在每个 SDK 库示例系列的末尾都会继续使用一些比较熟悉的机器视觉或空间意识计算。这些库及软件示例全都是用 C++ 语言编写的。

本文不打算详细讲解这些示例,但我们可以简单介绍一个多模式示例,它在基于 Web 浏览器的应用中综合了大量 ZR300 资源。透过这个示例,您就会知道在 ZR300 连接到 Intel Joule 的第一天可以使用哪些功能。

slam_or_pt_tutorial_1_web

本示例展示了来自彩色摄像头和鱼眼摄像头的实时视频流。同时,浏览器中的网页输出还显示了所在区域的 SLAM 占用地图以及鱼眼摄像头、深度摄像头、陀螺仪及加速计的输入和追踪 FPS(每秒帧数)数据。

此示例的源代码位于/realsense_samples/build/samples/slam_or_pt_tutorial_1_web

我们可以通过以下命令行从任意目录中开始预先构建示例的可执行程序:

$ rs_slam_or_pt_tutorial_1_web

这将启动一个 Web 服务器,您随后需要手动将其连接至 Web 浏览器:

Screen_Grab_5.jpg3_1d77dcf9f950b9b21c490e130edcd23df843eeb0.png

 

如果将鼠标悬停在突出显示的 Web 地址(我们上图中的 http://172.30.44.97:8000/view.html)上并单击右键,即可在显示的菜单中选择“打开链接”以在默认浏览器中打开该地址。

一旦服务器具有客户端,示例便会设置为识别对象并在终端报告这些对象。同时,实时馈入将转至 Web 浏览器,并且提供通过对摄像头前方区域进行 SLAM 处理得出的地图数据(左上角的大图),而在浏览器的右上角会报告传感器的数据速率。ZR300 将持续不断地馈入数据,它无法协商,也无法推理,不会产生怜悯、自责或恐惧心理。而且这个过程绝对不会停下来...直至您在终端按下 [Esc] 或 [Ctrl] C 为止。

 

Screen_Grab_61_ee2df1300c2a724d9b97a04e0259aab25bf625d1.jpg

 

SLAM 地图

随着您朝四周移动摄像头,便会绘制这么一张图。其中有一个“锥体”,实时展示摄像头的 3D 视场 - 当您移动摄像头时,椎体也会随之移动。在地图中会标记出摄像头前方哪个位置有障碍物(地图上的灰色斑点区域)以及在哪个位置可以找到各个已识别的对象(来自彩色图像馈入)。这些内容均以 3D 模式展示,如下图中的地图所示:

Screen_Grab_72_f730026bbdf816e374c8f45b994940721eb6f63e.jpg

 

对象识别

在绘制 SLAM 地图的同时,软件会将彩色视频馈入中看到的内容与对象库进行匹配,并且确定准确识别(和标记)每个对象的概率。而且,该软件还会确定找到的对象相对于自身的坐标位置。

您可以此示例及其他示例的源代码为基础,构建自己的对象、人员和人脸识别应用以及/或者需通过系统感知周围区域的应用。

结论

现在,终结者感知周围环境所需的技术已经成熟了。Skynet 甚至不需要担心与财务部门的沟通:对于密切关注机器视觉的所有人而言,Intel Joule 和 ZR300 组合都非常实惠,即便是预算十分有限的创客俱乐部也能买得起 - 更不要说投资数十亿美元的大型计算机系统了。

如果这还不够的话,我们还有大量的示例可以加快 Skynet 的部署;当 ‘netty 遇到一些特别的难题时,比如识别电话簿和撕掉所有带“S Connor”条目的页面,我们有一个支持社区可以提供帮助 - 毕竟,谁又会为了电话簿准备一个对象库呢?都几十年没人见过了!

Mark completed his Electronic Engineering degree in 1991 and worked in real-time digital signal processing applications engineering for a number of years, before moving into technical marketing.
DesignSpark Electrical Logolinkedin