网站首页 > 技术文章 正文
关于对象检测,我们以前分享的文章都是介绍的2D的对象检测,但是我们很多使用场景下,希望检测到的对象能够以3D的影像呈现出来,本期介绍的MediaPipe Objectron便是是用于日常对象的移动实时3D对象检测解决方案。它检测2D图像中的对象,并通过在Objectron数据集上训练的机器学习(ML)模型估计其3D姿势。
对象检测是一个广泛研究的计算机视觉问题,但是大多数研究都集中在2D对象预测上。虽然2D预测仅提供2D边界框,但通过将预测扩展到3D,人们可以捕获物体在世界上的大小,位置和方向,从而可以使用在机器人技术,自动驾驶汽车,图像检索和增强现实中的各种应用。尽管2D对象检测相对成熟并且已在行业中广泛使用,但是由于缺乏数据以及类别中对象的外观和形状的多样性,从2D图像进行3D对象检测仍然是一个具有挑战性的问题。
用于3D对象检测的ML管道
MediaPipe建立了两个ML管道来从单个RGB图像预测对象的3D边界框:一个是两阶段的管道,另一个是单阶段的管道。两级比单级快3倍,且精度相似或更高。单级擅长检测多个对象,而两级擅长于单个对象。
两级管道
下图说明了MediaPipe的两阶模型管道。第一阶段使用对象检测器来找到对象的2D裁剪。第二阶段进行图像裁剪并估计3D边界框。同时,它还为下一帧计算对象的2D裁剪,从而使对象检测器不需要每帧都运行。
单级管道
上图说明了MediaPipe的单级管道,该模型主干具基于MobileNetv2构建的编码器-解码器体系结构。MediaPipe采用多任务学习方法,通过检测和回归共同预测对象的形状。
当将模型应用于移动设备捕获的每个帧时,由于每个帧中估计的3D边界框的歧义性,模型可能会发生抖动。为了减轻这种情况,MediaPipe在MediaPipe Box Tracking中的2D对象检测和跟踪管道中采用了相同的检测+跟踪策略。这减轻了在每个帧上运行网络的需要,从而允许使用更重的模型,因此可以使用更准确的模型,同时在移动设备上保持管道的实时性。它还可以跨帧保留对象身份,并确保预测在时间上保持一致,从而减少了抖动。
使用python代码实现MediaPipe的3D对象检测
当然在进行本期文章前,首先需要安装MediaPipe,安装MediaPipe可以直接在cmd命令框中输入如下
Python –m pip install MediaPipe,等待系统自动安装即可,这里需要提醒一下由于最新的MediaPipe版本不再支持python3.7以下的版本,所以MediaPipe的代码最好运行在python3.7以上版本
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_objectron = mp.solutions.objectron
# 图片检测
with mp_objectron.Objectron(static_image_mode=True,
max_num_objects=5,
min_detection_confidence=0.5,
model_name='Shoe') as objectron:
首先我们插入需要的第三方库,然后使用mp.solutions.objectron建立一个objectron 3D对象检测模型
此模型函数主要包括如下参数:
STATIC_IMAGE_MODE
如果设置为false,则检测对象为视频流。它将尝试在最开始的图像中检测对象,并在成功检测后进一步定位3D边界框界标。在随后的图像中,一旦检测到所有max_num_objects个对象并定位了相应的3D边界框地标,它便会简单地跟踪那些地标,而无需调用另一次检测,直到失去对任何对象的跟踪为止。这减少了检测时间,是处理视频帧的理想选择。如果设置为true,则对象检测为图像,非常适合处理一批静态的,可能不相关的图像。预设为false。
MAX_NUM_OBJECTS
要检测的最大对象数。预设为5。
MIN_DETECTION_CONFIDENCE
[0.0, 1.0]对象检测模型的最小置信度值,预设为0.5。
MIN_TRACKING_CONFIDENCE
[0.0, 1.0]来自地标跟踪模型的3D边界框地标的最小置信度值,否则将在下一个输入图像上自动调用对象检测。将其设置为更高的值可以提高解决方案的健壮性,但代价是更多的代码运行时间。如果static_image_mode为true,则忽略该对象检测仅在每个图像上运行。预设为0.99。
Model名称
用于预测3D边界框界标的模型的名称。目前支持{'Shoe', 'Chair', 'Cup', 'Camera'}。
焦距
(fx, fy)默认情况下,相机焦距是在NDC空间中定义的。要(fx_pixel, fy_pixel)在像素空间中使用焦距,用户应提供image_size=(image_width, image_height)以启用API内的转换。
主体点
(px, py)默认情况下,摄像机主点在NDC空间中定义。要(px_pixel, py_pixel)在像素空间中使用主点,用户应提供image_size=(image_width, image_height)来启用API内的转换。
图片大小
(可选)(image_width, image_height)输入图像的大小,仅在使用时focal_length和principal_point像素空间中需要。
for idx, file in enumerate(file_list):
image = cv2.imread(file)
# 转换图片到RGB空间
results = objectron.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 画出检测结果
if not results.detected_objects:
continue
print(f'Box landmarks of {file}:')
annotated_image = image.copy()
然后我们遍历file_list文件夹中的图片,进行图片的读取,然后使用cv2.cvtColor(image, cv2.COLOR_BGR2RGB)函数进行图片的RGB颜色空间的转换,这里是因为OpenCV的颜色空间是BGR,而后期开发的第三方库一般是RGB颜色空间,同样的mediapipe支持RGB颜色空间,因此这里我们需要转换图片的颜色空间到RGB格式
最后使用objectron.process函数对图片进行3D对象的检测,结果保存在results中,objectron.process函数返回值主要包括如下参数:
DETECTED_OBJECTS
检测到的3D边界框的列表。每个3D边界框都包含以下内容:
- landmarks_2d:对象3D边界框的2D地标。界标坐标分别[0.0, 1.0]通过图像的宽度和高度进行归一化。
- landmarks_3d:对象的3D边界框的3D地标。界标坐标表示在摄像机坐标系中。
- rotation :从对象坐标系到摄像机坐标系的旋转矩阵。
- translation :从对象坐标系到摄像机坐标系的平移向量。
- scale:对象的相对比例沿x,y和z方向。
获取到results后,我们就可以遍历检测的结果,使用mp_drawing.draw_landmarks函数对检测到的图片进行3D对象的绘图
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' + str(idx) + '.png', annotated_image)
cv2.imshow('annotated_image',annotated_image)
cv2.waitKey(0)
当然,3D对象检测与追踪同样支持视频流的实时检测
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_objectron = mp.solutions.objectron
# 视频检测
cap = cv2.VideoCapture(0)
with mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.5,
min_tracking_confidence=0.99,
model_name='Shoe') as objectron:
与图片检测类似,我们首先导入需要的第三方库以及建立一个3D对象检测模型函数,然后使用cv2.VideoCapture(0)函数打开设备的默认摄像头,这里0便是代表设备的默认的第一个摄像头,当然这里也可以传递一个视频的地址,便可以检测视频
while cap.isOpened():
success, image = cap.read()
if not success:
continue
# BGR 图片转换到 RGB.
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 为了提高性能,可以选择将图像标记为不可写,以便通过引用传递
image.flags.writeable = False
results = objectron.process(image)
当默认摄像头被打开后,我们便可以从视频流中获取每帧的图片,然后按照图片检测的模式进行3D模型的检测,当然在视频检测时,我们为了提高检测的性能,我们需要暂时关闭图片的写权限,然后使用objectron.process函数对视频帧中的图片进行检测,检测的结果保存在results中
# 画出检测结果
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', image)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
然后我们打开图片的写权限,遍历图片检测结果,使用mp_drawing.draw_landmarks与mp_drawing.draw_axis画图函数,画出我们检测的结果
每个视频帧的检测结果加起来,便可以完整地呈现出视频检测的结果了。
其他文章参考
猜你喜欢
- 2024-10-02 农业用上高科技,面对超轻量级作物病害,该如何建立识别网络?
- 2024-10-02 CVPR 2021轻量化目标检测模型MobileDets
- 2024-10-02 MnasNet:经典轻量级神经网络搜索方法 | CVPR 2019
- 2024-10-02 如何利用K-Means将文件夹中图像进行分类?
- 2024-10-02 你们还在做2D的物体检测吗?谷歌已经开始玩转 3D 了
- 2024-10-02 「干货」微软亚洲研究院推荐的计算机视觉项目清单
- 2024-10-02 谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等
- 2024-10-02 探索 CNN 中的逐点卷积:替换全连接层
- 2024-10-02 RepLKNet:不是大卷积不好,而是卷积不够大 | CVPR 2022
- 2024-10-02 CVPR2022 | RepLKNet: 大核卷积+结构重参数让CNN再次伟大
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)