深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)

在这里插入图片描述

正确的身体姿势是一个人整体健康的关键。然而,保持正确的身体姿势可能很困难,因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近,我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力!
在这里插入图片描述

文章目录

  • 使用 Pose 进行身体姿势检测
  • 应用目的
  • 身体姿势检测和分析应用工作流程
  • 要求
  • 身体姿势检测代码说明
  • 使用 pose进行身体姿势检测

Pose 是一种高保真身体姿势跟踪解决方案,可从 RGB 帧(注意RGB图像帧)渲染全身上的33 个 3D 地标和背景分割掩模。它利用 BlazePose[1] 拓扑,这是 COCO[2]、BlazeFace[3] 和 BlazePalm[4] 拓扑的超集。

在这里插入图片描述

应用目标 – 身体追踪

我们的目标是从完美的侧视图检测一个人,并测量颈部和躯干相对于某个参考轴的倾斜度。通过监测人弯曲低于某个阈值角度时的倾斜角度。
其他功能包括测量特定姿势的时间和相机对准。我们必须确保相机看到正确的侧视图。因此我们需要对齐功能。
在这里插入图片描述

添加
代码环境安装

pip install -r requirements.txt

身体姿势检测代码说明

1. 导入库

import cv2
import numpy

2. 计算偏移距离的函数

该设置要求人处于正确的侧视图中。该函数findDistance 帮助我们确定两点之间的偏移距离。它可以是髋点、眼睛或肩膀。
选择这些点是因为它们总是或多或少关于人体的中心轴对称。这样,我们将在脚本中合并相机对齐功能。
在这里插入图片描述

def findDistance(x1, y1, x2, y2):
dist = m.sqrt((x2-x1)**2+(y2-y1)**2)
return dist

3. 计算身体姿势倾斜度的功能

角度是姿势的主要决定因素。我们使用颈线和躯干线与 y 轴所成的角度。领口连接肩膀和眼睛。这里我们以肩部为支点。
同样,躯干线连接臀部和肩膀,其中臀部被认为是枢轴点

在这里插入图片描述

以颈线为例,我们有以下几点。
P1 (x1,y1):肩部
P2 (x2, y2):眼睛
P3 (x3,y3):穿过P1的垂直轴上的任意点
显然,P3的x 坐标与 P1 的 x 坐标相同。由于y3对所有y都有效,因此为了简单起见,我们取 y3 = 0。
我们采用向量方法来求三点的内角。两个向量P 12 和P 13之间的角度 由下式给出:

def findAngle(x1, y1, x2, y2):theta = m.acos( (y2 -y1)*(-y1) / (m.sqrt((x2 - x1)**2 + (y2 - y1)**2 ) * y1) )degree = int(180/m.pi)*thetareturn degree

4. 发送不良身体姿势警报功能

使用此功能在检测到不良姿势时发送警报。我们将其留为空,供您使用。您可以在方便的时候随意发挥创意和定制。例如,您可以连接 Telegram Bot 来发出警报,这非常简单。链接见参考文献[6]。或者您可以通过创建 Android 应用程序将其提升一个档次。

def sendWarning(x):pass
在这里初始化常量和方法。这些内容应该通过内联注释是不言自明的。
# Initialize frame 
counters.good_frames = 0bad_frames  = 0 
# Font type.font = cv2.FONT_HERSHEY_SIMPLEX # 
Colors.blue = (255, 127, 0)red = (50, 50, 255)green = (127, 255, 0)dark_blue = (127, 20, 0)light_green = (127, 233, 100)yellow = (0, 255, 255)pink = (255, 0, 255) 
# Initialize mediapipe pose 
class.mp_pose = mp.solutions.posepose = mp_pose.Pose()

身体姿势检测主要功能

1. 创建视频捕获和视频写入器对象

为了进行演示,我们使用预先录制的视频样本。在实践中,您需要定位网络摄像头以捕获您的侧视图。在以下代码片段中,创建了视频捕获和视频编写器对象。
如您所见,我们正在获取视频元数据来创建视频捕获对象。如果要以mp4格式写入,请将编解码器更改为*‘mp4v’。有关视频编写器和处理编解码器的更直观指南,请查看有关OpenCV 视频编写器的文章。

# For webcam input replace file name with 0.    
file_name = 'input.mp4'    cap = cv2.VideoCapture(file_name)     
# Meta.    
fps = int(cap.get(cv2.CAP_PROP_FPS))    
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))    
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))    
frame_size = (width, height)    
fourcc = cv2.VideoWriter_fourcc(*'mp4v')     
# Video writer.    
video_output = cv2.VideoWriter('output.mp4', fourcc, fps, frame_size)

