关于对象检测,我们以前分享的文章都是介绍的2D的对象检测,但是我们很多使用场景下,希望检测到的对象能够以3D的影像呈现出来,本期介绍的MediaPipe Objectron便是是用于日常对象的移动实时3D对象检测解决方案。它检测2D图像中的对象,并通过在Objectron数据集上训练的机器学习(ML)模型估计其3D姿势。
3D对象检测
对象检测是一个广泛研究的计算机视觉问题,但是大多数研究都集中在2D对象预测上。虽然2D预测仅提供2D边界框,但通过将预测扩展到3D,人们可以捕获物体在世界上的大小,位置和方向,从而可以使用在机器人技术,自动驾驶汽车,图像检索和增强现实中的各种应用。尽管2D对象检测相对成熟并且已在行业中广泛使用,但是由于缺乏数据以及类别中对象的外观和形状的多样性,从2D图像进行3D对象检测仍然是一个具有挑战性的问题。
MediaPipe Objectron
用于3D对象检测的ML管道MediaPipe建立了两个ML管道来从单个RGB图像预测对象的3D边界框:一个是两阶段的管道,另一个是单阶段的管道。两级比单级快3倍,且精度相似或更高。单级擅长检测多个对象,而两级擅长于单个对象。
两级管道
下图说明了MediaPipe的两阶模型管道。第一阶段使用对象检测器来找到对象的2D裁剪。第二阶段进行图像裁剪并估计3D边界框。同时,它还为下一帧计算对象的2D裁剪,从而使对象检测器不需要每帧都运行。
MediaPipe的两阶模型管道
单级管道
MediaPipe的单级管道
上图说明了MediaPipe的单级管道,该模型主干具基于MobileNetv2构建的编码器-解码器体系结构。MediaPipe采用多任务学习方法,通过检测和回归共同预测对象的形状。
当将模型应用于移动设备捕获的每个帧时,由于每个帧中估计的3D边界框的歧义性,模型可能会发生抖动。为了减轻这种情况,MediaPipe在MediaPipe Box Tracking中的2D对象检测和跟踪管道中采用了相同的检测+跟踪策略。这减轻了在每个帧上运行网络的需要,从而允许使用更重的模型,因此可以使用更准确的模型,同时在移动设备上保持管道的实时性。它还可以跨帧保留对象身份,并确保预测在时间上保持一致,从而减少了抖动。
3d对象检测
使用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.objectron39;Shoe&39;Shoe&39;Chair&39;Cup&39;Camera& 转换图片到RGB空间 results = objectron.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) 39;Box landmarks of {file}:&39;/tmp/annotated_image&39;.png&39;annotated_image& 视频检测 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=&39;) as objectron:代码截图
与图片检测类似,我们首先导入需要的第三方库以及建立一个3D对象检测模型函数,然后使用cv2.VideoCapture(0)函数打开设备的默认摄像头,这里0便是代表设备的默认的第一个摄像头,当然这里也可以传递一个视频的地址,便可以检测视频
while cap.isOpened(): success, image = cap.read() if not success: continue 为了提高性能,可以选择将图像标记为不可写,以便通过引用传递 image.flags.writeable = False results = objectron.process(image)代码截图
当默认摄像头被打开后,我们便可以从视频流中获取每帧的图片,然后按照图片检测的模式进行3D模型的检测,当然在视频检测时,我们为了提高检测的性能,我们需要暂时关闭图片的写权限,然后使用objectron.process函数对视频帧中的图片进行检测,检测的结果保存在results中
39;MediaPipe Objectron&39;q'): break cap.release()代码截图
然后我们打开图片的写权限,遍历图片检测结果,使用mp_drawing.draw_landmarks与mp_drawing.draw_axis画图函数,画出我们检测的结果
每个视频帧的检测结果加起来,便可以完整地呈现出视频检测的结果了。
其他文章参考
利用机器学习,进行人体33个2D姿态检测与评估
利用机器学习,进行人手的21个3D手关节坐标检测
利用机器学习进行人脸468点的3D坐标检测,并生成3D模型
MediaPipe 集成人脸识别,人体姿态评估,人手检测模型
本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除
热门信息
阅读 ()
1 注册微信号怎么注册第二个阅读 ()
2 怎么把照片变成卡通头像阅读 ()
3 手机越充越少电怎么解决