在现实世界中实时追踪人类活动,通过姿态估计来评估运动表现或一般身体动作,以帮助获得正确的形态和技术见解是一种常见方法。本指南将向展示如何使用关键点或姿态估计模型构建自定义计算机视觉应用。将学习如何构建自己的计算机视觉模型,并有效地实施计算机视觉工作流程。
项目步骤概述
在开始之前,让分解项目的步骤。步骤包括:创建自定义视觉模型、创建工作流、下载所需库、导入库、获取关键点、获取Mediapipe检测以及添加部署代码。
步骤1:创建Roboflow模型
首先,注册Roboflow并创建一个免费账户。接下来,转到工作区并创建一个项目。自定义项目名称和注释组,确保创建一个关键点检测项目。接下来,添加图像。如果没有时间收集自己的数据,可以使用Roboflow Universe,这是世界上最大的开源计算机视觉数据集和API集合,来寻找数据集。然后,添加希望模型检测的类别。命名类别,然后为项目创建两个点。这些是两个点。左边是重量的左侧。右边是右侧。
接下来,开始注释数据集。建议在训练第一个模型之前至少获得50张注释图像。为每张图像绘制注释,并重复此步骤。确保关键点在重量的两侧。最后,生成标记图像的数据集版本。每个版本都是唯一的,并与训练的模型相关联,因此可以迭代进行增强和数据实验。
步骤2:创建工作流
使用创建的模型,可以使用Roboflow Workflows,这是一个用于构建计算机视觉管道的低代码工具。工作流通过使模型和自定义逻辑的组合变得简单,帮助简化应用程序构建过程。首先,导航到仪表板的工作流选项卡并创建一个工作流。选择创建自定义工作流的选项。接下来,在侧边栏中选择一个关键点检测模型。最后,选择要使用的模型。在例子中,将使用olympics-2/1。最后,保存模型并获取部署代码(两者都可以在屏幕右上角找到)。
现在已经拥有模型,可以下载一些有用的库。确保它们是最新版本以避免任何错误。请注意,由于轮安装,安装opencv可能需要一段时间。
!pip install opencv-python numpy supervision inference mediapipe
步骤4:导入所需库
下载库后,现在需要导入所需的库。
import cv2
from inference.core.interfaces.camera.entities import VideoFrame
from inference import InferencePipeline
import supervision as sv
import mediapipe as mp
import numpy as np
步骤5:获取模型关键点
使用之前创建的模型,现在需要从中提取有用的数据。可以通过以下代码片段实现这一点。这个函数:接受模型的结果,获取检测信息(位置、类别、置信度等),并使用sv.KeyPoints返回值。
def from_workflows(result):
# 如果没有检测到关键点,不确定会发生什么。
if "predictions" not in result:
return sv.KeyPoints.empty()
detections = result["predictions"]["predictions"]
xy = detections.data["keypoints_xy"].astype(np.float32)
class_id = detections.data["keypoints_class_id"].ravel().astype(np.int_)[: len(xy)]
confidence = detections.data["keypoints_confidence"].astype(np.float32)
return sv.KeyPoints(
xy=xy,
confidence=confidence,
class_id=class_id,
)
步骤6:获取Mediapipe检测
Mediapipe将帮助绘制人体的关节。通过最近发布的Supervision 22.0,可以无缝地将mediapipe检测集成到帧上,只需很少的代码。以下代码片段:初始化mediapipe模型(与创建的不同)以及边缘注释器,获取模型的结果,使用Supervision的边缘注释器在帧上绘制关节,获取左髋和右髋的值以进行未来的体态计算。
mp_pose = mp.solutions.pose
model = mp_pose.Pose()
edge_annotator2 = sv.EdgeAnnotator(color=sv.Color.BLACK, thickness=5)
def Get_Mediapipe(image):
results = model.process(image)
key_points = sv.KeyPoints.from_mediapipe(results, resolution_wh=image.shape[1::-1])
image = edge_annotator2.annotate(
scene=image, key_points=key_points
)
left_hip = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_HIP]
right_hip = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_HIP]
left_hip.x = int(left_hip.x * 1920)
left_hip.y = int(left_hip.y * 1080)
right_hip.x = int(right_hip.x * 1920)
right_hip.y = int(right_hip.y * 1080)
步骤7:创建主预测函数
通过创建一个主函数,可以使预测代码更加有组织。在这一步中,结合了之前的函数以及额外的逻辑。这个代码片段:定义所需的注释器,通过视频帧获取图像,调用两个函数,在帧上绘制从上一个函数获得的关键点,使用cv2.imshow显示所有代码。
vertex_annotator1 = sv.VertexAnnotator(radius=8)
edge_annotator1 = sv.EdgeAnnotator(thickness=4, edges=[(0, 1)])
def on_prediction(res: dict, frame: VideoFrame) -> None:
image = frame.image
annotated_frame = image.copy()
Get_Mediapipe(annotated_frame)
keypoints = from_workflows(res)
annotated_frame = edge_annotator1.annotate(
scene=annotated_frame, key_points=keypoints
)
annotated_frame = vertex_annotator1.annotate(
scene=annotated_frame, key_points=keypoints
)
# 显示注释帧
cv2.imshow("frame", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
return
步骤8:获取部署代码
最后,从Roboflow Workflows获取之前获得的部署代码。通过添加它并启动管道,已经成功完成了项目。输出视频帧应该看起来与此类似:0:00 / 0:21 1×