使用OpenCV对运动员的姿势进行检测
本文介绍了通过计算机视觉技术检测运动员姿势的方法,并提出了一个基于深度学习的解决方案。该方法利用COCO和MPII两个数据集对模型进行预训练,并详细描述了从图像到关键点检测再到骨架绘制的具体步骤。实验结果表明该方法能够准确识别运动员的姿势,并应用于个性化运动训练中。
点击上方“小白学视觉 ”,选择加"星标 "或“置顶 ”
重磅干货,第一时间送达

如今体育运动已成为越来越受欢迎的活动。同样地,在错误的方式下进行运动也存在较高的风险。这偶尔会导致严重的伤害。鉴于上述原因,在分析运动员关节运动的基础上提出了一种解决方案来帮助他们纠正姿势。
人体姿势估计属于[计算机视觉]领域的重要研究方向之一。该技术通过特定算法能够实现对人体各个关键部位(如手腕、脚踝、膝盖等)的定位与分析。这些技术手段旨在通过深度学习和卷积神经网络的概念来个性化地改善运动训练体验。特别是在体育活动中...的情况下...的重要性更加突出。

从图像或视频序列中检测运动员的姿势
数据集
科学选择数据集以使结果获得合理指导同样不可或缺。在该姿势检测任务中,模型通过预先对COCO关键点数据集以及 MPII 人体姿态数据集进行学习获得了强化训练。
1. COCO 是一个基于关键点标注的2D人体姿态估计数据集。该数据集由Flickr平台上的大量图像构成,并被认为是当前最权威的2D姿态估计算法评估基准。该数据集涉及18个不同的身体部位分类(即:0表示鼻子, 1表示脖子,…, 18表示背景)。每个标记的具体意义如下所示:
2. MPII :MPII人体姿势数据集是一个多人2D姿势估计数据集,包含从Youtube视频中收集的近500种不同的人类活动。MPII是第一个包含各种姿势范围的数据集,也是第一个在2014年发起2D姿势估计挑战的数据集。MPII模型输出15分。MPII输出格式:头—0,脖子—1,右肩—2,右肘—3,右腕—4,左肩—5,左肘—6,左腕—7,右臀部—8,右膝盖—9,右脚踝—10,左臀部—11,左膝盖—12,左脚踝—13,胸部—14,背景—15

经过数据预处理步骤并使用卷积神经网络模型进行深度学习训练生成的数据点。
具体步骤
步骤1:需求收集(模型权重)和负载网络
经过精心训练的模型需要导入到OpenCV中。这些模型被培训于Caffe深度学习框架。Caffe模型由两个文件组成,包括.prototxt文件和.caffemodel文件。
-
.prototxt文件指定了神经网络的体系结构。
-
.caffemodel文件存储训练后的模型的权重。
然后我们将这两个文件加载到网络中。
# Specify the paths for the 2 files
protoFile = "pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
weightsFile = "pose/mpi/pose_iter_160000.caffemodel"
# Read the network into Memory
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)
步骤2:读取图像并准备输入网络
为了实现这一目标,我们计划采用blobFromImage函数将图像从OpenCV格式转换为Caffe blob格式,并使该操作能够顺利地将图像传递给网络。这些参数将由该函数自动接收并处理。考虑到OpenCV和Caffe都采用BGR色彩编码方案,在此情况下无需进行红蓝通道的交换即可完成数据传输工作。
# Read image
frame = cv2.imread("image.jpg")
# Specify the input image dimensions
inWidth = 368
inHeight = 368
# Prepare the frame to be fed to the network
inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)
# Set the prepared object as the input blob of the network
net.setInput(inpBlob)
步骤3:做出预测并解析关键点
当图像被输入到模型时(...),就可以利用OpenCV中的DNN模块实现的前向传播过程来进行预测;这一过程实际上指的是数据沿神经网络结构传递的方式,在某种程度上这也是预测操作的一种表述方式。
output = net.forward()
输出为4D矩阵:
- 第一个维度是图片ID(如果您将多个图片传递到网络)。
第二个维度用于标识关键点的位置。该模型通过生成位置置信度图(图像上显示的概率分布)和连接关系亲和度图(表示各骨骼连结处的关联程度),提供对人体姿态信息的全面描述。具体而言,在COCO模型中包含57个部分:18个关键点的位置置信度图、1个背景区域以及19对连接关系亲和度图;而MPI模型则有44个部分构成类似的描述框架。在实际应用中,我们通常仅关注与这些关键点直接相关的前几个部分进行分析。
-
第三维是输出图的高度。
-
第四个维度是输出图的宽度。
随后,在图像中标记出每一个关键点。随后,在图像中标记出每一个关键点。随后,在图像中标记出每一个关键点。

置信度图
一旦检测到关键点,我们便将其绘制在图像上。
H = out.shape[2]
W = out.shape[3]
# Empty list to store the detected keypoints
points = []
for i in range(len()):
# confidence map of corresponding body's part.
probMap = output[0, i, :, :]
# Find global maxima of the probMap.
minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
# Scale the point to fit on the original image
x = (frameWidth * point[0]) / W
y = (frameHeight * point[1]) / H
if prob > threshold :
cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255), thickness=-1, lineType=cv.FILLED)
cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, lineType=cv2.LINE_AA)
# Add the point to the list if the probability is greater than the threshold
points.append((int(x), int(y)))
else :
points.append(None)
cv2.imshow("Output-Keypoints",frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
步骤4:绘制骨架
基于当前的布局
for pair in POSE_PAIRS:
partA = pair[0]
partB = pair[1]
if points[partA] and points[partB]:
cv2.line(frameCopy, points[partA], points[partB], (0, 255, 0), 3)
结果

第一部分呈现了运动员在某个瞬间的标准动作。接下来是视频检测的画面。
项目源码:https://github.com/ManaliSeth/Athlete-Pose-Detection
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复「扩展模块中文教程」, 即可获取这份全网唯一的OpenCV扩展模块中文版教程, 包含包括二十多个章节的内容。
下载2:Python视觉实战项目52讲
关注并进入「小白学视觉」公众号的后台,在后方输入框中输入:Python视觉实战项目(注意:此处需在输入框中完成完整的关键词输入),即可下载包含图像分割、口罩检测、车道线检测等在内的31个经典Python视觉实战项目包。这些项目涵盖了图像分割、口罩检测、车道线检测等多种场景任务,并提供详细的代码实现与说明文档。通过这些实战项目的学习与练习,您可以快速掌握并应用到实际工作中。
下载3:OpenCV实战项目20讲
关注并进入该公众号后,在文章底部点击'评论区留言'即可获取' OpenCV实战项目 20 讲' 包含 20 个基于 Open CV 开发的实用项目案例 助力你快速掌握 Open CV 技术
交流群
欢迎加入 AI公众号读者交流群!目前我们已建立多个专业微信群(未来会持续细分),涵盖领域包括但不限于SLAM、计算机视觉、传感器技术、自动驾驶、计算摄影、目标检测与跟踪、图像分割、深度学习算法研究等。扫描下方二维码入群,请在入群时备注:“昵称+学校/公司+研究方向”,如:“张三 + 上海交大 + 视觉SLAM”。通过审核后会根据您的研究方向拉您进相关 specialize group。请注意,在群里禁止发送广告信息或无关链接(


