Mediapipe实时3D目标检测和跟踪(自动驾驶实现)

您所在的位置:网站首页 3dmax简单物体模型教程 Mediapipe实时3D目标检测和跟踪(自动驾驶实现)

Mediapipe实时3D目标检测和跟踪(自动驾驶实现)

2023-06-22 08:10| 来源: 网络整理| 查看: 265

🚀 导语

3D目标检测是根据物体的形状、位置和方向来识别和定位物体的任务。在2D目标检测中,被检测到的物体仅表示为矩形边界框。3D目标检测任务通过预测物体周围的包围框,可以获取物体的三维位置信息。

在这里插入图片描述

3D目标检测在各行各业都有广泛的应用。一些常见的用途包括: 🎯 机器人技术 🎯 自动驾驶车辆 🎯 医学影像

MediaPipe Objectron是由Google的MediaPipe团队开发的计算机视觉流水线,可以使用Objectron数据集实时实现3D目标检测和跟踪。该数据集包括自行车、书籍、瓶子、相机、谷物盒、椅子、杯子、笔记本电脑和鞋子等9种物体。

该流水线使用在合成数据上训练的机器学习模型来估计场景中物体的三维包围框和姿态。它接收来自相机或视频流的一系列帧作为输入,并输出一系列的3D目标检测和跟踪结果。Objectron利用相机校准、三维物体模型和深度估计等技术组合,实现了高精度的3D目标检测。

🚀MediaPipe实现3D目标检测跟踪算法原理 数据集和模型训练:数据集收集和标注:使用Objectron数据集,其中包含了物体的图像和相应的3D边界框和姿态标注。模型训练:使用机器学习模型,如卷积神经网络(CNN),通过输入图像进行训练,学习预测物体的3D边界框和姿态。相机校准: 内部参数估计:使用相机标定板等方法,通过观察2D图像中已知尺寸的物体,估计相机的内部参数,如焦距和主点坐标。外部参数估计:通过相机标定板的位置和姿态,结合已知的世界坐标系中的点与其在图像中的对应关系,估计相机的外部参数,包括相机的位置和姿态。 特征提取和匹配: 特征提取:使用特征提取算法(如SIFT、ORB、SURF等),从图像中提取关键点或特征描述符。特征匹配:通过匹配不同帧之间的特征点或特征描述符,找到相应的匹配点对。 3D边界框和姿态估计: 相机投影:通过将2D图像坐标转换为归一化设备坐标,将图像坐标与相机的内部参数关联起来。三角测量:通过对匹配的特征点或特征描述符进行三角测量,估计物体在3D空间中的位置。姿态估计:通过对物体的3D点进行旋转和平移操作,将物体的姿态(旋转角度)估计出来。 目标跟踪: 特征匹配:通过在相邻帧之间匹配特征点或特征描述符,找到物体在不同帧之间的对应关系。运动模型:使用运动模型来预测物体在下一帧中的位置和姿态。滤波算法:使用滤波算法(如卡尔曼滤波器、扩展卡尔曼滤波器等)来平滑和修正跟踪结果。 结果输出:输出3D边界框和姿态信息:根据估计的物体位置、尺寸和姿态,生成输出结果,包括物体的3D边界框的中心坐标、宽度、高度以及旋转角度等信息。 🚀安装MediaPipe和OpenCV pip install mediapipe pip install opencv-contrib-python

下面我将使用MediaPipe在图像帧中检测3D物体,并使用OpenCV绘制其周围的三维边界框。

🚀 使用MediaPipe实现3D目标检测 import cv2 import mediapipe as mp import time mp_objectron = mp.solutions.objectron mp_drawing = mp.solutions.drawing_utils

首先,我们需要导入Objectron解决方案和绘图工具,以便检测和绘制物体的3D边界框。

cap = cv2.VideoCapture(0)

然后,我们可以打开视频捕获设备。这将打开计算机上的网络摄像头,并将摄像头捕获的视频存储在cap变量中。

objectron = mp_objectron.Objectron(static_image_mode=False, max_num_objects=5, min_detection_confidence=0.5, min_tracking_confidence=0.7, model_name='Cup')

通过Objectron方法,我们可以对3D目标检测算法进行不同的配置。

static_image_mode: 基于我们将使用图像或视频进行3D检测(对于图像为True,对于视频为False)max_num_objects: 定义我们想要在其周围绘制边界框的最大可识别对象数。min_detection_confidence: 检测给定类别所需的阈值。min_tracking_confidence: 在跟踪物体时避免误报的阈值model_name: 定义我们将在3D目标检测模型中使用哪个类别,可以是’Cup’、‘Shoe’、‘Camera’或’Chair’。 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),这会稍微提高性能。

然后,我们可以检查图像帧中是否存在任何检测结果。如果有,我们可以绘制2D边界框的标记点,并通过添加附加轴来获取3D边界框。通过旋转,我们可以得到物体在图像帧中的旋转情况,然后我们还将指定物体在图像帧中的平移情况。

在结果中,我们可以获得3D物体检测结果。当我们打印它时,我们可以得到带有x、y、z轴的标记点,这些是检测到的物体的中心点,我们还可以以数组的形式获得检测到的物体的旋转、平移和缩放情况。

Results:

在这里插入图片描述 🚀当我们将3D边界框与2D边界框进行比较时,存在额外的参数。🏹 2D目标检测:

边界框中心的X坐标边界框中心的Y坐标边界框的宽度边界框的高度

🏹 3D目标检测:

边界框中心的X坐标边界框中心的Y坐标边界框中心的Z坐标边界框的宽度边界框的高度边界框的长度Roll角度表示绕X轴的旋转Pitch角度表示绕Y轴的旋转Yaw角度表示绕Z轴的旋转 🚀Mediapipe实现自动驾驶功能

我使用了Mediapipe编写了一个小功能,与自动驾驶相关。该功能以第三人称视角为基础(类似于极品飞车游戏),通过分析车辆与行人之间的距离,来判断是否可能发生碰撞,并相应地引导汽车进行停车或转向的动作。

在这里插入图片描述

import cv2 import mediapipe as mp import time mp_objectron = mp.solutions.objectron mp_holistic = mp.solutions.holistic mp_drawing = mp.solutions.drawing_utils cap = cv2.VideoCapture(0) objectron = mp_objectron.Objectron(static_image_mode=False, max_num_objects=5, min_detection_confidence=0.5, min_tracking_confidence=0.7, model_name='Car') holistic = mp_holistic.Holistic(static_image_mode=False, model_complexity=2, min_detection_confidence=0.5, min_tracking_confidence=0.5) # 车辆状态类 class CarState: def __init__(self): self.position = None self.rotation = None # 行人状态类 class PedestrianState: def __init__(self, position): self.position = position # 避障系统类 class ObstacleAvoidanceSystem: def __init__(self): self.car_state = CarState() self.pedestrians = [] def update_car_state(self, car_position, car_rotation): self.car_state.position = car_position self.car_state.rotation = car_rotation def update_pedestrians(self, pedestrian_positions): self.pedestrians = [] for position in pedestrian_positions: pedestrian = PedestrianState(position) self.pedestrians.append(pedestrian) def check_collision(self): if self.car_state.position is not None: for pedestrian in self.pedestrians: # 在这里实现碰撞检测逻辑 # 根据车辆和行人的位置进行碰撞检测 if pedestrian.position is not None: distance = calculate_distance(self.car_state.position, pedestrian.position) if distance


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3