1
1
import numpy as np
2
2
from mxnet import ndarray
3
+ from sklearn .metrics import r2_score
4
+
3
5
4
6
# 需要测量角度的部位,每个部位需要用它本身和与之连接的两个节点来计算角度
5
7
# 第一点是关节点
6
8
KeyPoints = [
7
9
(5 , 6 , 7 ), # 左肩
8
10
(6 , 7 , 8 ), # 右肩
9
- (7 , 5 , 9 ), # 左臂
11
+ (7 , 5 , 9 ), # 左臂
10
12
(8 , 6 , 10 ), # 右臂
11
13
(11 , 5 , 13 ), # 左胯
12
14
(12 , 6 , 14 ), # 右胯
13
15
(13 , 11 , 15 ), # 左膝
14
16
(14 , 12 , 16 ), # 右膝
15
17
]
16
18
17
- # 计算所有人关键部位的夹角的余弦值
18
- def CalAngle (coords , confidence , keypoint_thresh = 0.2 ):
19
- joint_visible = confidence [:, :, 0 ] > keypoint_thresh
20
- angles = np .empty ((coords .shape [0 ], len (KeyPoints )))
19
+ class AngeleCal ():
20
+
21
+ def __init__ (self , filename ):
22
+ self .stdAngles = np .loadtxt (filename , delimiter = '\t ' )
23
+ self .pos = 0
24
+
25
+ # 计算角度
26
+ @staticmethod
27
+ def cal (coords , confidence , keypoint_thresh = 0.2 ):
28
+ joint_visible = confidence [:, :, 0 ] > keypoint_thresh
29
+ angles = np .empty ((coords .shape [0 ], len (KeyPoints )))
21
30
22
- for i , pts in enumerate (coords ):
23
- # 某个人
24
- for j , keyPoint in enumerate (KeyPoints ):
25
- # 是否识别到这个关节
26
- if joint_visible [i , keyPoint [0 ]] and joint_visible [i , keyPoint [1 ]] and joint_visible [i , keyPoint [2 ]]:
27
- # 计算
28
- # print(pts)
31
+ for i , pts in enumerate (coords ):
32
+ # 某个人
33
+ for j , keyPoint in enumerate (KeyPoints ):
34
+ # 是否识别到这个关节
35
+ if joint_visible [i , keyPoint [0 ]] and joint_visible [i , keyPoint [1 ]] and joint_visible [i , keyPoint [2 ]]:
36
+ # 计算
37
+ # print(pts)
29
38
30
- p0x = pts [keyPoint [0 ], 0 ].asscalar ()
31
- p0y = pts [keyPoint [0 ], 1 ].asscalar ()
32
- p1x = pts [keyPoint [1 ], 0 ].asscalar ()
33
- p1y = pts [keyPoint [1 ], 1 ].asscalar ()
34
- p2x = pts [keyPoint [2 ], 0 ].asscalar ()
35
- p2y = pts [keyPoint [2 ], 1 ].asscalar ()
39
+ p0x = pts [keyPoint [0 ], 0 ].asscalar ()
40
+ p0y = pts [keyPoint [0 ], 1 ].asscalar ()
41
+ p1x = pts [keyPoint [1 ], 0 ].asscalar ()
42
+ p1y = pts [keyPoint [1 ], 1 ].asscalar ()
43
+ p2x = pts [keyPoint [2 ], 0 ].asscalar ()
44
+ p2y = pts [keyPoint [2 ], 1 ].asscalar ()
36
45
37
- v1 = np .array ([ p1x - p0x , p1y - p0y ])
38
- v2 = np .array ([ p2x - p0x , p2y - p0y ])
46
+ v1 = np .array ([ p1x - p0x , p1y - p0y ])
47
+ v2 = np .array ([ p2x - p0x , p2y - p0y ])
39
48
40
- angles [i ][j ] = np .dot (v1 , v2 ) / np .linalg .norm (v1 ) / np .linalg .norm (v2 )
49
+ angles [i ][j ] = np .dot (v1 , v2 ) / np .linalg .norm (v1 ) / np .linalg .norm (v2 )
41
50
51
+ else :
52
+ angles [i ][j ] = np .nan
53
+
54
+ return angles
55
+
56
+ # 角度对比
57
+ def compare (self , angles ):
58
+ # 每次读取一行标准角度
59
+ stdAngle = self .stdAngles [self .pos ]
60
+ scores = []
61
+ visibles = ~ np .isnan (stdAngle ) # 样本中没有缺失值的
62
+ for angle in angles :
63
+ angle_v = angle [visibles ] # 过滤样本中也有缺失值的点
64
+ if np .isnan (angle_v ).any (): # 还有缺失值
65
+ scores .append ('NaN' )
42
66
else :
43
- angles [i ][j ] = np .nan
44
-
45
- return angles
67
+ scores .append ('{:.4f}' .format (r2_score (angle_v , stdAngle [visibles ])))
68
+ self .pos += 1
69
+
70
+ return scores
0 commit comments