2.身体姿势检测 主循环

  • fPose ()解决方案的可配置 API不需要太多调整。默认值足以检测姿势地标。但是,如果我们希望实用程序生成分段掩码,则
    ENABLE_SEGMENTATION 标志必须设置为True。以下是姿势解决方案中的一些可配置 API 。
  • STATIC_IMAGE_MODE:这是一个布尔值。如果设置为True,则会针对每个输入图像运行人物检测。这对于视频来说不是必需的,视频中检测运行一次,然后进行地标跟踪。默认值为False。
    MODEL_COMPLEXITY:默认值为 1。它可以是 0、1 或 2。如果选择更高的复杂度,推理时间会增加。
  • ENABLE_SEGMENTATION:如果设置为True,解决方案会生成分割掩模以及姿势地标。默认值为False。
  • MIN_DETECTION_CONFIDENCE:范围从 [0.0 – 1.0]。顾名思义,它是检测被认为有效的最小置信度值。默认值为
    0.5。
  • MIN_TRACKING_CONFIDENCE:范围从 [0.0 – 1.0]。它是被视为已跟踪的地标的最小置信值。默认值为 0.5。

通常,默认值就可以很好地工作。因此,我们不会在mp_pose.Pose().以下部分中传递任何参数,该部分将讨论 RGB 帧的处理,稍后我们可以从中提取姿势地标。最后,我们将图像转换回 OpenCV 友好的 BGR颜色空间。

3. 获取身体姿势地标坐标

解决方案输出对象的pose_landmarks属性提供地标的标准化x和y坐标。因此,为了获得实际值,我们需要将输出分别乘以图像的宽度和高度。
地标“ LEFT_SHOULDER”、“RIGHT_SHOULDER”等是 PoseLandmark 类的属性。为了获取标准化坐标,我们使用以下语法。

使用如下所示的表示形式来简化这些方法。

4. 对齐相机

这是为了确保相机捕捉到人的正确侧视图。我们正在测量左肩点和右肩点之间的水平距离。正确对齐后,左右点应该几乎重合。
请注意,偏移距离阈值基于对具有与视频样本精确尺寸的数据集的观察。如果您尝试使用更高分辨率的样本,该值将会改变。它不必非常具体;您可以根据自己的直觉设置阈值。
实际上,距离法根本不是确定对齐的正确方法。它应该是基于角度的。
为简单起见,我们使用距离方法。

# Calculate distance between left shoulder and right shoulderpoints.offset = findDistance(l_shldr_x, l_shldr_y, r_shldr_x, r_shldr_y) 
# Assist to align the camera to point at the side view of the person.
# Offset threshold 30 is based on results obtained from analysis over 100 samples.if offset < 100:    cv2.putText(image, str(int(offset)) + ' Aligned', (w - 150, 30), font, 0.9, green, 2)else:    cv2.putText(image, str(int(offset)) + ' Not Aligned', (w - 150, 30), font, 0.9, red, 2

5. 计算身体姿势倾斜度并绘制地标

使用预定义函数获得倾角findAngle。地标及其连接如下图所示。
在这里插入图片描述

6. 身体姿势检测条件

根据姿势的好坏;显示结果。同样,阈值角度基于直觉。您可以根据需要设置阈值。每次检测时,良好姿势和不良姿势的帧计数器都会分别递增。
特定姿势的时间可以通过帧数除以fps来计算。查看我们之前的博客文章中的fps 测量方法。

在这里插入图片描述

结论

这就是使用构建姿势校正器应用程序的全部内容。在这篇文章中,我们实现检测人体姿势。您学习了如何获取姿势标志、可配置 API、输出等。我希望这篇博文可以帮助 姿势的基础知识,并帮助您为下一个项目产生一些新想法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20安装ssh服务

Ubuntu20上执行如下命令查看是否存在ssh服务 #ps -e | grep ssh 只有ssh-agent&#xff0c;没有sshd; 因此要安装openssh-server. 搜索openssh-server,得到下载链接&#xff1a; openssh-server 复制这个Binary Package链接即可下载&#xff0c;然后使用如下命令安装 sudo…

PyQt6库和工具库QTDesigner安装与配置

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

【knife4j-spring-boot】Springboot + knife4j-spring-boot 整合swagger脚手架

swagger-boostrap-ui从1.x版本到如今2.x&#xff0c;同时也更改名字Knife4j 在此记录下 knife4j-spring-boot-starter 的整合。 只需要引入knife4j-spring-boot-starter&#xff0c;无需引入其他的swagger包&#xff0c;knife4j-spring-boot-starter已经包含。 官方版本说明…

详细解答T-SNE程序中from sklearn.manifold import TSNE的数据设置,包括输入数据,绘制颜色的参数设置,代码复制可用!!

文章目录 前言——TSNE是t-Distributed Stochastic Neighbor Embedding的缩写1、可运行的T-SNE程序2. 实验结果3、针对上述程序我们详细分析T-SNE的使用方法3.1 加载数据3.2 TSNE降维3.3 绘制点3.4 关于颜色设置&#xff0c;颜色使用的标签数据的说明cy 总结 前言——TSNE是t-D…

Centos Download

前言 CentOS Linux 是一个社区支持的发行版&#xff0c;源自 CentOS git for Red Hat Enterprise Linux &#xff08;RHEL&#xff09; 上免费提供给公众的源代码。因此&#xff0c;CentOS Linux 的目标是在功能上与 RHEL 兼容。CentOS 计划主要更改组件以删除上游供应商的品牌…

【微服务专题】SpringBoot自动配置源码解析

目录 前言阅读对象阅读导航前置知识笔记正文0、什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】 一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注解2.…

java 反射和注解1-反射详解

反射和注解本就是一家人&#xff0c;注解离不开反射&#xff0c;这里先将反射的写法&#xff0c;本文涉到的注解暂时可以不不用理解 1&#xff0c;创建一个类 public class ReflexUser {public String name;private String namePrivate;protected String nameProtected;Strin…

Arduino库之 LedControl 库说明文档

LedControl 库最初是为基于 8 位 AVR 处理器的 Arduino 板编写的。用于通过MAX7219芯片控制LED矩阵和7段数码管。但由于该代码不使用处理器的任何复杂的内部功能&#xff0c;因此具有高度可移植性&#xff0c;并且应该在任何支持 和 功能的 Arduino&#xff08;类似&#xff09…

模拟火车订票系统---python序列

if __name__ __main__:#创建车辆信息列表list["车次","出发站-到达站","出发时间","到达时间","历时","余票"]trainNumber[T40,T298,Z158,Z62]address[长春-北京,长春-北京,长春-北京,长春-北京]getTime[00:12,0…

简单介绍一下js中的构造函数、原型对象prototype、对象原型__proto__、原型链

构造函数 function Star (uname, age){this.uname unamethis.age agethis.sing function(){ log(唱歌~) }}let xzq new Star(薛之谦, 30)let ldh new Star(刘德华, 20)log(ldh) // { uname: 刘德华, age: 20, sing: f }ldh.sing() // 唱歌~log(ldh.sing xzq.sing) // fal…

DevEco Studio安装

HUAWEI DevEco Studio For OpenHarmony&#xff08;以下简称DevEco Studio&#xff09;是基于IntelliJ IDEA Community开源版本打造&#xff0c;面向OpenHarmony全场景多设备的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供工程模板创建、开发、编译…

服务器被入侵了怎么去排查

在当今数字化时代&#xff0c;网络安全问题变得越来越重要。其中&#xff0c;服务器被入侵是一种常见的安全威胁。当服务器被入侵时&#xff0c;我们需要采取一系列措施来排查和解决问题。本文将为您提供服务器被入侵后的排查步骤。 第一步&#xff1a;确认服务器被入侵 当发现…

C语言进阶之路-基本数据小怪篇

目录 一、学习目标&#xff1a; 二、数据基本类型 整型 浮点型 / 实型 字符 字符串 布尔型数据 三、重要的杂七杂八知识点 常量与变量 标准输入 sizeof运算符&#xff1a; 类型转换 数据类型的本质 整型数据尺寸 可移植性整型 拿下第一个C语言程序 总结 一、学…

web前端之引入svg图片、html引入点svg文件、等比缩放、解决裁剪问题、命名空间、object标签、阿里巴巴尺量图、embed标签、iframe标签

MENU 前言直接在页面编写svg使用img标签引入通过css引入使用object标签引入其他标签参考资料 前言 web应用开发使用svg图片的方式&#xff0c;有如下几种方式 1、直接在页面编写svg 2、使用img标签引入 3、通过css引入 4、使用object标签引入 直接在页面编写svg 在html页面直接…

LeetCode Hot100 101.对称二叉树

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 代码&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {if(rootnull || (root.leftnull && root.rightnull)) {return true;}//用队列保存节点LinkedList<…

【网易云商】构建高效 SaaS 系统的技术要点与最佳实践

SaaS 是什么 定义 相信大家都对云服务中的 IaaS、PaaS、SaaS 早就有所耳闻&#xff0c;现在更是衍生出了 aPaaS、iPaaS、DaaS 等等的类似概念。对于 SaaS 也有各种各样的定义&#xff0c;本文给出的定义是&#xff1a; SaaS 是一种基于互联网提供服务和软件的交付模式&#xf…

水果编曲软件FL Studio21.2下载安装教程

简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前最新版本(包括测试版本)是FL Studio21.2&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音…

工业以太网交换机未来发展中的几个趋势

随着工业自动化不断发展和智能制造的推进&#xff0c;工业以太网交换机在未来的应用中将面临更多的发展机遇和挑战。在工业以太网交换机的未来发展中&#xff0c;有几个方面将成为趋势。 网络虚拟化 随着工业自动化系统规模的不断扩展&#xff0c;网络虚拟化将成为未来的发展方…

四、防火墙-NAT Server

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 NAT Server1.1.基本原理1.2.多出口场景下的NAT Server1.3.源进源出 —————————————————————————————————————————————————— NAT Server 一般对用户提供一些可访问的…

Python开发运维:Django 4.2.7 使用Celery 5.3.5 完成异步和定时任务

目录 一、实验 1.Django使用Celery完成异步和定时任务 二、实验 1. 如何查看Django版本 一、实验 1.Django使用Celery完成异步和定时任务 (1)安装Django (2)新建Django项目 (3)初始框架 (4)urls.py引用视图views from django.contrib import admin from django.urls imp…