使用姿势估计构建 姿势校正器

news2025/7/8 0:06:18

我们中的许多人大部分时间都在办公桌前弯腰驼背,身体前倾看着电脑屏幕,或者瘫坐在椅子上。如果你像我一样,只有当你的脖子或肩膀在数小时后受伤,或者你有偏头痛时,你才会想起你的不良姿势。如果有人可以提醒您坐直不是很好吗?

好消息是你可以提醒自己!在本教程中,我们将使用 alwaysAI 提供的姿势估计模型构建一个姿势校正器应用程序。

要完成本教程,您必须具备:

  • alwaysAI 账户。

  • alwaysAI 在本机的配置。

  • 诸如 sublime 之类的文本编辑器。

  • 诸如 PyCharm 之类的 IDE。

拥有账户并设置开发人员环境后,下载入门应用程序。在继续本教程的其余部分之前,请使用此链接执行此操作。我们将通过修改 realtime_pose_detector 入门应用来构建姿势校正器。您可能希望将内容复制到一个新目录中,以便保留原始代码。

本教程将分为三个主要部分:

  • 配置文件

  • 主要应用

  • 用于检测不良姿势的实用程序类

配置文件的创建

对于这个示例应用程序,我们需要一个配置变量(如果需要,可以添加更多):scale。它是一个整数,将用于调整姿势功能的灵敏度。

应用程序的创建

将以下代码添加到您的 app.py 文件的顶部:

import os
import json
from posture import CheckPosture

我们需要 json 库来解析配置文件,而 CheckPosture 是我们将在本教程后面定义的用于检测不良姿势的实用程序库。

注意:您可以根据您的部署环境更改在此应用程序中使用的加速器。由于我是在 Mac 上开发的,所以我选择引擎为“DNN”,因此我将参数更改为 edgeiq.Engine.DNN。我还将加速器更改为“CPU”。您可以在 alwaysAI 的文档中阅读有关加速器和引擎选项的更多信息。

接下来,从 app.py 中删除以下代码:

text.append("Key Points:")
for key_point in pose.key_points:
   text.append(str(key_point))

添加以下代码以替换您刚刚删除的代码(在 text.append 语句的正下方):

# update the instance key_points to check the posture
posture.set_key_points(pose.key_points)


# play a reminder if you are not sitting up straight
correct_posture = posture.correct_posture()
if not correct_posture:
  text.append(posture.build_message())
  
   # make a sound to alert the user to improper posture
   print("\a")

我们在使用了一个未知的对象类型,并调用了一些我们尚未定义的函数。我们将在最后一节中做到这一点!

将以下几行移动到上面代码的末尾(紧接在 for 循环之后和 finally 之前):

streamer.send_data(results.draw_poses(frame), text)
fps.update()
if streamer.check_exit():
   break

创建姿势实用程序类

创建一个名为 posture.py 的新文件。使用以下代码定义类:

class CheckPosture

为类创建构造函数。我们将拥有三个实例变量:key_points、scale 和 message。

def __init__(self, scale=1, key_points={}):
  self.key_points = key_points
  self.scale = scale
  self.message = ""

我们为 scale 和 key_points 使用默认值,以防用户不提供它们。我们只是将变量 message 初始化为一个空字符串,但这将存储用户可以用来纠正其姿势的反馈。您已经看到在 app.py 部分设置了 key_points 变量。此变量允许 posture.py 中的函数确定用户的姿势。最后,scale 只是简单地使在 posture.py 中执行的计算在它减少或增加时变得更敏感或更不敏感。

现在我们需要为 posture.py 编写一些函数。

为 key_points、message 和 scale 变量创建一个 getter 和 setter:

def set_key_points(self, key_points):
   self.key_points = key_points
def get_key_points(self):
   return self.key_points
def set_message(self, message):
   self.message = message
def get_message(self):
  return self.message
def set_scale(self, scale):
   self.scale = scale
def get_scale(self):
   return self.scale

现在我们需要定义一个函数来实际检查姿势。我的不良姿势习惯包括身体前倾朝向电脑屏幕、懒洋洋地坐在椅子上以及低头看笔记,因此我定义了检测这几种用例的方法。如果愿意,您可以使用相同的坐标比较原则来定义自己的自定义方法。

首先,我们将定义检测前倾的方法,如下图所示。此方法通过比较身体同一侧的耳朵和肩膀来工作。所以首先它会检测耳朵和肩膀是否在左侧或右侧都可见(即我们要使用的坐标不是 -1),然后它会检查肩膀的 x 坐标是否大于耳朵的 x坐标。

9d8894c3a6fef570a8a3edcc45ced108.png

def check_lean_forward(self):
    if self.key_points['Left Shoulder'].x != -1 and self.key_points['Left Ear'].x != -1 \
    and  self.key_points['Left Shoulder'].x >= (self.key_points['Left Ear'].x + \
    (self.scale * 150)):
        return False
    if self.key_points['Right Shoulder'].x != -1 and self.key_points['Right Ear'].x != -1 \
    and  self.key_points['Right Shoulder'].x >= (self.key_points['Right Ear'].x + \
    self.scale * 160)):
        return False
    return True

注意:alwaysai/human-pose 的坐标是左上角的 0,0。此外,帧大小会根据您是否使用流媒体输入视频或图像而有所不同,这也会影响坐标。我使用 Streamer 对象进行开发,帧大小为 (720, 1280)。对于所有这些功能,您很可能需要调整坐标差异或修改比例,因为每个人都有不同的姿势基线。然而,坐标算法的原理将保持不变,并且可用于更改其他姿势估计用例中的应用程序行为!您还可以使用角度或百分比进行衡量,以免被绝对值所束缚。

接下来,我们将定义在椅子上懒洋洋地坐着的函数,如下图所示:

8477810db3b4ae3fcda626e31d373494.png

在这个函数中,我们将使用 y 坐标的颈部和鼻子关键点来检测鼻子何时太靠近颈部,这发生在某人的背部弯腰坐在椅子上时。对我来说,大约 150 代表了我想要允许的最大距离。如果我的鼻子距离我的脖子不到 150 点,我想得到通知。同样,这些设定的固定值可以使用 scale 参数进行缩放,或者按照上面提示中的建议进行修改。

def check_slump(self):
    if self.key_points['Neck'].y != -1 and self.key_points['Nose'].y != -1 \
    and (self.key_points['Nose'].y >= self.key_points['Neck'].y - (self.scale * 150)):
         return False
    return True

现在,我们将定义检测头部何时向下倾斜的函数,如下图所示。此函数将使用耳朵和眼睛关键点来检测给定眼睛的 y 坐标何时比身体同一侧的耳朵更靠近图像底部。

eac1f556db5ec0c88af2cbf98ddccd39.png

def check_head_drop(self):
    if self.key_points['Left Eye'].y != -1 and self.key_points['Left Ear'].y != -1 \
    and self.key_points['Left Eye'].y > (self.key_points['Left Ear'].y + (self.scale * 15)):
        return False
    if self.key_points['Right Eye'].y != -1 and self.key_points['Right Ear'].y != -1 \
    and self.key_points['Right Eye'].y > (self.key_points['Right Ear'].y + (self.scale * 15)) :
        return False
    return True

现在,我们只创建一个检查所有姿势方法的函数。此方法通过使用 Python 的 all 函数来工作,该函数仅在列表中的所有可迭代对象都返回 True 时才返回 True。如果检测到不良姿势,我们定义的所有姿势方法都会返回 False,如果其中任何一个方法返回 False,我们现在定义的方法将返回 False。

def correct_posture(self):
   return all([self.check_slump(), 
               self.check_head_drop(), 
               self.check_lean_forward()])

最后,我们将构建一个返回自定义字符串的方法,告诉用户如何纠正他们的姿势。此方法在 app.py 中调用,结果显示在文本中:

def build_message(self):
    current_message = ""
    if not self.check_head_drop():
        current_message += "Lift up your head!\n"
    if not self.check_lean_forward():
        current_message += "Lean back!\n"
    if not self.check_slump():
        current_message += "Sit up in your chair, you're slumping!\n"
    self.message = current_message
    return current_message

至此!现在您有了一个工作姿势矫正应用程序。您可以通过创建自己的姿势检测方法、使用不同的关键点坐标、使 build_message 返回不同的提示以及创建您自己的自定义音频文件来代替 print(“\a”) 来自定义此应用程序。您还可以更改应用程序以向您发送短信而不是输出至控制台。

·  END  ·

83612cb6c603e36880f178f84b2a5b95.png

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

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

相关文章

SpringBoot配置文件(学习笔记)

目录 一、配置文件概述 配置文件的作用 配置文件的格式 二、application.properties 配置文件 基本语法 读取配置文件 三、application.yml 配置文件 基本语法 读取yml中的配置 1、yml配置的简单读取 2、读取yml 配置中不同数据类型及 null​编辑 2、读取yml配置文…

Python基础知识入门(三)

Python基础知识入门(一) Python基础知识入门(二) 一、元组类型 元组是用英文小括号 () 把所有元素包裹起来,元组里面的每一个数据叫作元素。每个元素之间都要用 英文逗号 ( , ) 隔开。例如:(1,2,3)。 注意…

Head First设计模式(阅读笔记)-04.工厂模式

披萨订购 假设要完成披萨订购的功能,披萨的种类很多,比如 GreekPizz、CheesePizz 等,披萨店会根据用户需要的披萨种类制作披萨,制作的流程包括prepare->bake->cut->box 简单实现 下面代码的实现十分简单清晰,…

从0到0.1学习 lambda表达式(Java版)

编码几年时间,有一个东西似乎一直也逃不过去,那就是lambda表达式。 无论是c#,Python还是Java,lambda的思想都是共通的。但以下的语法和实例为java。 现在就来说说这个看似很难的lambda表达式 什么是lambda表达式? l…

