背景
随着现代社会步入互联网高速发展阶段,人们的时间变得越来越宝贵,从经济学上的机会成本来理解就是我们每做一件事可能意味着放弃做其他事情所带来的成本越来越大。科沃斯作为国内家用机器人领导者一直致力于给予现代人一种新的生活方式,让用户耗费更少的时间进行清洁工作,尽情享受智能生活。以扫地机器人行业为例,目前扫地机技术虽然已经相对成熟,但在某些情况下表现依然会让人诟病,比如推着鞋子到处跑,被电线、抹布等低矮物体卡住等, 因此在扫地机清扫前用户需先进行一次“预清扫”(人工整理一下房间,把鞋子、抹布归位,收拾好电线等),而我们的目的就是通过视觉识别出这些目标,把人从“预清扫”中解放出来。
我们的识别目标主要是充电座、垃圾桶、鞋子、柔性布类、地毯等几类,在算法开发过程中我们碰到了以下几个影响性能的棘手问题:数据缺乏、室内环境复杂、待检测目标形态各异而且柔性目标与小目标居多、家用量产芯片算力受限,这些导致了我们很难用传统的机器视觉方法靠提特征来进行鲁棒地检测,因此我们决定采用深度神经网络模型。我们团队基于TensorFlow开发了一款物体检测模型,本文将大致介绍我们的开发过程,以及如何将模型落地到实际产品中。
目前市面上有很多深度学习框架,我们选择TensorFlow来开发我们的模型。我们选择它的原因有以下两点:
1.它是一款主流的成熟框架,论坛和社区都很活跃,很多流行的模型架构和算子已实现,这将大大缩短开发时间;而且当开发遇到困难时,也可以更容易在网上找到解决方案。
2.利用Tensorflow开发的模型来做产品落地非常方便。
下面我们将具体从数据和模型两个方面来讲解我们的开发过程。
数据
巧妇难为无米之炊,大量有效的数据始终是进行深度学习最宝贵的资源。收集各个时间、各个地点的数据一直贯穿我们整个项目中。
由于扫地机器人主要工作在地面,视角非常独特,很难从网上找到公开数据集,因此我们人工采集了很多扫地机器人视角的家庭环境数据,数据主要来源于国内华东、华南、华北还有部分欧美地区。
当然,不同时间段采集到的数据也各不相同。比如,白天和晚上的数据就有很大差别,主要表现在环境光照。白天可以采集到在自然光下阳光斜射造成的过曝、逆光等极端数据,而晚上灯光从屋顶照下分布更加均匀,弱光图像更多。另外由于季节和地理位置的不同,收集的数据也会有所不同,这主要体现在了家庭环境的布置以及鞋类等的差别。
采集到数据之后,在进行数据标注的时候也要注意,与一般的公开数据集标注会稍有区别:
1.由于室内地面视角,目标被遮挡和截断的异常多,被遮挡不标注的比例要慎重选择, 另外柔性目标和非柔性目标在进行标注时也要区别对待,比如电线等柔性目标被截断则会变成多个目标;
2.由于芯片算力限制,开发的轻量级模型需要在精度和速度之间进行妥协;当我们利用mAP进行模型效果评价时,将数据分为了必须识别目标和非必须识别目标,非必须识别目标大多是远距离目标,即使模型没有识别到也不会对机器造成大的影响,因此我们模型只需识别到必须目标,尽量兼容非必须目标,这样我们便能测出能够满足真实应用场景所需的模型极限能力,对我们压缩模型大小有很大帮助。
图一:各个种类的数据分布
图一展示了我们的数据类型分布,由图可见,鞋子占了很大一部分数据,这也是我们目前训练效果比较好的类别。
模型
关于模型开发我们主要讨论数据增强、部分模型设计、以及我们如何将模型导入产品。这里我们要感谢Tensorflow,Tensorflow有一款开源框架Tensorflow Object Detection API【1】,里面实现了很多经典的物体检测和分割模型,我们可以利用这个框架来开发自己的模型。
数据增强一直在模型开发中扮演着重要角色, 在Object Detection API中, 有一个python文件【2】,实现了很多数据增强方法,还有一个对应的protobuf文件【3】,定义了每种方法的超参数。为了调试方便,我们开发了一款可视化工具,图二展示了该工具的工作界面。当开发者载入了图片、标注数据以及训练的pipeline.config这三个文件后,工作界面将会被激活,该工具会根据pipeline.config中配置自行初始化数据增强函数。开发者可以通过左上角的Operator 列表选择需要的函数,其对应的超参数会在下面的Parameter列表中详细陈列出来。开发者也可以拉动滚动条来调整超参数的值,或是直接设置目标值,经过一系列调整后也可以直接恢复成默认值。预览效果将以类似于幻灯片的方式呈现出来,当运行播放键后,工具会不断产生出效果图,并且将它们暂时保存到历史列表中以便于随时跳转回访。在预览过程中可以实时调整数据增强方法和参数。在完成数据增强配置之后,可以很方便地一键导出修改过的pipeline.config文件。
图二:数据增强配置工具
我们也针对我们的场景自己实现了一些数据增强方法,比如,适当调整Hue会给我们的数据带来很大的增益效果,我们可以模拟各种颜色的地板、地毯等。但是,在真实世界中,有些东西通常只会存在一种颜色,如果贸然改变其Hue,会有适得其反的效果,因此我们需要根据图片中物体的种类进行不同的Hue调整操作。
在物体检测任务中,无论是单阶段还是多阶段检测器,锚点框出现在了很多架构中。在开发过程中,我们依据不同物体的像素尺寸及其在feature map上的大小,按照有效感受野原则,设计了轻量级的骨干网络及检测模型,并利用多层feature map来检测不同尺度的物体。其中, 为不同的物体类别定制化设计了特定的锚点框以获得更多的正样本,从而保证了数据能够被充分有效地训练。在锚点框的设计上,目前有很多调优的方案来选择锚点框的尺寸和比例,论文【4】中运用了聚类的方法,我们运用了遗传算法【5】来进行锚点框的设计。经过调优后, 不仅保证了训练阶段每个锚点框匹配的平均正样本更多,而且在没有影响精度的前提下将锚点框的数量减少为原来的三分之一。图三、图四展示了锚点框优化前后平均每个框匹配到各类别物体的数量,优化前的锚点框在小目标(scale<50)和大目标(scale>250)的匹配数量非常少,而优化后小目标和大目标的匹配数量有明显的提升。
图三:锚点框优化前的平均匹配数量
图四:锚点框优化前的平均匹配数量
整个模型的搭建过程我们都利用Object Detection API框架完成,因此开发速度比较快,模型开发完毕后,我们继续利用Object Detection API进行模型训练。测试证明锚点框的设计对我们的检测任务起到了非常关键的作用。另外,为了提高小目标的召回率,我们发现特征融合很有用,因此我们将后面的feature map与前面feature map进行特征融合,实验证明这样又提高了2点MAP。
训练完后的模型效果如图五、图六所示。
图五:模型Inference演示
图六:模型不识别高于地面一定程度的物体
最后,训练完成后模型被保存为pb格式,为了导入到产品中,我们需要利用Tensorflow Lite库进行模型转化。Tensorflow Lite库主要是针对Cpu端加速计算的(最新版已支持移动端Gpu),相比于TensorFlow它有三个的优势:
1.轻量级。TF Lite能够生成很小的链接库,这对于嵌入式产品有着致命的诱惑力。
2.可硬件加速。有些手机可以通过NNAPI( Android Neural Networks API )进行硬件加速。
3.依赖库少,跨平台方便,模型可以进一步精简。
这里我们参照官方指导首先将pb模型分割为前处理,中间部分,以及后处理三块。前处理主要负责图片的预处理包括尺寸归一化等,中间部分主要是CNN相关的层,后处理则负责检测结果输出的优化包括NMS等。其中,对于中间部分,我们用Tensorflow Lite将其转化为Lite格式,这样整个模型就可以在扫地机器人芯片上进行Cpu推理了,然后我们又尝试利用了芯片上闲置的小型Gpu,将部分运算移植到Gpu上进行,这里我们用Opencl实现,最终inference速度又提高了30%。然后在后处理中,我们对于不同种类的目标设置不同的NMS IOU阈值,比如电线类的IOU阈值设计得大一点,以提高电线类的输出框个数,进一步提高召回率。
慢慢的,一个家庭智能小伙伴诞生了。
总结
本文以物体检测为例,介绍了科沃斯如何利用Tensorflow、Object Detection API以及Tensorflow Lite来开发行业内首款AI视觉推理扫地机器人。
后续,我们会继续探究人工智能在家用机器人中的运用,不断将新的技术点应用到产品中,让我们的用户尽情享受科技带来的便利。
科技,让生活更美好~
文章转载自tensorflow微信公众号
作者:鲍亮 ,曹麒
科沃斯机器人智能控制中心
本文网址: