MediaPipe 手势识别任务可以让您在图像中检测手部的关键点。您可以使用此任务来定位手部的关键点并在手部上渲染视觉效果。此任务对机器学习(ML)模型的图像数据进行操作,可以作为静态数据或连续流,并输出多个检测到的手的图像坐标中的手部关键点、世界坐标中的手部关键点和左右手的信息。

手部关键点模型包可以检测到检测到的手部区域内21个手指关节坐标的关键点定位。该模型是在约30,000个真实世界的图像以及几个渲染出的合成手模型上进行训练的,并且这些手模型被叠加在各种背景上。

手部关键点模型包含一个掌部检测模型和一个手部关键点检测模型。掌部检测模型可以在输入图像中定位手部,而手部关键点检测模型可以在掌部检测模型定义的裁剪的手部图像上识别特定的手部关键点。
由于运行掌部检测模型需要耗费时间,在视频或实时流运行模式下,Hand Landmarker使用在一个帧中由手部关键点模型定义的边界框来定位后续帧中的手部区域。只有当手部关键点模型不再识别到手部存在或无法在帧内跟踪手部时,Hand Landmarker才重新触发掌部检测模型。这降低了Hand Landmarker触发掌部检测模型的次数。
MediaPipe 手势的核心原理是使用深度卷积神经网络(CNN)来训练掌部检测模型和手部关键点检测模型。在训练过程中,使用大规模的手部图像数据集来训练模型,包括真实世界的手部图像和合成的手部图像,以提高模型的精度和泛化能力。
掌部检测模型的实现基于单阶段目标检测器(Single-Shot Detection,SSD)技术,通过使用卷积神经网络来完成对手部位置和掌心位置的检测。在掌部检测模型中,使用了一个多任务损失函数来同时优化掌部位置和掌心位置的检测。
手部关键点检测模型的实现基于卷积神经网络和递归神经网络(Recurrent Neural Network,RNN)技术,以检测手部关键点、手指骨骼和手指动作等信息。在手部关键点检测模型中,使用了一个分支式的CNN-RNN结构,其中CNN用于提取手部特征,RNN用于检测手指骨骼和手指动作。
除了模型训练以外,MediaPipe 手势识别还涉及到一些预处理和后处理技术,以提高模型的性能和稳定性。例如,对输入图像进行裁剪、缩放和灰度化等预处理操作,以及对检测结果进行非极大值抑制(Non-Maximum Suppression,NMS)和手指跟踪等后处理操作。
with mp_selfie_segmentation.SelfieSegmentation(
model_selection=0) as selfie_segmentation:
for idx, file in enumerate(IMAGE_FILES):
image = cv2.imread(file)
image_height, image_width, _ = image.shape
# Convert the BGR image to RGB before processing.
results = selfie_segmentation.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# Draw selfie segmentation on the background image.
# To improve segmentation around boundaries, consider applying a joint
# bilateral filter to "results.segmentation_mask" with "image".
condition = np.stack((results.segmentation_mask,) * 3, axis=-1) > 0.1
# Generate solid color images for showing the output selfie segmentation mask.
fg_image = np.zeros(image.shape, dtype=np.uint8)
fg_image[:] = MASK_COLOR
bg_image = np.zeros(image.shape, dtype=np.uint8)
bg_image[:] = BG_COLOR
output_image = np.where(condition, fg_image, bg_image)
cv2.imwrite('/tmp/selfie_segmentation_output' + str(idx) + '.png', output_image)
下面的图片展示了任务输出的可视化结果:


