https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfyDn1JM2pmWd22uHjq6UECnpseNMnI4E2e-FblWpJbdYSAqjUdC2DAIQYyfYIdIQ48wvKJWIiV9rwbtOCs5ielu0DnAyCjZiuDhBosIts2D7mT5dnujRDAy-kl6kRgh_DJJj9wvcqlDM/s1600/fig1.gif
科沃斯机器人 AI 部门的梁宝和吕成奇的客座文章。
由科沃斯机器人技术开发部门的徐子倩翻译。
机器人吸尘器是科沃斯机器人的主要产品,该公司生产家用机器人电器。 在本文中,我们分享了我们实施和部署 TensorFlow Lite 模型的旅程,该模型帮助机器人检测并避开障碍物。
技术背景和目标
|
图 1 科沃斯机器人吸尘器 |
机器人吸尘器是一种智能家居电器,可以自动清洁地板。 机器人吸尘器的主要功能是环境映射、防跌落、障碍物攀爬和自动充电。 从技术上讲,它使用同步定位和地图构建(SLAM)技术,利用其机身顶部的激光测距传感器 (LDS)、缓冲器和红外传感器来检测和避开路径中的障碍物。
|
图 2 机器人吸尘器的结构图 |
虽然机器人吸尘器的 SLAM 技术比较成熟,但机器人无法检测到地板上的小物体。 这主要是因为 LDS、缓冲器和红外传感器无法有效地检测到小的或柔软的障碍物,这会导致三个问题:
- 机器人把拖鞋和袜子推得到处都是。 当你醒来时,你找不到它们。
- 耳机线和其他电线可能会缠绕在侧刷上,导致机器人很容易被困。
- 湿巾和软垫可能会缠绕在主刷上,导致机器人无法正常工作。
上述问题迫使用户在使用机器人吸尘器之前进行预先清洁(例如,手动整理鞋子、袜子和电线),使得清洁过程变得麻烦。 因此,我们希望通过在机器人前方添加摄像头来使用计算机视觉算法来检测这些障碍物,并找到一种方法来避开障碍物,为用户节省时间。
我们的主要目标检测物体是充电器、垃圾桶、鞋子、拖鞋、抹布、垫子和电线。 在研究过程中,我们遇到了以下主要问题: **缺乏数据、复杂的室内场景、物体的多样性、太多的柔软或小型物体,以及由于高生产成本导致的有限计算能力。** 这些复杂多样的问题使得无法使用基于规则的算法可靠地检测物体。 受深度神经网络在 [ImageNet 大型规模识别挑战](http://www.image-net.org/challenges/LSVRC/) 中表现出色的启发,我们决定使用深度神经网络来检测物体。
我们的团队开发了一种基于 TensorFlow 的目标检测模型。 我们在其他深度学习框架中选择 TensorFlow 的原因如下。
- 它是一个成熟的框架,拥有全面的文档和社区资源生态系统,并且吸引了大量的开发者。
- 有一个名为 [对象检测 API](https://github.com/tensorflow/models/tree/master/research/object_detection) 的库,它已经实现了许多经典的目标检测和分割模型。 因此,基于这个库构建新模型非常方便。
- 基于 TensorFlow 的模型可以轻松部署到生产环境中。 TensorFlow Lite 使开发者更方便地在边缘设备上运行模型。
本文将概括介绍我们如何开发模型以及如何将其应用到机器人吸尘器中。
|
图 3 算法的总体架构图 |
数据收集和标注
构建深度学习模型而没有大量数据就像没有蓝图建造房屋一样。 由于独特的俯视视角和不常见的物体类别,我们找不到任何适合我们需求的公共数据集。 因此,我们首先与许多机构合作,从世界各地收集数据。 虽然手动数据收集花费了大量时间和精力,但创建健壮且准确的数据集是值得的。 在我们的数据收集过程中,我们收集了不同季节、不同时间和不同地点的数据。 例如,过曝光或背光图像可以在白天收集,而弱光图像主要在晚上收集。
|
图 4 来自俯视视角的数据图像示例 |
然后使用数据清洗来提高收集数据的质量。 这是必要的,因为许多图像彼此相似,因为相机连续拍摄照片。 将所有这些图像添加到我们的数据集中会导致更大的内存消耗和更长的训练过程。 它还可能导致过拟合和更高的泛化误差。 如果应用数据增强,删除这些图像不会影响模型的准确性。 在数据清洗之后,使用 [Labellmg](https://github.com/tzutalin/labelImg) 对数据进行标注。
|
图 5 数据分布图 |
图 5 显示了标注数据的分布。 鞋子所占比例最大,这个类别达到了更高的准确率。
数据增强
在开发模型时,数据增强发挥了重要作用。 例如,通过改变图像的色调值,我们可以模拟各种颜色的地板和垫子。 如前所述,我们基于对象检测 API 构建了我们的模型。 此库包括一个 [Python 脚本](https://github.com/tensorflow/models/blob/master/research/object_detection/core/preprocessor.py) ,该脚本已经实现了许多常见的数据增强方法,以及一个对应的 [protobuf 文件](https://github.com/tensorflow/models/blob/master/research/object_detection/protos/preprocessor.proto) ,该文件定义了每种方法的超参数。 此外,我们还根据自己的需求实现了一些新方法,并且开发了一个可视化工具,开发者可以使用该工具选择不同的数据增强功能和超参数,预览图像,并一键导出修改后的配置文件。
|
图 6 对象检测 API 数据增强的可视化工具 |
我们网络的结构
有两种常见的目标检测器:单阶段检测器和双阶段检测器。 虽然双阶段检测器通常能达到更高的准确率,但它需要大量的计算能力。 为了在机器人吸尘器上运行我们的模型,我们使用了与 SSD 检测器[1] 类似的单阶段模型(这种单阶段检测器使用多个特征图来预测不同尺度上的物体),并将原始 SSD 检测器中的 VGG 主干网络[2] 替换为自定义的轻量级网络用于特征提取。
|
图 7 原始 SSD 检测器的结构 |
我们基于有效感受野、物体的像素大小以及它在特征图上的大小构建了特征提取主干网络。 使用快速下采样来减少计算,并通过 MobileNetV2[3] 中使用的倒置残差块来弥补特征提取能力的损失,其中包括梭形结构和类似于 ResNet[4] 中的快捷连接的结构。 此外,为了提高小物体的召回率,我们将来自浅层特征图和深层特征图的特征连接起来。
|
图 8 MobileNetV2 中使用的倒置残差块 |
此外,我们模型中的所有标准卷积都替换为深度可分离卷积。 与标准卷积不同,深度可分离卷积根据通道数量拆分内核,每个通道都有自己的内核。 之后,使用 1x1 卷积核来连接所有通道的特征。 对于 3x3 卷积核,如果用深度可分离卷积替换标准卷积,则计算量可以减少到 1/9。 我们的模型使用 ReLu6 作为激活函数,它不需要太多计算。 此外,ReLu6 可以最大限度地减少模型转换导致的定点常数精度损失。
锚框优化
在预测边界框时,大多数传统架构使用锚框,我们的模型也使用锚框。 双阶段检测器主要使用锚框从特征图中提取感兴趣区域 (ROI),而 SSD 检测器根据主干网络中多特征图的每个像素生成锚框。 每个锚框都根据其宽度、高度、中心点的偏移量以及相应的类别进行训练。
在开发过程中,我们为不同类别定制了锚框的大小。 这使得模型平均能够匹配更多正样本,并在有效地训练模型时缓解了正样本和负样本之间不平衡的问题。 优化锚框的大小和比例有很多方法。 YOLO[5] 使用了维度聚类,而我们使用了遗传算法[6]。 优化后,锚框匹配了更多正样本,锚框的数量减少了三分之二。 图 9 说明了所有类别的锚框平均匹配数量。 优化后,小物体的匹配数量(尺度 < 50)和大型物体的匹配数量(尺度 > 250)大幅增加。
|
图 9 优化前后锚框的平均匹配数量(左侧的图形显示优化前的匹配数量) |
损失函数和模型训练
基于 focal loss[7],我们设计了带有不同锚框权重的损失函数。 与仅对容易样本和困难样本赋予不同权重的原始 focal loss 不同,我们的模型还对位置进行加权。 这种方式使得模型更加关注靠近物体的特征,并提高了准确率。
模型结构和训练流程由目标检测 API 定义:我们在 “
/object_detection/models” 模块中定义模型,在 “
object_detection/core” 模块中定义损失函数,在 “
object_detection/anchor_generators” 模块中定义锚框。然后我们使用 “
object_detection/model_main.py” 脚本训练和测试模型。
在训练过程中,我们进行了一系列实验,发现特征拼接和锚框优化都有利于提高检测精度。
|
图 10 模型工作原理(a:模型的输入;b:模型不会检测到悬空于地面的物体) |
模型解释
在测试模型时,由于神经网络是一个黑盒子,因此当出现误检时,通常很难弄清楚模型内部发生了什么。我们希望使用一些方法来找到误检的原因,因此选择了 Grad-CAM [8]。
|
图 11 Grad-CAM 的整体结构 |
Grad-CAM 的基本思想是计算特征图中每个像素的梯度,并使用它来显示该像素对分类的贡献。对于每个通道,全局平均池化的结果显示了该通道的重要性。这种方法的优点是不需要重新训练。然而,Grad-CAM 需要针对我们的检测模型进行调整。对于基于锚框的检测器,全局平均池化不能用于计算每个通道的权重,因为每个锚框都乘以一个 3x3 卷积核来预测其类别。相反,我们使用对应锚框的值来避免来自其他锚框的影响。
|
图 12 Grad-CAM 可视化解释 |
图 12 显示了第 2022 个锚框(位于第四个特征图上)中每个像素对类别线框的贡献。红色区域表示对应类别的得分较高,蓝色区域表示对应类别的得分较低。在此图中,线框接触地面的部分被涂成红色,这意味着该区域在检测线框方面起着关键作用。相反,尽管地面上的部分位于 3x3 卷积采样区域的采样范围内,但它被涂成蓝色,表示该部分对检测线框的贡献很小。根据模型的可视化解释,我们知道这似乎非常合理。
模型转换和加速
扫地机器人工作在以隐私为重的家居环境中。为了保护用户的隐私并防止数据泄露,我们需要将神经网络模型离线部署在机器人上,并使用硬件加速器来尽可能快地加快推断速度。
在 TensorFlow 中训练模型后,我们将它转换为 TensorFlow Lite,以便在扫地机器人上部署。机器人的主板运行 Linux 操作系统。它有 4 个 Cortex-A17 CPU 内核(只有一个可以用于 AI 模块)和一个 Mali-700 GPU,主要用于视频处理。
我们将训练好的模型分为三个部分:
预处理、深度学习模型和后处理。预处理对输入图像应用一些预处理技术,例如大小归一化。深度学习模型包含 CNN 操作,我们使用 TensorFlow Lite 在 CPU 上运行模型。后处理步骤优化模型的输出,包括非极大值抑制 (NMS)。
为了进一步提高速度,我们让相机内部 ISP 执行预处理步骤。此外,在 OpenCL 的帮助下,Lite 模型中部分 CNN 操作被部署到 GPU 上。这两步提高了推断速度 30%,使机器人能够满足避障的最低延迟要求。在后处理中,我们为不同的类别设置了不同的 NMS IoU 阈值。例如,线框的 IoU 阈值设置得略大一些,以便增加线框输出框的数量和召回率。
测距和避障
在 CNN 模型检测到图像中的物体后,我们可以根据边界框获得特定物体的精确位置。已知图像平面上的位置和摄像头的参数,可以使用针孔相机模型计算物体在坐标系中的位置。
|
图 13 针孔相机模型 |
完成相机校准后,我们可以测量物体与机器人之间的距离。通过这种方式,机器人能够智能地避障。
|
图 14 德国 IFA 2018 上的 DG70 |
关于科沃斯
科沃斯机器人作为一家全球科技公司,致力于帮助用户用机器人过上更美好的生活。公司推出了 DEEBOT(地面机器人吸尘器)、WINBOT(窗户机器人吸尘器)、ATMOBOT(移动式空气净化器机器人)和 BENEBOT(购物辅助机器人)。科沃斯机器人目前已在 60 多个国家上市,并在全球赢得了良好的声誉。
参考文献
【1】Wei Liu, Dragomir Anguelov, (n.d.),SSD: Single Shot MultiBox Detector
【2】Karen Simonyan, Andrew Zisserman,VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
【3】Mark Sandler, Andrew Howard,(n.d.),MobileNetV2: Inverted Residuals and Linear Bottlenecks
【4】Kaiming He, Xiangyu Zhang,(n.d.),Deep Residual Learning for Image Recognition
【5】Redmon J., (2016), YOLO9000: Better, Faster, Stronger
【6】Sastry K., Goldberg D. and Kendall G., (n.d.), Genetic Algorithms
【7】Tsung-Yi Lin, Priya Goyal, (n.d.),Focal Loss for Dense Object Detection
【8】Ramprasaath R.Selvaraju, Michael Cogswell, (n.d.), Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization