谷歌发布的MediaPipe Objectron,是一个可以实时检测3D物体检测的模型框架,先在2D图像上检测物体,然后估算出3D坐标。
尽管目前2D物体检测已经相对成熟,但3D检测仍然是个挑战性的问题,主要是缺少大量有效的数据用于训练
获取真实世界的数据
现实世界中,针对3D物体检测的数据集是非常有限的。 为此,Google开发了一个基于增强显示(AR)的数据采集方法。 由于ARCore和ARKit的普及使用,现在大量手机具有增强现实的能力,并且可以在AR应用中提供更多的信息,如摄像头位置,稀疏3D点云,光照估计,平面估计等。
Google开发了一个全新的方法和工具,允许标注者借助AR快速标记物体的3D bounding boxes. 该工具把屏幕分成2部分,左边是2D的视频,叠加了3D bounding boxed, 右边是3D点云数据。 标注者在右边3D视线里给物体标注3D bounding box, 可以实时验证其在左边2D视频里投影的bounding box正确性。
AR合成数据
为了增加预测的准确性,通常流行的方法是用合成的数据对真实世界的数据进行互补,但是经常这样做会产生低质量,不真实的数据,并且在图像渲染等方面,需要大量的精力和计算资源。我们的新方法是在AR场景中放置虚拟的物体,这样能够利用摄像头位置,检测到的平面和估计的光照去生成能和实际场景匹配的物体,这样生成的物体能够融合到原有场景,并无缝地契合到背景中。
3D物体检测pipeline
我们建立了2个pipeline从一个RGB图像去预测物体的3D bounding box,一个是two-stage,另一个是one-stage, two-stage速度是one-stage的3倍,并且拥有相似的精度, one-stage的擅长检测多个物体,two-stage的擅长检测单个物体。
two-stage pipeline
two-stage的,在第一个stage 使用一个检测网络在2D图片中检测物体,在第二个stage使用图像裁剪和3D bounding box估计。同时,它计算了下一帧的2D图像的bounding box,这样检测网络不需要每一帧都运行。
2D的物体检测网络我们这里使用了TensorFlow Object Detection, 在 Open Images dataset数据集上训练了。 第二个stage的3D bounding box预测任务可以在高通Adreno 650 GPU上运行达到83FPS.
single-stage pipeline
single-stage backbone使用了encoder-decoder架构, 基于MobileNetV2. 我们采用了多任务学习的方法,联合检测和回归去预测一个物体的形状。形状预测分支任务依据于有什么样的ground truth标注, 比如segmentation分割, 如果训练数据集没有形状信息,这个是可选的。针对检测任务,使用标注的bounding boxes,并对其使用高斯分布,中心点位于bounding boxes中心, 标准差正比于box尺寸。 检测任务的目标是预测物体的中心高斯分布,回归任务预测bounding boxex 8个顶点的2D坐标投影。最后为了获取bounding boxes的3D坐标, 使用了EPnP算法,它可以不借助于关于物体维度的先验知识, 并估算出物体的3D bounding boxes。 该模型足够轻量级,可实时运行在手机上,在Adreno 650 GPU上达到26FPS。
Detection and tracking
当模型应用于视频的每一帧时会产生抖动, 主要是由于每一帧预测的3D bounding boxes的不稳定性,为了解决这个问题,使用了一个检测网络和跟踪网络, 检测网络不需要每一帧都运行,间隔几帧运行一次,得到9个关键点,包括3D bounding boxes的中心点和8个顶点坐标。跟踪网络每一帧都运行。
Objectron dataset
Google发布了Objectron dataset, 可以下载该数据集,遗憾的是Google并没有发布该模型训练的代码,其推理代码封装打包在mediaPipe项目里。
具体可以参见:
https://google.github.io/mediapipe/solutions/objectron