使用OpenCV对运动员的姿势进行检测
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
如今,体育运动的热潮日益流行。同样,以不正确的方式进行运动的风险也在增加。有时可能会导致严重的伤害。考虑到这些原因,提出一种以分析运动员的关节运动,来帮助运动员纠正姿势的解决方案。
人体姿势估计是计算机视觉领域的重要问题。它的算法有助于定位手腕,脚踝,膝盖等部位。这样做是为了使用深度学习和卷积神经网络的概念提供个性化的运动训练体验。特别是对于体育活动而言,训练质量在很大程度上取决于图像或视频序列中人体姿势的正确性。
从图像或视频序列中检测运动员的姿势
数据集
正确选择数据集以对结果产生适当影响也是非常必要的。在此姿势检测中,模型在两个不同的数据集即COCO关键点数据集和MPII人类姿势数据集上进行了预训练。
1. COCO:COCO关键点数据集是一个多人2D姿势估计数据集,其中包含从Flickr收集的图像。迄今为止,COCO是最大的2D姿势估计数据集,并被视为测试2D姿势估计算法的基准。COCO模型有18种分类。COCO输出格式:鼻子— 0,脖子—1,右肩—2,右肘—3,右手腕—4,左肩—5,左手肘—6,左手腕—7,右臀部—8,右膝盖—9,右脚踝—10,左臀部—11,左膝—12,左脚踝—13,右眼—14,左眼—15,右耳—16,左耳—17,背景—18
具体步骤
步骤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格式,以便可以将其作为输入输入到网络。这些参数将在blobFromImage函数中提供。由于OpenCV和Caffe都使用BGR格式,因此无需交换R和B通道。
# 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 * 2个部分亲和度图。同样,对于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]:
points[partA], points[partB], (0, 255, 0), 3)
结果
上面显示的输出向我们显示了运动员在特定时刻的准确姿势。下面是视频的检测结果。
项目源码:https://github.com/ManaliSeth/Athlete-Pose-Detection
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
本文分享自微信公众号 - 小白学视觉(NoobCV)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。
这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇。老规矩,先荒腔走板聊聊其他的。 上面这张图片是我前几天整理相册的时候看到的。拍摄于 2016 年 8 月 20日,北京。 那个时候我刚刚去北京没多久,住在公司的提供的宿舍里面。宿舍位于北京二环内的一个叫做东廊下的胡同里。 位置极佳,条件极差。 我刚刚进入宿舍的时候,房间里面只有一张大床、一个矮矮的电视柜、一个不能摇头的风扇。我的房间也没有空调,到处都是灰蒙蒙的,用卫生间都是去楼下的公共卫生间。 有一次北京下暴雨,我才发现窗户那边有一个缺口,雨下的太大,可以顺着那个缺口流下来,把我的鞋都打湿了。 宿舍里面没有冰箱,所以节假日我在宿舍只煮面条或者用电饭煲做干饭,然后就着各种酱吃。记得有一次周五领导请我们吃饭,最后菜点多了,有几个羊蹄动都没动,领导就叫我打包带回家。我带回去,挂在墙上挂钩,准备第二天中午吃。第二天一闻,坏了,也就没有吃。 宿舍里面也没有洗衣机,所以我在超市买了一个巨大的盆子,每周末的时候我会拿出一个下午的时间,边看电视,边手搓衣服,四季如此。 刚刚去北京的前一年,过...
- 下一篇
勿套“公式”!谈谈UI设计中的字号,间距,大小等规律
据说点击蓝色字体关注同学都升职加薪了 静电说:新手在学习UI设计过程中,通常会陷入到一个误区中,就是把UI设计当算术题来做。比如经常会有同学问:UI界面中的字号最小是多少?UI界面模块中的间距有没有什么规则可以遵循?是不是一定要4的倍数?UI界面左右留白多少才合适,有规范吗?按钮的圆角多少才合适? 先说结论:UI设计过程中或多或少会有一些经验数值,但经验数值仅仅是经验数值,并不是公式,不能生搬硬套。而大多数情况下,则没有“经验值”一说。设计不仅仅是理性的,也是感性的。我们要从两个方面入手来进行学习。下面来解答几个常见问题: Q:字号一定要是2的倍数吗? A:关于2的倍数这一问题,大部分情况下是一种约定俗成的结论。在使用PS做设计的时代,由于我们做的UI设计稿都是2倍图或者3倍图,所以使用2的倍数会更方便于开发工程师换算,比如你在2倍图下设定一个字体大小为24px,开发工程师在开发过程中要进行换算,除以2,得到的数值就是12pt。最终,这个12pt就写在了代码里。但是如果你设置为23pt,不好意思,除起来就有小数点了,最终为11.5pt。为了避免出现小数点,所以最终就约定了字号最好为2的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果