基于关键点检测的病患步态检测及分析方法

news2024/12/26 23:13:07

在临床工作中,对患有神经系统或骨骼肌肉系统疾病而可能影响行走能力的患者需要进行步态分析,以评定患者是否存在异常步态以及步态异常的性质和程度
步态评定临床意义
1、评估患者是否存在异常步态以及步态异常的性质和程度
2、为分析异常步态原因和矫正异常步态、制订治疗方案提供必要的依据
3、评定康复治疗的效果

总体思路

通过检测人体姿态关键点,获取关键点坐标,关键点共有17个点位(见图2),进而得到关键点特征信息,将人体姿态关键点特征信息转换成人体步态特征信息,包括步长、步幅、手臂摆动相(左、右)、上臂摆动相(左、右)、支撑相(颈部、腰椎),共八个指标信息,将单帧运动人体步态指标信息输入特征分析模型,获取单帧步态特征,将连续运动人体步态特征信息输入特征分析模型获取连续运动步态特征量,步态特征量可用于疾病分类或分级,为分析异常步态原因和矫正异常步态、制订治疗方案提供必要的依据。
在这里插入图片描述

人体姿态关键点检测模块

具体使用姿态检测模型与人脸模型进行人体各个关键点的标定,所述姿
态检测模型可以是OpenPose、Realtime MultiPersonPose Estimation(实时多人姿态评 估模型)和AlphaPose(多人识别框架模型)等模型;
安装detectron2模型;

!python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'

detectron2模型的关键点示意图
在这里插入图片描述

关键点检测

import detectron2
from detectron2.utils.logger import setup_logger
setup_logger()

# import some common libraries
import numpy as np
import os, json, cv2, random
import matplotlib.pyplot as plt

# import some common detectron2 utilities
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog
import math

im = cv2.imread('../input/videodata/640-_5_.jpg/9c97186d6c7f44279616a9c3449342e1zcdUwdAqGcg2ifbp-10.jpg')

plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
cv2.imwrite('10input.jpg',im)
plt.axis('off')
plt.show()
cfg = get_cfg()   # get a fresh new config
cfg.merge_from_file(model_zoo.get_config_file("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7  # set threshold for this model
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
v = Visualizer(im[:,:,::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
#out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
out = v.draw_and_connect_keypoints(outputs["instances"].pred_keypoints[0].to("cpu"))
plt.imshow(out.get_image())
plt.axis('off')
cv2.imwrite('10out1.jpg',cv2.cvtColor(out.get_image(), cv2.COLOR_BGR2RGB))

输出结果:
在这里插入图片描述

人体步态特征信息

获取到人体关键点坐标之后,可计算如下特征信息:
步长:关键点16与17之间的距离
步幅:line15-16与line14-16的夹角
上臂摆动相(左):line7-9与line7-13的夹角
上臂摆动相(右):line6-8与line6-12的夹角
手臂摆动相(左):line7-9与line9-11的夹角
手臂摆动相(右):line6-8与line8-10的夹角
支撑相(颈部):line6-7与line1-(18)的夹角
支撑相(腰椎):line(18)-(19)与line12-13的夹角

长度计算公式: 其中(x1,y1),(x2,y2)分别为两个关键点的坐标;
夹角计算公式
其中(x,y)为向量的坐标,(x,y) = ((x1-x2),(y1-y2)),(x1,y1),(x2,y2)分别为两个关键点的坐标
角度计算公式

def angle(v1, v2):
  dx1 = v1[2] - v1[0]
  dy1 = v1[3] - v1[1]
  dx2 = v2[2] - v2[0]
  dy2 = v2[3] - v2[1]
  angle1 = math.atan2(dy1, dx1)
  angle1 = int(angle1 * 180/math.pi)
  # print(angle1)
  angle2 = math.atan2(dy2, dx2)
  angle2 = int(angle2 * 180/math.pi)
  # print(angle2)
  if angle1*angle2 >= 0:
    included_angle = abs(angle1-angle2)
  else:
    included_angle = abs(angle1) + abs(angle2)
    if included_angle > 180:
      included_angle = 360 - included_angle
  return included_angle

特征计算:

step_length:步长 # swin_phase:摆动相 # step_frequency:步频 # step_speed:步速 # supportingphase:支撑相 # step_phase:步幅

def step_state(step_keypoint):
    #step_keypoint=key_point_axis(outputs)
    step_length = math.sqrt((step_keypoint[15][0]-step_keypoint[16][0])**2+(step_keypoint[15][1]-step_keypoint[16][1])**2)
    
    step_phase= angle(step_keypoint[14]+step_keypoint[16],step_keypoint[13]+step_keypoint[15])
    
    swin_phase_right_1 = angle(step_keypoint[6]+step_keypoint[12],step_keypoint[6]+step_keypoint[8])
    swin_phase_right_2 = angle(step_keypoint[5]+step_keypoint[7],step_keypoint[5]+step_keypoint[11])
    swin_phase_right = angle(step_keypoint[8]+step_keypoint[10],step_keypoint[6]+step_keypoint[12])
    swin_phase_left = angle(step_keypoint[7]+step_keypoint[9],step_keypoint[5]+step_keypoint[11])
    
    supportingphase1 = angle(step_keypoint[6]+step_keypoint[12],step_keypoint[12]+step_keypoint[14])
    
    cent_5_6 = [(x+y)/2 for x,y in zip(step_keypoint[5],step_keypoint[6])]
    cent_11_12 = [(x+y)/2 for x,y in zip(step_keypoint[11],step_keypoint[12])]
    
    supportingphase2 = angle(step_keypoint[0]+cent_5_6,cent_5_6+cent_11_12)
    return [step_length,step_phase,swin_phase_right_1,swin_phase_right_2,swin_phase_right,swin_phase_left,supportingphase1,supportingphase2]

步态检测模型

单帧人体步态特征信息数据经过归一化处理之后,利用PCA主成分分析算法进行特征分析,获取单帧步态特征值,进而得到连续运动的视频内每一帧的步态特征集,特征集再进行主成分分析降维获取整个运动过程的特征量。
归一化方法:
在这里插入图片描述
特征分析模型:PCA主成分分析降维模型:

设有 m 条 n 维数据。

1)将原始数据按列组成 n 行 m 列矩阵 X;
2)将 X 的每一行进行零均值化,即减去这一行的均值;
3)求出协方差矩阵 ;
4)求出协方差矩阵的特征值及对应的特征向量;
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
6)即为降维到 k 维后的数据。

