日常物品的三维物体检测解决方案

423 阅读5分钟

日常物品的三维物体检测解决方案

本教程将使用mediapipe库和python进行3D物体检测。我们将在物体周围绘制一个3D边界框,而不是我们习惯的普通2D边界框。

前提条件

要跟上这个教程,你需要。

  • 熟悉机器学习建模。
  • 熟悉python编程语言。
  • 安装Jupyter笔记本或Google Colab。

要跟上本教程,请使用Google Colab。

为什么3D检测很重要

多年来,物体检测研究的重点是进行二维物体检测。我们已经看到了RCNN、Fast RCNN、SSD和Masked RCNN的情况。

在现实世界中,我们有三维物体。正因为如此,如果我们有3D边界框来约束现实世界中检测到的物体,而不是常用的2D检测,那会更好。

三维物体检测是至关重要的,因为它将使我们能够捕获物体的尺寸、方向和在世界中的位置。因此,我们将能够在现实世界的应用中使用这些3D检测,如增强现实(AR)、自动驾驶汽车和机器人,它们感知世界的方式与我们人类一样。

令人惊讶的是,谷歌已经提出了一个模型,它能以三维的方式观察世界和检测现实世界的物体。这个模型被称为Objectron。

什么是Objectron

Objectron是一个实时的3D物体检测解决方案,可以检测现实世界中的物体。

该模型首先检测二维图像中被裁剪的物体。之后,它通过一个在Objectron数据集上训练的机器学习(ML)模型来估计它们的位置。它可以用xyz 的坐标在物体周围创建一个三维包围盒。目前,它只能检测到四个物体:鞋、照相机、杯子和椅子。

该模型可在谷歌的MediaPipe上使用。它是一个ML管道,包含了解决现实世界问题的开源解决方案。

他们如何获得真实世界的3D训练数据

为了获得3D训练数据,他们不得不对2D数据进行一些注释技术,因为现在没有3D数据可用。

最初,他们开发了一个单阶段的objectron模型,利用移动增强现实会话数据获取这些数据。这使他们能够创建这种数据集。但是,这些数据集从来没有从不同的角度捕获3D物体。

他们后来发布了一个更强大的objectron模型,采用两阶段架构。

第一阶段部署了常用的TensorFlow物体检测模型来估计输入图像的二维裁剪。一旦这种裁剪被执行,第二阶段涉及采取这些裁剪的图像,并估计其三维边界框。

与他们使用单阶段编码器-解码器架构的初始模型相比,这是一个巨大的升级。它从不同的角度捕捉了更多的普通物体。此外,这个数据集是由涵盖各大洲十个国家的数据组成的地理多样性样本收集的。

使用这个模型检测和跟踪三维物体

安装和导入依赖项

!pip install opencv-python mediapipe

接下来,我们需要把它们导入我们的笔记本。

import cv2
import mediapipe as mp

现在让我们来设置mediapipe。

设置mediapipe

mp_drawing = mp.solutions.drawing_utils
mp_objectron = mp.solutions.objectron

从mediapipe中,我们已经导入了两个关键的解决方案,这将在本教程中帮助我们。我们已经导入了drawing_utils ,帮助我们绘制三维边界框(线和点),以及objectron 模型本身。

记住,mediapipe是一个巨大的库,有很多模型,我们需要从mediapipe导入我们想要使用的特定模型。

上传一个静态图像

本教程将使用两张椅子的静态图片进行演示。让我们把它们命名为椅子一和二。你需要下载这两张图片中的任何一张,并将其上传到你的Google Colab上,因为Colab上的上传在运行时间后会被删除。

我们建议下载小尺寸的图片(640px x 799px)以便于处理。

from google.colab.patches import cv2_imshow

image = cv2.imread("name-of-your-image.jpg") 
cv2_imshow(image)
cv2.waitKey(0)

上传后,我们需要对图片进行检测和跟踪。

执行检测和跟踪

with mp_objectron.Objectron(static_image_mode=True,
                            max_num_objects=5,
                            min_detection_confidence=0.5,
                            min_tracking_confidence=0.5,
                            model_name='Chair') as objectron:
  • True 我们将static_image_model ,因为我们要检测的是静止图像。如果你想检测视频帧,我们把这个值设置为False
  • max_num_objects 表示一帧内物体的最大数量。默认值被设置为5 。如果你需要增加最大数量,你可以在这里改变它。
  • min_detection_confidence 的范围在0.01.0 之间。我们将我们的值设置为0.5 。这意味着,如果检测的分数低于0.5 ,模型将对检测没有信心,并认为检测不成功。同样,对于min_tracking_confidence ,我们将其值设置为0.99
  • 我们将模型名称设置为检测Chair 。在编写本教程时,该模型只支持这四个对象的三维边界框:{'鞋'、'椅子'、'杯子'、'照相机'}。默认情况下,它被设置为检测一只鞋。你可以改变这个值来检测这四个对象中的任何一个。

在图像上绘制方框地标

annotated_image = image.copy()
    for detected_object in results.detected_objects:
      mp_drawing.draw_landmarks(
          annotated_image, detected_object.landmarks_2d, mp_objectron.BOX_CONNECTIONS)
      mp_drawing.draw_axis(annotated_image, detected_object.rotation,
                           detected_object.translation)
      cv2.imwrite('/tmp/annotated_image' + '.png', annotated_image)

如果Chair 已经在帧中被检测到(results.detected_objects),就用mp_drawing 类在图像上画出边界框的地标(BOX_CONNECTIONS)。此外,我们知道一个三维的图像有三个轴,x,y, 和z 。我们使用draw_axis 方法在图像上绘制我们的轴。

最后,我们需要将这些结果显示给用户。我们使用OpenCV的imshow() 方法来完成这个任务。

cv2_imshow(annotated_image)

输出。

Annotated image with 3D Object Detected

在这里找到本教程的完整代码实现。

总结

我们生活在一个令人兴奋的时代。人工智能方面的突破只能使我们的生活变得更好、更安全。有趣的是,我们认为2D物体检测是很酷的。有了3D物体检测,它甚至会更好。让我们拭目以待,看看未来会给我们带来什么惊喜。现在,我们很高兴能成为其中的一部分,并与你分享这些惊人的知识。