【owt-server】m88分支和m59-server

OWT 单独有个webrtc的仓库,里面有m88的分支Merged Upgrade sdk to m88 for webrtc node #1026 提交记录 主干merge Merge pull request #1026 from starwarfan/mst-88webrtc-m88 目录 构建修改

【信管2.2】项目管理知识体系与组织结构

项目管理知识体系与组织结构上一次课中,我们已经学过了项目以及项目管理的概念,这些内容帮我们认识到了项目到底是个什么东西,有什么特点,和运营有什么区别等等。今天我们就继续沿着项目这件事说下去,我们将一起探讨一…

【知识网络分析】共引网络(co-citation)

共引网络(co-citation) 1 读取本地文献构建共引网络数据集2 网络数据集精简3 社团群体划分4 节点中心度相关指标计算1 读取本地文献构建共引网络数据集 RC.networkCoCitation()方法中的参数与RC.networkCitation()方法中的参数功能一致。该案例中使用的数据集同样为2020-202…

SpringBoot框架保姆级笔记一看就会

文章目录 文章目录文章目录[toc]1️⃣ 简介一. 什么是 [IoC](https://so.csdn.net/so/search?qIoC&spm1001.2101.3001.7020) 容器?二. AOP面向切面编程三. SSM整合四. HttpServletRequest五. HttpServletResponse六. Cookie 与 Session七. Cookie八. Session九…

Java异常01:Error 和 Exception

什么是异常 # 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的实际要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据…

最全面的SpringMVC教程(一)——SpringMVC简介

前言 本文为SpringMVC相关教程,下边将对SpringMVC进行简单介绍,具体包含:对MVC架构的回顾,什么是SpringMVC,SpringMVC编程示例(包含配置版示例、注解版示例),初识SpringMVC&#xff…

NM DEV Mathematics for Java 【suanshu.net免费】

NM Dev是一个面向对象、高性能、经过广泛测试和专业记录的数学编程库,在S2上运行。自 2010 年开发以来,它是大量经过编码的数值算法,因此它们是可靠的面向对象、统一和可测试的。编程经验或数学知识很少的用户可以通过快速组合类轻松地为他或…

备战 2023 春招,P7 大咖手打 26 大后端面试专题神技,1500 题解析助力

年过后,不少人已经蓄势待发,信心满满地准备投递简历,到处面试,在不同的 Offer 之中择优而栖。 与此同时,也有人会悔恨自己这半年进步不大,每天噼里啪啦敲代码,但面对那些不能再熟悉的 Java 面试…

大数据毕设选题 - 生成对抗网络的照片上色动态算法设计与实现(深度学习 opencv python)

文章目录1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理3 DeOldify 框架4 First Order Motion Model1 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始…

Linux项目后端部署及JDKTomcatMySQL安装

前言 上一篇文章简单的分享了在VMware上安装linux系统,本篇文章将要分享的内容是使用linux系统完成项目的部署 一、前置准备工作 在Windows系统中,我们要在开发环境下才能进行项目的开发。那么在linux系统中也是,在安装完linux系统后&#xf…

NoSuchMethodError的常见原因和通用解决方式

目录 环境信息 问题描述 错误分析 解决方法 常见原因 1.第三方包,作用域不对导致应用没导入该包 2.编译时和运行时使用的版本不一样 3.JDK版本不一样 4.多个同路径、同名的类 1.代码复制场景 2.代码移动场景 排查步骤 附录 Maven仲裁机制: …

为啥这么人选择iPhone

01.听音乐(10元/月) 歌曲很全 多个终端支持 果子自带的Music app 在那个设备都可以使用, 包括MacBook Pro,iPhone,iPad,iwatch等 02.周边配件方便购买 03.遇到问题好解决 04.使用稳定,不会有广告&#x…

MySQL海量数据优化(理论+实战) 吊打面试官

一、准备表数据 咱们建一张用户表,表中的字段有用户ID、用户名、地址、记录创建时间,如图所示 ​OK,接下来准备写一个存储过程插入一百万条数据 CREATE TABLE t_user (id int NOT NULL,user_name varchar(32) CHARACTER SET utf8 COLLATE ut…

[附源码]Python计算机毕业设计防疫物资捐赠系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Vue组件化编程开发

目录 一.模块 二.组件 &#xff08;快捷键< 回车 生成单组件模板&#xff09; 三.非单文件组件 四.单文件组件: 首先理解模块和组件的基本概念: 一.模块 1.理解:向外提供特定功能的js程序&#xff0c;一般就是一个js文件 2.为什么: js文件很多很复杂 3.作用:复用js, 简…

Mybatis-Plus+SpringBoot结合运用

目录 前言 一、创建Maven项目导入相关的依赖 二、在resources添加日志和连接数据库 1.日志文件(log4j.properties) 2.连接数据库&#xff08;application.properties&#xff09; 三、编写pojo &#xff08;注解编写get/set/tostring&#xff09; 四、UserMapper编写继承…