在这里插入图片描述

实例

帕金森步态
帕金森病患者特有的步行姿态,表现为步行启动困难、双支撑相时间延长、下肢摆动幅度减小、髋膝关节轻度屈曲、重心前移、步频加快以保持平衡呈现慌张状态,上肢摆动很小。
在这里插入图片描述
经过特征降维之后的连续运动步态特征如下图所示,通过对比正常步态与帕金森步态,可以发现,正常步态在整个运动过程中特征表征匀称,特征变化幅度平缓;而帕金森步态特征表征呈现不规则,在起步阶段的特征表征可以看出起步特征呈现不规律,可以视为困难起步,在运动中程,特征量衰减严重,表征中程运动困难,整体呈现慌张止步状态;运动后期的特征量变化幅度增大,表征运动后期为保持平衡,肢体、手臂、支撑腰椎、步幅等变化大。
在这里插入图片描述
不同疾病步态的特征
在这里插入图片描述

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

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

相关文章

看我们应用性能监控如何几秒钟定位慢访问跟因

背景 某汽车集团的汽车配件电子图册系统是其重要业务系统。最近业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 某汽车集团总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件…

二进制?十进制!

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如: A3,B2A 3 , B 2A3,B2 的时候,AAA 的二进制表示是 : 111111 , BB…

Linux部署Nexus通过Maven推送及拉取代码

😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: Linux部署Nexus通过Maven推送及拉取代码⏱️ 创作时间: 2023年…

myBaits Expert Wheat Exome — 从多个小麦品种中富集超过250Mb的高可信度的外显子

myBaits Expert Wheat Exome 与国际小麦基因组测序联盟(IWGSC)合作开发,使用了IWGSC发布的中国春基因组和注释信息。靶向六倍体小麦中完整的高置信度且有基因注释的外显子区域,能够全面、统一、可靠地深入覆盖大干15 Gb的小麦基因组中超过250 Mb的CDS及其邻近区域。…

硅烷聚乙二醇活性酯;Silane-PEG-NHS;溶于大部分有机溶剂。仅供科研实验使用,不用于诊治

英文名称:Silane-PEG-NHS,Silane-PEG-SCM 中文名称:硅烷聚乙二醇活性酯 分子量:1k,2k,3.4k,5k,10k,20k。。。 存储条件:-20C,避光,…

数组常用方法总结 (5) :find / findIndex / filter

find 与前边讲过的 some 类似,用于检测数组的每一项是否符合限定条件。只要遇到一个符合条件的,就会停止循环。在循环中,如果是简单数组,数据不会被改变,如果是对象数组,数据会改变。如果停止了循环&#…

音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)

数字麦克风与模拟麦克风(DMIC/AMIC) 麦克风(mic):是将声音信号转换为电信号的能量转换器件,也就是用来采集你说话的声音扬声器(speaker):是一种把电信号转变为声信号的换能器件,就是把对方说话产生的电信号转换成声音播放出来。简…

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

比较C在for循环中的i和i以及i的O2优化的效率&#xff1a;i真的比i快吗 前言 对i和i的争论褒贬不一&#xff0c;不知从何时起&#xff08;大概是学C的时候老师就是这么教的&#xff09;我的习惯是在for循环中使用i而不是i for (int i 0; i < n; i) // 典但是看到一些博客…

再说多线程(五)——死锁

