文 / 鲍亮、曹麒,科沃斯机器人智能控制中心
背景
科沃斯作为国内家用机器人领导者,一直致力于为用户打造美好生活,让用户耗费更少的时间进行清洁工作。以扫地机器人行业为例,目前技术虽然已经相对成熟,但在某些情况下表现依然会让人诟病,比如推着鞋子到处跑,被电线、抹布等低矮物体卡死,因此在扫地机清扫前用户需先进行 “预清扫”(人工把鞋子、抹布归位,收拾好电线等),而我们则希望 通过视觉识别并规避这些障碍物,把人从 “预清扫” 中解放出来,提高用户体验。
我们的识别目标物主要是充电座、垃圾桶、鞋子、柔性布类、地毯等,在开发过程中遇到了以下几个难点:数据缺乏、室内环境复杂、目标物形态各异而且柔性目标与小目标居多、家用量产芯片算力受限,这导致了很难用传统的机器视觉方法靠提特征来进行鲁棒地检测,因此决定采用深度神经网络。
团队基于 TensorFlow 开发了一款物体检测模型,目前有很多种深度学习框架,选择 TensorFlow 的原因如下:
它是一款主流成熟框架,文档资源丰富,论坛和社区活跃,开发者众多。
TensorFlow 有一款工具 Object Detection API [1],里面实现了很多经典的物体检测和分割模型,利用它开发新模型很方便。
TensorFlow 模型易于产品落地, TensorFlow Lite 让移动端部署变得方便快捷。
本文将大致介绍模型的开发过程,以及如何将模型应用到扫地机中。
数据采集
大量有效数据是进行深度学习最宝贵的资源。由于扫地机在地面工作,视角独特,很难从网上找到可用的公开数据集,因此我们首先人工采集了大量扫地机视角的家庭环境数据。不同时间地点采集的数据各不相同。比如,白天可以采集到阳光斜射造成的过曝、逆光等数据,而晚上则暗光图像更多,另外随着地理位置变化家庭环境的布置也差异很大。
图一:各个种类的数据分布
上图展示了数据分布情况,鞋子占了很大一部分,这也是目前识别精度比较高的类别。
数据增强
模型开发中数据增强非常重要,比如适当调整图像 Hue 值可以模拟各种颜色的地板、地毯等,让数据集成倍增加。 在 Object Detection API 中, 有一个 python 文件 [2] ,已经实现了很多数据增强方法,也可以根据需求自己实现新方法,还有一个对应的 protobuf 文件 [3] 定义了每种方法的超参数。为了调试方便团队开发了一款可视化工具,可以选择不同的数据增强函数,调整超参数并预览效果。
图二:数据增强可视化工具
网络设计
在物体检测任务中,无论是单阶段还是多阶段检测器,锚点框设计出现在了很多架构中。在开发过程中,我们依据不同物体的像素尺寸及其在 Feature Map 上的大小,按照有效感受野原则,设计了轻量级的特征提取网络及检测分支,利用多层 Feature Map 来检测不同尺度的物体。其中,为不同的类别定制化设计了特定的锚点框以匹配更多的正样本,从而保证了数据能够被充分有效训练。在锚点框的设计上,目前有很多方案来优化锚点框的尺寸和比例,YOLO 论文 [4] 运用了聚类的方法,我们选择用遗传算法 [5] 。优化后,不仅保证了每个锚点框匹配的平均正样本更多,而且锚点框的数量减少为原来的三分之一。图三、图四展示了锚点框优化前后平均每个框匹配到各类别物体的数量,优化前的锚点框在小目标(scale<50)和大目标(scale>250)的匹配数量非常少,而优化后小目标和大目标的匹配数量有明显的提升。
图三:锚点框优化前的平均匹配数量
图四:锚点框优化后的平均匹配数量
在 Loss 函数的设计上,参照 Focal Loss [6] 对不同的锚点框进行加权,相比原版只对 easy/hard example 进行加权,我们还加入了位置加权,让模型更关注学习近距离目标的特征,保证近距离目标的识别精度。
整个网络的设计和模型的训练都利用 Object Detection API 框架完成。训练完毕后,经过测试证明锚点框的设计对检测任务起到了非常关键的作用。另外,为了提高小目标的召回率,我们将后面的 Feature map 与前面 Feature map 进行了特征融合,模型精度又提高了 2%。
图五:模型效果演示
图六:模型不识别高于地面一定程度的物体
模型移植
最后,训练完成后模型被保存为 pb 格式,为了导入到扫地机中,需要利用 TensorFlow Lite 库进行模型转化。TensorFlow Lite 库主要是针对 CPU 端加速计算的(最新版已支持移动端 GPU),相比于 TensorFlow 它有三个优势:
轻量级。TF Lite 能够生成很小的链接库,这对于嵌入式产品有着致命的诱惑力
可硬件加速。有些手机可以通过 NNAPI( Android Neural Networks API )进行硬件加速
依赖库少,跨平台方便,模型可以进一步精简
参照官方指导,将 pb 模型分解为前处理、中间部分、后处理三块,前处理主要负责图片的预处理包括尺寸归一化等,中间部分主要是 CNN 相关的操作,后处理则负责检测结果的输出优化包括 NMS 等。对于中间部分,先利用 TensorFlow Lite 转化为 Lite 格式,这样整个模型就可以利用 Lite 库在芯片 CPU 上进行推理加速了,然后我们尝试利用上了芯片上闲置的小型 GPU,用 OpenCL 将部分运算移植到 GPU 上进行,推理速度又提高了 30%,这样终于可以满足扫地机场景的最低延时要求了。后处理中,对于不同种类的目标物,设置不同的 NMS IoU 阈值,比如电线类的 IoU 阈值设计得大一点,以提高电线类的输出框个数,进一步提高召回率。
识别到目标后,再经过单目测算距离,扫地机就可以聪明地躲开这些障碍物了。慢慢的,一个家庭智能小伙伴诞生了。
总结
本文以物体检测为例,介绍了科沃斯如何利用 TensorFlow、Object Detection API 以及 TensorFlow Lite 来开发行业内首款 AI 视觉推理扫地机器人。
后续,我们会继续探究人工智能在家用机器人中的运用,不断将新的技术点应用到产品中,让我们的用户尽情享受科技带来的便利。
科技,让生活更美好~
参考文献
[1] https://github.com/tensorflow/models/tree/master/research/object_detection
[2] https://github.com/tensorflow/models/blob/master/research/object_detection/core/preprocessor.py (accessed at 19th Mar 2019)
[3] https://github.com/tensorflow/models/blob/master/research/object_detection/protos/preprocessor.proto (accessed at 19th Mar 2019)
[4] Redmon J., (2016), YOLO9000: Better, Faster, Stronger
[5] Sastry K., Goldberg D. and Kendall G., (n.d.), GENETIC ALGORITHMS
[6] Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár,Focal Loss for Dense Object Detection
更多 AI 相关阅读: