介绍
对象检测已经获得了发展,并且正在对解决它的几种方法进行改进。 在过去的几年里,基于 YOLO 的方法在准确性和速度方面一直优于其他方法,最近取得了一些进展,例如 YOLOv7 和 YOLOv6(在 YOLOv7 之后独立发布)。
然而——所有这些都令人担忧 二维物体检测,这本身就是一项艰巨的任务。 最近,我们已经能够成功地表演 二维物体检测,虽然这些检测器仍处于比 2D 物体检测器更不稳定的阶段,但它们的准确度正在提高。
在本指南中,我们将使用 MediaPipe 的 Objectron 在 Python 中执行 3D 对象检测。
请注意: MediaPipe 是 Google 的开源框架,用于构建机器学习管道以处理图像、视频和音频流,主要用于移动设备。 它被内部和外部使用,并为各种任务提供预训练模型,例如面部检测、面部网格划分、手和姿势估计、头发分割、对象检测、框跟踪等。
所有这些都可以并且用于下游任务——例如对面部应用过滤器、自动相机对焦、生物特征验证、手控机器人等。大多数项目都可以使用适用于 Android、iOS、C++、Python 和 JavaScript 的 API,而有些仅适用于某些语言。
在本指南中,我们将与 MediaPipe 的 Objectron, 适用于 Android、C++、Python 和 JavaScript。
MediaPipe 和 3D 对象检测
奥伯龙 解决方案接受了培训 Objectron 数据集,其中包含以对象为中心的短视频。 该数据集仅包含 9 个对象:自行车、书籍、瓶子、相机、麦片盒、椅子、杯子、笔记本电脑和鞋子,因此它不是一个非常通用的数据集,但这些视频的处理和采购相当昂贵(相机姿势、稀疏每个视频的每一帧的点云、平面特征等),使数据集的大小接近 2 TB。
经过训练的 Objectron 模型(称为 方案, 对于 MediaPipe 项目)接受了四个类别的培训——鞋子、椅子、杯子和相机。
2D 对象检测使用术语“边界框”,而它们实际上是矩形。 3D 物体检测实际上预测 箱 围绕对象,您可以从中推断出它们的方向、大小、粗略体积等。这是一项相当困难的任务,特别是考虑到缺乏适当的数据集和创建它们的成本。 虽然困难,但这个问题对各种 增强现实(AR) 应用程序!
Objectron 解决方案可以运行在一级或二级模式下——一级模式更擅长检测多个对象,而二级模式更擅长检测场景中的单个主要对象,运行效果显着快点。 单阶段管道使用 MobileNetV2 主干,而两阶段管道使用 TensorFlow 对象检测 API。
当在视频中检测到对象时,不会在每一帧上对其进行进一步的预测,原因有两个:
- 连续预测会引入高抖动(由于预测中固有的随机性)
- 在每一帧上运行大型模型的成本很高
该团队仅将繁重的预测转移到第一次相遇,然后只要有问题的物体仍在场景中,就跟踪该框。 一旦视线中断并重新引入物体,就会再次做出预测。 这使得可以使用具有更高准确性的更大模型,同时保持较低的计算要求,并降低实时推理的硬件要求!
让我们继续安装 MediaPipe,导入 Objectron 解决方案并将其应用于静态图像和直接来自摄像机的视频源。
安装 MediaPipe
让我们首先安装 MediaPipe 并准备一个辅助方法来从给定的 URL 获取图像:
! pip install mediapipe
安装框架后,让我们将其与常用库一起导入:
import mediapipe as mp
import cv2
import numpy as np
import matplotlib.pyplot as plt
让我们定义一个辅助方法来获取给定 URL 的图像,并返回一个表示该图像的 RGB 数组:
import PIL
import urllib
def url_to_array(url):
req = urllib.request.urlopen(url)
arr = np.array(bytearray(req.read()), dtype=np.int8)
arr = cv2.imdecode(arr, -1)
arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
return arr
mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)
最后,我们要导入 Objectron 解决方案和绘图实用程序来可视化预测:
mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils
使用 MediaPipe 对静态图像进行 3D 对象检测
Objectron
类允许多个参数,包括:
static_image_mode
:无论您是输入图像还是图像流(视频)max_num_objects
: 最大可识别对象数min_detection_confidence
:检测置信度阈值(网络必须对给定类的对象进行分类的确定程度)model_name
:您想在两者之间加载哪个模型'Cup'
,'Shoe'
,'Camera'
和'Chair'
.
考虑到这些——让我们实例化一个 Objectron 实例,然后 process()
输入图像:
objectron = mp_objectron.Objectron(
static_image_mode=True,
max_num_objects=5,
min_detection_confidence=0.2,
model_name='Cup')
results = objectron.process(mug)
results
包含检测到的对象的 2D 和 3D 地标以及每个对象的旋转、平移和缩放。 我们可以使用提供的绘图工具来处理结果并相当容易地绘制边界框:
查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!
if not results.detected_objects:
print(f'No box landmarks detected.')
annotated_image = mug.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)
fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()
结果是:
使用 MediaPipe 从视频或网络摄像头检测 3D 对象
更令人兴奋的应用程序是视频! 无论您是提供来自网络摄像头的视频还是现有的视频文件,您都无需对代码进行太多更改即可容纳视频。 OpenCV 非常适合读取、操作视频帧并将其输入到 objectron 模型中:
cap = cv2.VideoCapture(0)
objectron = mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.4,
min_tracking_confidence=0.70,
model_name='Cup')
while cap.isOpened():
success, image = cap.read()
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = objectron.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detected_objects:
for detected_object in results.detected_objects:
mp_drawing.draw_landmarks(image,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(image,
detected_object.rotation,
detected_object.translation)
cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
使图像不可写 image.flags.writeable = False
使过程运行得更快一些,并且是可选的更改。 决赛 cv2.flip()
在生成的图像上也是可选的 - 并且只是使输出镜像以使其更直观。
在相机和全球通用的宜家马克杯上运行时,结果如下:
输出有点抖动,但可以很好地处理旋转平移,即使拿着低分辨率相机的手颤抖。 当一个物体从框架中取出时会发生什么?
在第一次检测时停止对对象的预测,并且框跟踪清楚地发现对象已离开帧,并在对象重新进入帧时再次执行预测和跟踪。 当模型可以看到 杯子把手,因为当手柄不可见时输出会更加紧张(大概是因为更难准确确定杯子的真实方向)。
此外,在具有挑战性的光照条件下,某些角度似乎比其他角度产生明显更稳定的输出。 特别是对于杯子,它有助于能够看到杯子的边缘,因为它有助于透视,而不是看到物体的正交投影。
此外,在透明杯子上进行测试时,模型很难确定它是杯子。 这可能是一个例子 不经销 对象,因为大多数杯子是不透明的并且有各种颜色。
结论
3D 物体检测还有些年轻,MediaPipe 的 Objectron 就是一个有能力的示范! 虽然对照明条件、物体类型(透明与不透明的杯子等)和轻微的抖动敏感 - Objectron 很好地了解了很快将有可能以比以往更高的准确性和可访问性进行的操作。