在临床工作中,对患有神经系统或骨骼肌肉系统疾病而可能影响行走能力的患者需要进行步态分析,以评定患者是否存在异常步态以及步态异常的性质和程度
步态评定临床意义
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 维后的数据。
实例
帕金森步态
帕金森病患者特有的步行姿态,表现为步行启动困难、双支撑相时间延长、下肢摆动幅度减小、髋膝关节轻度屈曲、重心前移、步频加快以保持平衡呈现慌张状态,上肢摆动很小。
经过特征降维之后的连续运动步态特征如下图所示,通过对比正常步态与帕金森步态,可以发现,正常步态在整个运动过程中特征表征匀称,特征变化幅度平缓;而帕金森步态特征表征呈现不规则,在起步阶段的特征表征可以看出起步特征呈现不规律,可以视为困难起步,在运动中程,特征量衰减严重,表征中程运动困难,整体呈现慌张止步状态;运动后期的特征量变化幅度增大,表征运动后期为保持平衡,肢体、手臂、支撑腰椎、步幅等变化大。
不同疾病步态的特征