在前面四节中&#xff0c;我们一直没有讨论多线程程序的一个负面问题——死锁&#xff0c;有了一定的基础&#xff0c;现在是时候研究一下死锁了。死锁一定是出现在多线程程序中&#xff0c;单线程是不可能造成死锁的&#xff0c;因为你不可能同时加两把锁。死锁有个简单的例子…

《软件工程》课程四个实验的实验报告(《可行性研究与项目计划》《需求分析》《系统设计》《系统实现》)

实验1《可行性研究与项目计划》 实验学时&#xff1a; 2 实验地点&#xff1a; 任意 实验日期&#xff1a; 12月15日 一、实验目的 了解&#xff1a;软件项目可行性研究及项目计划的基本原理与方法&#xff1b;掌握&#xff1a;Visio等工具进行可…

【尚硅谷】Java数据结构与算法笔记06 - 算法复杂度详解

文章目录一、算法的时间复杂度1.1 度量算法执行时间的两种方法1.1.1 事后统计1.1.2 事前估算1.2 时间频度1.2.1 基本介绍1.2.2 举例说明&#xff1a;基本案例1.2.3 举例说明&#xff1a;忽略常数项1.2.4 举例说明&#xff1a;忽略低次项1.2.5 举例说明&#xff1a;忽略系数1.3 …

WebServer传输大文件致客户端自动关闭

程序运行在云服务器上, Ubuntu 20.04LTS系统&#xff0c;用浏览器测试能正常打开页面&#xff0c;请求一般的html文本和几十kb的小图片无问题&#xff0c;接着放了一个1.63MB&#xff08; 1714387字节&#xff09;的网上找的图过去&#xff0c;客户端图没加载完就自动断连了&am…

如何搭建一个专业的企业知识库

当客户跟你达成合作关系后&#xff0c;需要持续的关系维护&#xff0c;在一定的销售点&#xff0c;定期和客户沟通&#xff0c;据调查&#xff0c;赢得一个新客户的成本可能是保留一个现有客户的5到25倍&#xff0c;作为营销策略&#xff0c;客户服务支持必须满足他们的期望。建…

Linux小黑板(7):再谈动静态

"我看到&#xff0c;久违的晴朗啊"一、什么是动静态库在本栏目前面的篇幅也提到过这个概念&#xff0c;因此本小节就小小地回顾一番。在linux下:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。动态库(.so):程序在运行的时候才去链接动态库的代码&am…

【npm报错】解决invalid json response body at https://registry.npmjs.org

报错信息&#xff1a; npm ERR! code FETCH_ERROR npm ERR! errno FETCH_ERROR npm ERR! invalid json response body at https://registry.npmjs.org/riophae%2fvue-treeselect reason: Invalid response body while trying to fetch https://registry.npmjs.org/riophae%2f…

从粪便菌群移植到下一代有益菌:Anaerobutyricum soehngenii为例

谷禾健康 我们知道&#xff0c;肠道微生物群对人类健康和福祉很重要&#xff0c;调节宿主代谢&#xff0c;塑造免疫系统并防止病原体定植。 通过粪便微生物群移植&#xff08;FMT&#xff09;恢复平衡多样的微生物群&#xff0c;已成为研究疾病发病机制中微生物群因果关系的潜在…

Spring Cloud Gateway 之限流

文章目录一、常见的限流场景1.1 限流的对象1.2 限流的处理方式1.3 限流的架构二、常见的限流算法2.1 固定窗口算法&#xff08;Fixed Window&#xff09;2.2 滑动窗口算法&#xff08;Rolling Window 或 Sliding Window&#xff09;2.3 漏桶算法&#xff08;Leaky Bucket&#…

CSS3属性之text-overflow:ellipsis详解

1.text-overflow: 默认值:clip; 适用于:所有元素 clip:当前对象内文本溢出时不显示省略标记(…),而是将溢出部分裁剪。 ellipsis:当对象内文本一处时显示省略标记(…)。 当然这还是不够的&#xff0c;需要加点调料才能出现效果: 那就是配合 overflow:hidden white-space:…

高级树结构之红黑树初识

文章目录一 红黑树简介二 探究变色、旋转操作的时机三 总结一 红黑树简介 通过在插入几点时维护数的平衡&#xff0c;这样就不会出现极端情况&#xff0c;使得整棵树的查找效率急剧降低。但是这样造成系统开销过大&#xff0c;因为一旦平衡因子的绝对值超过一就失衡&#xff0…

iOS 界面尺寸居然跟实际机型不符!

0x00 前言 日常搬砖过程中&#xff0c;一条日志&#xff0c;让我对手里的 iPhone 6 Plus 产生了怀疑&#xff1f; 这是 6P&#xff0c;怎么尺寸变成 6 了呢&#xff1f; 0x01 对比 手机连上电脑&#xff0c;通过 Xcode 查看 Window 菜单&#xff1a;Devices and Simulators …