Maksym-Lysyi commited on
Commit
5079645
·
1 Parent(s): ef29619

minor improvements

Browse files
Files changed (5) hide show
  1. app.py +47 -17
  2. config.py +1 -2
  3. logs/log.py +0 -1097
  4. main_func.py +56 -125
  5. utils.py +174 -122
app.py CHANGED
@@ -10,15 +10,15 @@ with gr.Blocks() as demo:
10
 
11
  with gr.Row(variant='compact'):
12
  dtw_mean = gr.Slider(
13
- value=0.5,
14
  minimum=0,
15
  maximum=1.0,
16
  step=0.05,
17
- label="Winsorize Mean"
18
  )
19
 
20
  dtw_filter = gr.Slider(
21
- value=3,
22
  minimum=1,
23
  maximum=20,
24
  step=1,
@@ -38,7 +38,7 @@ with gr.Blocks() as demo:
38
  )
39
 
40
  angles_common = gr.Number(
41
- value=25,
42
  minimum=0,
43
  maximum=75,
44
  step=1,
@@ -47,7 +47,7 @@ with gr.Blocks() as demo:
47
  )
48
 
49
  angles_insensitive = gr.Number(
50
- value=45,
51
  minimum=0,
52
  maximum=75,
53
  step=1,
@@ -57,13 +57,41 @@ with gr.Blocks() as demo:
57
 
58
  gr.Markdown("#### Patience:")
59
 
60
- trigger_state = gr.Radio(value="three", choices=["three", "two"], label="Trigger Count")
61
 
62
  input_teacher = gr.Video(show_share_button=False, show_download_button=False, sources=["upload"], label="Teacher's Video")
63
  input_student = gr.Video(show_share_button=False, show_download_button=False, sources=["upload"], label="Student's Video")
64
 
65
-
66
- with gr.Accordion("Clarifications:", open=True):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  with gr.Accordion("Dynamic Time Warping:", open=False):
68
  gr.Markdown("""
69
  Dynamic Time Warping is an algorithm that performs frame-by-frame alignment for videos with different speeds.
@@ -83,15 +111,20 @@ with gr.Blocks() as demo:
83
 
84
  with gr.Accordion("Patience:", open=False):
85
  gr.Markdown("""
86
- Patience helps prevent model errors by highlighting only errors detected in consecutive frames.
87
-
88
- - **Three**: Utilizes 3 consecutive frames for error detection.
 
89
  - **Two**: Utilizes 2 consecutive frames for error detection.
90
-
91
- Both options can be used interchangeably.
92
- """)
93
 
 
 
 
 
94
 
 
 
95
 
96
  with gr.Row():
97
  gr_button = gr.Button("Run Pose Comparison")
@@ -99,7 +132,6 @@ with gr.Blocks() as demo:
99
  with gr.Row():
100
  gr.HTML("<div style='height: 100px;'></div>")
101
 
102
-
103
  with gr.Row():
104
  output_merged = gr.Video(show_download_button=True)
105
 
@@ -107,8 +139,6 @@ with gr.Blocks() as demo:
107
  general_log = gr.TextArea(lines=10, label="Error log", scale=3)
108
  text_log=gr.File(label="Download logs and settings", scale=1)
109
 
110
-
111
-
112
  gr_button.click(
113
  fn=video_identity,
114
  inputs=[dtw_mean, dtw_filter, angles_sensitive, angles_common, angles_insensitive, trigger_state, input_teacher, input_student],
 
10
 
11
  with gr.Row(variant='compact'):
12
  dtw_mean = gr.Slider(
13
+ value=0.4,
14
  minimum=0,
15
  maximum=1.0,
16
  step=0.05,
17
+ label="Winsorized Mean"
18
  )
19
 
20
  dtw_filter = gr.Slider(
21
+ value=13,
22
  minimum=1,
23
  maximum=20,
24
  step=1,
 
38
  )
39
 
40
  angles_common = gr.Number(
41
+ value=30,
42
  minimum=0,
43
  maximum=75,
44
  step=1,
 
47
  )
48
 
49
  angles_insensitive = gr.Number(
50
+ value=55,
51
  minimum=0,
52
  maximum=75,
53
  step=1,
 
57
 
58
  gr.Markdown("#### Patience:")
59
 
60
+ trigger_state = gr.Radio(value="one", choices=["one", "two", "three"], label="Trigger Count")
61
 
62
  input_teacher = gr.Video(show_share_button=False, show_download_button=False, sources=["upload"], label="Teacher's Video")
63
  input_student = gr.Video(show_share_button=False, show_download_button=False, sources=["upload"], label="Student's Video")
64
 
65
+ with gr.Accordion("Usage:", open=False):
66
+ with gr.Accordion("Application purpose:", open=False):
67
+ gr.Markdown("""
68
+ This application is designed to compare a professional dancer's performance with that of a student, identifying the student's incorrect movements relative to the professional.
69
+
70
+ Key features:
71
+ 1. Accepts two dance videos as input: one of a professional dancer and one of a student.
72
+ 2. Aligns the movements of both dancers, even if they perform at different rhythms.
73
+ 3. Generates a single concatenated video showing the aligned movements of both dancers side-by-side.
74
+ 4. Highlights the student's errors for easy identification.
75
+ 5. Produces a text log of errors with corresponding timestamps.
76
+
77
+ This tool offering a detailed analysis of technique and areas for improvement.
78
+ """)
79
+
80
+ with gr.Accordion("Video formats:", open=False):
81
+ gr.Markdown("""
82
+ For the input video to be playable in the browser, it must have a compatible container and codec combination.
83
+
84
+ Allowed combinations are:
85
+ - **.mp4** with **H.264** codec
86
+ - **.ogg** with **Theora** codec
87
+ - **.webm** with **VP9** codec
88
+
89
+ If the component detects that the output video would not be playable in the browser, it will attempt to convert it to a playable **.mp4** video.
90
+
91
+ The output video format is always **.mp4**, which is playable in the browser. The resolution of the output concatenated video is **2560x720**.
92
+ """)
93
+
94
+ with gr.Accordion("Settings clarifications:", open=False):
95
  with gr.Accordion("Dynamic Time Warping:", open=False):
96
  gr.Markdown("""
97
  Dynamic Time Warping is an algorithm that performs frame-by-frame alignment for videos with different speeds.
 
111
 
112
  with gr.Accordion("Patience:", open=False):
113
  gr.Markdown("""
114
+ Patience settings help prevent model errors by highlighting only those errors detected in consecutive frames.
115
+
116
+ Options:
117
+ - **One**: Utilizes 1 consecutive frame for error detection.
118
  - **Two**: Utilizes 2 consecutive frames for error detection.
119
+ - **Three**: Utilizes 3 consecutive frames for error detection.
 
 
120
 
121
+ Guidelines:
122
+ - Option **One** is better for fast dances and videos with low frame rates.
123
+ - Option **Three** is better for slow dances and videos with high frame rates.
124
+ - Option **Two** provides intermediate performance and can be used for experimentation.
125
 
126
+ The patience setting allows you to balance between sensitivity and accuracy in error detection, depending on the dance style and video quality.
127
+ """)
128
 
129
  with gr.Row():
130
  gr_button = gr.Button("Run Pose Comparison")
 
132
  with gr.Row():
133
  gr.HTML("<div style='height: 100px;'></div>")
134
 
 
135
  with gr.Row():
136
  output_merged = gr.Video(show_download_button=True)
137
 
 
139
  general_log = gr.TextArea(lines=10, label="Error log", scale=3)
140
  text_log=gr.File(label="Download logs and settings", scale=1)
141
 
 
 
142
  gr_button.click(
143
  fn=video_identity,
144
  inputs=[dtw_mean, dtw_filter, angles_sensitive, angles_common, angles_insensitive, trigger_state, input_teacher, input_student],
config.py CHANGED
@@ -1,6 +1,5 @@
1
  CONNECTIONS_VIT_FULL = [
2
- # head
3
- (0, 2),
4
  (0, 1),
5
  (2, 4),
6
  (1, 3),
 
1
  CONNECTIONS_VIT_FULL = [
2
+ # head
 
3
  (0, 1),
4
  (2, 4),
5
  (1, 3),
logs/log.py DELETED
@@ -1,1097 +0,0 @@
1
-
2
- Settings:
3
-
4
- Dynamic Time Warping:
5
- - Winsorize mean: 0.5
6
- - Savitzky-Golay Filter: 3
7
-
8
- Thresholds:
9
- - Sensitive: 15
10
- - Standart: 25
11
- - Insensitive: 5
12
-
13
- Patience:
14
- - trigger count: three
15
-
16
-
17
- Error logs:
18
-
19
- Left ring finger position is incorrect on frame 2. Video time: 0:00.06
20
- Left foot position is incorrect on frame 2. Video time: 0:00.06
21
- Left middle finger position is incorrect on frame 2. Video time: 0:00.06
22
- Right foot position is incorrect on frame 2. Video time: 0:00.06
23
- Right shin position is incorrect on frame 2. Video time: 0:00.06
24
- Left shin position is incorrect on frame 2. Video time: 0:00.06
25
- Right pinky finger position is incorrect on frame 2. Video time: 0:00.06
26
- Left foot position is incorrect on frame 3. Video time: 0:00.10
27
- Right foot position is incorrect on frame 3. Video time: 0:00.10
28
- Right shin position is incorrect on frame 3. Video time: 0:00.10
29
- Left shin position is incorrect on frame 3. Video time: 0:00.10
30
- Right foot position is incorrect on frame 4. Video time: 0:00.13
31
- Right shin position is incorrect on frame 4. Video time: 0:00.13
32
- Left shin position is incorrect on frame 4. Video time: 0:00.13
33
- Left foot position is incorrect on frame 4. Video time: 0:00.13
34
- Left shin position is incorrect on frame 5. Video time: 0:00.16
35
- Left foot position is incorrect on frame 5. Video time: 0:00.16
36
- Right foot position is incorrect on frame 5. Video time: 0:00.16
37
- Right shin position is incorrect on frame 5. Video time: 0:00.16
38
- Left foot position is incorrect on frame 6. Video time: 0:00.20
39
- Right foot position is incorrect on frame 6. Video time: 0:00.20
40
- Left middle finger position is incorrect on frame 6. Video time: 0:00.20
41
- Right shin position is incorrect on frame 6. Video time: 0:00.20
42
- Left shin position is incorrect on frame 6. Video time: 0:00.20
43
- Right middle finger position is incorrect on frame 6. Video time: 0:00.20
44
- Right index finger position is incorrect on frame 7. Video time: 0:00.23
45
- Right ring finger position is incorrect on frame 7. Video time: 0:00.23
46
- Left foot position is incorrect on frame 7. Video time: 0:00.23
47
- Right thumb finger position is incorrect on frame 7. Video time: 0:00.23
48
- Left pinky finger position is incorrect on frame 7. Video time: 0:00.23
49
- Left middle finger position is incorrect on frame 7. Video time: 0:00.23
50
- Right foot position is incorrect on frame 7. Video time: 0:00.23
51
- Right shin position is incorrect on frame 7. Video time: 0:00.23
52
- Right middle finger position is incorrect on frame 7. Video time: 0:00.23
53
- Left shin position is incorrect on frame 7. Video time: 0:00.23
54
- Right pinky finger position is incorrect on frame 7. Video time: 0:00.23
55
- Left foot position is incorrect on frame 8. Video time: 0:00.26
56
- Right thumb finger position is incorrect on frame 8. Video time: 0:00.26
57
- Left shin position is incorrect on frame 8. Video time: 0:00.26
58
- Right middle finger position is incorrect on frame 8. Video time: 0:00.26
59
- Right index finger position is incorrect on frame 8. Video time: 0:00.26
60
- Right ring finger position is incorrect on frame 8. Video time: 0:00.26
61
- Right pinky finger position is incorrect on frame 8. Video time: 0:00.26
62
- Left shin position is incorrect on frame 9. Video time: 0:00.30
63
- Right pinky finger position is incorrect on frame 9. Video time: 0:00.30
64
- Right ring finger position is incorrect on frame 9. Video time: 0:00.30
65
- Left foot position is incorrect on frame 9. Video time: 0:00.30
66
- Left foot position is incorrect on frame 10. Video time: 0:00.33
67
- Left shin position is incorrect on frame 10. Video time: 0:00.33
68
- Left foot position is incorrect on frame 11. Video time: 0:00.36
69
- Right foot position is incorrect on frame 11. Video time: 0:00.36
70
- Right shin position is incorrect on frame 11. Video time: 0:00.36
71
- Left shin position is incorrect on frame 11. Video time: 0:00.36
72
- Left foot position is incorrect on frame 12. Video time: 0:00.40
73
- Left thigh position is incorrect on frame 12. Video time: 0:00.40
74
- Left shin position is incorrect on frame 12. Video time: 0:00.40
75
- Left foot position is incorrect on frame 13. Video time: 0:00.43
76
- Right thumb finger position is incorrect on frame 13. Video time: 0:00.43
77
- Left middle finger position is incorrect on frame 13. Video time: 0:00.43
78
- Left shin position is incorrect on frame 13. Video time: 0:00.43
79
- Right pinky finger position is incorrect on frame 13. Video time: 0:00.43
80
- Right ring finger position is incorrect on frame 13. Video time: 0:00.43
81
- Left shin position is incorrect on frame 14. Video time: 0:00.46
82
- Left foot position is incorrect on frame 14. Video time: 0:00.46
83
- Left foot position is incorrect on frame 15. Video time: 0:00.50
84
- Right foot position is incorrect on frame 15. Video time: 0:00.50
85
- Right shin position is incorrect on frame 15. Video time: 0:00.50
86
- Left shin position is incorrect on frame 15. Video time: 0:00.50
87
- Left foot position is incorrect on frame 16. Video time: 0:00.53
88
- Left thigh position is incorrect on frame 16. Video time: 0:00.53
89
- Left shin position is incorrect on frame 16. Video time: 0:00.53
90
- Right middle finger position is incorrect on frame 16. Video time: 0:00.53
91
- Right ring finger position is incorrect on frame 17. Video time: 0:00.56
92
- Left foot position is incorrect on frame 17. Video time: 0:00.56
93
- Right thumb finger position is incorrect on frame 17. Video time: 0:00.56
94
- Left thigh position is incorrect on frame 17. Video time: 0:00.56
95
- Left middle finger position is incorrect on frame 17. Video time: 0:00.56
96
- Left shin position is incorrect on frame 17. Video time: 0:00.56
97
- Left index finger position is incorrect on frame 17. Video time: 0:00.56
98
- Left middle finger position is incorrect on frame 18. Video time: 0:00.60
99
- Left index finger position is incorrect on frame 18. Video time: 0:00.60
100
- Left index finger position is incorrect on frame 19. Video time: 0:00.63
101
- Left middle finger position is incorrect on frame 19. Video time: 0:00.63
102
- Left ring finger position is incorrect on frame 20. Video time: 0:00.66
103
- Left middle finger position is incorrect on frame 20. Video time: 0:00.66
104
- Left index finger position is incorrect on frame 20. Video time: 0:00.66
105
- Left ring finger position is incorrect on frame 21. Video time: 0:00.70
106
- Left pinky finger position is incorrect on frame 21. Video time: 0:00.70
107
- Left middle finger position is incorrect on frame 21. Video time: 0:00.70
108
- Left index finger position is incorrect on frame 21. Video time: 0:00.70
109
- Left foot position is incorrect on frame 22. Video time: 0:00.73
110
- Right foot position is incorrect on frame 22. Video time: 0:00.73
111
- Right shin position is incorrect on frame 22. Video time: 0:00.73
112
- Left shin position is incorrect on frame 22. Video time: 0:00.73
113
- Right thigh position is incorrect on frame 22. Video time: 0:00.73
114
- Left thigh position is incorrect on frame 23. Video time: 0:00.76
115
- Left shin position is incorrect on frame 23. Video time: 0:00.76
116
- Right middle finger position is incorrect on frame 23. Video time: 0:00.76
117
- Right index finger position is incorrect on frame 23. Video time: 0:00.76
118
- Right thigh position is incorrect on frame 23. Video time: 0:00.76
119
- Left foot position is incorrect on frame 23. Video time: 0:00.76
120
- Right foot position is incorrect on frame 23. Video time: 0:00.76
121
- Right shin position is incorrect on frame 23. Video time: 0:00.76
122
- Right thigh position is incorrect on frame 24. Video time: 0:00.80
123
- Left foot position is incorrect on frame 24. Video time: 0:00.80
124
- Right foot position is incorrect on frame 24. Video time: 0:00.80
125
- Right shin position is incorrect on frame 24. Video time: 0:00.80
126
- Left shin position is incorrect on frame 24. Video time: 0:00.80
127
- Right thigh position is incorrect on frame 25. Video time: 0:00.83
128
- Left foot position is incorrect on frame 25. Video time: 0:00.83
129
- Right foot position is incorrect on frame 25. Video time: 0:00.83
130
- Right shin position is incorrect on frame 25. Video time: 0:00.83
131
- Left shin position is incorrect on frame 25. Video time: 0:00.83
132
- Right ring finger position is incorrect on frame 26. Video time: 0:00.86
133
- Left foot position is incorrect on frame 26. Video time: 0:00.86
134
- Right foot position is incorrect on frame 26. Video time: 0:00.86
135
- Right shin position is incorrect on frame 26. Video time: 0:00.86
136
- Left shin position is incorrect on frame 26. Video time: 0:00.86
137
- Right pinky finger position is incorrect on frame 26. Video time: 0:00.86
138
- Right foot position is incorrect on frame 27. Video time: 0:00.90
139
- Left thigh position is incorrect on frame 27. Video time: 0:00.90
140
- Right shin position is incorrect on frame 27. Video time: 0:00.90
141
- Left shin position is incorrect on frame 27. Video time: 0:00.90
142
- Right index finger position is incorrect on frame 27. Video time: 0:00.90
143
- Right ring finger position is incorrect on frame 27. Video time: 0:00.90
144
- Right pinky finger position is incorrect on frame 27. Video time: 0:00.90
145
- Left foot position is incorrect on frame 27. Video time: 0:00.90
146
- Left shin position is incorrect on frame 28. Video time: 0:00.93
147
- Right pinky finger position is incorrect on frame 28. Video time: 0:00.93
148
- Right middle finger position is incorrect on frame 28. Video time: 0:00.93
149
- Right ring finger position is incorrect on frame 28. Video time: 0:00.93
150
- Left foot position is incorrect on frame 28. Video time: 0:00.93
151
- Right foot position is incorrect on frame 28. Video time: 0:00.93
152
- Right shin position is incorrect on frame 28. Video time: 0:00.93
153
- Right ring finger position is incorrect on frame 29. Video time: 0:00.96
154
- Left ring finger position is incorrect on frame 29. Video time: 0:00.96
155
- Right pinky finger position is incorrect on frame 29. Video time: 0:00.96
156
- Left foot position is incorrect on frame 29. Video time: 0:00.96
157
- Left pinky finger position is incorrect on frame 29. Video time: 0:00.96
158
- Left shin position is incorrect on frame 29. Video time: 0:00.96
159
- Right middle finger position is incorrect on frame 29. Video time: 0:00.96
160
- Right ring finger position is incorrect on frame 30. Video time:
161
- Left ring finger position is incorrect on frame 30. Video time:
162
- Left foot position is incorrect on frame 30. Video time:
163
- Left pinky finger position is incorrect on frame 30. Video time:
164
- Left shin position is incorrect on frame 30. Video time:
165
- Right pinky finger position is incorrect on frame 30. Video time:
166
- Right middle finger position is incorrect on frame 30. Video time:
167
- Left foot position is incorrect on frame 31. Video time: 0:01.03
168
- Left pinky finger position is incorrect on frame 31. Video time: 0:01.03
169
- Right middle finger position is incorrect on frame 31. Video time: 0:01.03
170
- Right index finger position is incorrect on frame 31. Video time: 0:01.03
171
- Left ring finger position is incorrect on frame 31. Video time: 0:01.03
172
- Left shin position is incorrect on frame 31. Video time: 0:01.03
173
- Left index finger position is incorrect on frame 31. Video time: 0:01.03
174
- Right ring finger position is incorrect on frame 31. Video time: 0:01.03
175
- Left pinky finger position is incorrect on frame 32. Video time: 0:01.06
176
- Left middle finger position is incorrect on frame 32. Video time: 0:01.06
177
- Right shin position is incorrect on frame 32. Video time: 0:01.06
178
- Left shin position is incorrect on frame 32. Video time: 0:01.06
179
- Left index finger position is incorrect on frame 32. Video time: 0:01.06
180
- Right middle finger position is incorrect on frame 32. Video time: 0:01.06
181
- Left ring finger position is incorrect on frame 32. Video time: 0:01.06
182
- Left foot position is incorrect on frame 32. Video time: 0:01.06
183
- Right foot position is incorrect on frame 32. Video time: 0:01.06
184
- Left shin position is incorrect on frame 33. Video time: 0:01.10
185
- Left index finger position is incorrect on frame 33. Video time: 0:01.10
186
- Left ring finger position is incorrect on frame 33. Video time: 0:01.10
187
- Left foot position is incorrect on frame 33. Video time: 0:01.10
188
- Left pinky finger position is incorrect on frame 33. Video time: 0:01.10
189
- Left middle finger position is incorrect on frame 33. Video time: 0:01.10
190
- Right foot position is incorrect on frame 33. Video time: 0:01.10
191
- Right shin position is incorrect on frame 33. Video time: 0:01.10
192
- Right middle finger position is incorrect on frame 33. Video time: 0:01.10
193
- Left ring finger position is incorrect on frame 34. Video time: 0:01.13
194
- Left thumb finger position is incorrect on frame 34. Video time: 0:01.13
195
- Left foot position is incorrect on frame 34. Video time: 0:01.13
196
- Right foot position is incorrect on frame 34. Video time: 0:01.13
197
- Left pinky finger position is incorrect on frame 34. Video time: 0:01.13
198
- Left middle finger position is incorrect on frame 34. Video time: 0:01.13
199
- Right shin position is incorrect on frame 34. Video time: 0:01.13
200
- Left shin position is incorrect on frame 34. Video time: 0:01.13
201
- Left index finger position is incorrect on frame 34. Video time: 0:01.13
202
- Right middle finger position is incorrect on frame 34. Video time: 0:01.13
203
- Left foot position is incorrect on frame 35. Video time: 0:01.16
204
- Right foot position is incorrect on frame 35. Video time: 0:01.16
205
- Right shin position is incorrect on frame 35. Video time: 0:01.16
206
- Left shin position is incorrect on frame 35. Video time: 0:01.16
207
- Right middle finger position is incorrect on frame 35. Video time: 0:01.16
208
- Left thumb finger position is incorrect on frame 35. Video time: 0:01.16
209
- Right foot position is incorrect on frame 36. Video time: 0:01.20
210
- Right shin position is incorrect on frame 36. Video time: 0:01.20
211
- Right middle finger position is incorrect on frame 36. Video time: 0:01.20
212
- Left thumb finger position is incorrect on frame 36. Video time: 0:01.20
213
- Right shin position is incorrect on frame 37. Video time: 0:01.23
214
- Right middle finger position is incorrect on frame 37. Video time: 0:01.23
215
- Right foot position is incorrect on frame 37. Video time: 0:01.23
216
- Right index finger position is incorrect on frame 38. Video time: 0:01.26
217
- Right foot position is incorrect on frame 38. Video time: 0:01.26
218
- Right shin position is incorrect on frame 38. Video time: 0:01.26
219
- Right middle finger position is incorrect on frame 38. Video time: 0:01.26
220
- Right index finger position is incorrect on frame 39. Video time: 0:01.30
221
- Left foot position is incorrect on frame 39. Video time: 0:01.30
222
- Right foot position is incorrect on frame 39. Video time: 0:01.30
223
- Right shin position is incorrect on frame 39. Video time: 0:01.30
224
- Left shin position is incorrect on frame 39. Video time: 0:01.30
225
- Right middle finger position is incorrect on frame 39. Video time: 0:01.30
226
- Right foot position is incorrect on frame 40. Video time: 0:01.33
227
- Right shin position is incorrect on frame 40. Video time: 0:01.33
228
- Right middle finger position is incorrect on frame 40. Video time: 0:01.33
229
- Right pinky finger position is incorrect on frame 40. Video time: 0:01.33
230
- Left thumb finger position is incorrect on frame 40. Video time: 0:01.33
231
- Right index finger position is incorrect on frame 40. Video time: 0:01.33
232
- Right ring finger position is incorrect on frame 40. Video time: 0:01.33
233
- Right foot position is incorrect on frame 41. Video time: 0:01.36
234
- Right shin position is incorrect on frame 41. Video time: 0:01.36
235
- Right middle finger position is incorrect on frame 41. Video time: 0:01.36
236
- Right index finger position is incorrect on frame 41. Video time: 0:01.36
237
- Right ring finger position is incorrect on frame 41. Video time: 0:01.36
238
- Right pinky finger position is incorrect on frame 41. Video time: 0:01.36
239
- Left thumb finger position is incorrect on frame 41. Video time: 0:01.36
240
- Right pinky finger position is incorrect on frame 42. Video time: 0:01.40
241
- Right middle finger position is incorrect on frame 42. Video time: 0:01.40
242
- Right index finger position is incorrect on frame 42. Video time: 0:01.40
243
- Right ring finger position is incorrect on frame 42. Video time: 0:01.40
244
- Right foot position is incorrect on frame 42. Video time: 0:01.40
245
- Right shin position is incorrect on frame 42. Video time: 0:01.40
246
- Right index finger position is incorrect on frame 43. Video time: 0:01.43
247
- Right pinky finger position is incorrect on frame 43. Video time: 0:01.43
248
- Right ring finger position is incorrect on frame 43. Video time: 0:01.43
249
- Right foot position is incorrect on frame 43. Video time: 0:01.43
250
- Right shin position is incorrect on frame 43. Video time: 0:01.43
251
- Right middle finger position is incorrect on frame 43. Video time: 0:01.43
252
- Right index finger position is incorrect on frame 44. Video time: 0:01.46
253
- Right ring finger position is incorrect on frame 44. Video time: 0:01.46
254
- Right pinky finger position is incorrect on frame 44. Video time: 0:01.46
255
- Right middle finger position is incorrect on frame 44. Video time: 0:01.46
256
- Right middle finger position is incorrect on frame 45. Video time: 0:01.50
257
- Right index finger position is incorrect on frame 45. Video time: 0:01.50
258
- Right ring finger position is incorrect on frame 45. Video time: 0:01.50
259
- Left thigh position is incorrect on frame 46. Video time: 0:01.53
260
- Left middle finger position is incorrect on frame 46. Video time: 0:01.53
261
- Left shin position is incorrect on frame 46. Video time: 0:01.53
262
- Right middle finger position is incorrect on frame 46. Video time: 0:01.53
263
- Right index finger position is incorrect on frame 46. Video time: 0:01.53
264
- Right ring finger position is incorrect on frame 46. Video time: 0:01.53
265
- Left ring finger position is incorrect on frame 46. Video time: 0:01.53
266
- Left thumb finger position is incorrect on frame 46. Video time: 0:01.53
267
- Left foot position is incorrect on frame 46. Video time: 0:01.53
268
- Left shin position is incorrect on frame 47. Video time: 0:01.56
269
- Left thumb finger position is incorrect on frame 47. Video time: 0:01.56
270
- Right index finger position is incorrect on frame 47. Video time: 0:01.56
271
- Right thigh position is incorrect on frame 47. Video time: 0:01.56
272
- Left ring finger position is incorrect on frame 47. Video time: 0:01.56
273
- Left foot position is incorrect on frame 47. Video time: 0:01.56
274
- Left middle finger position is incorrect on frame 47. Video time: 0:01.56
275
- Right foot position is incorrect on frame 47. Video time: 0:01.56
276
- Right shin position is incorrect on frame 47. Video time: 0:01.56
277
- Left thigh position is incorrect on frame 47. Video time: 0:01.56
278
- Right middle finger position is incorrect on frame 47. Video time: 0:01.56
279
- Right index finger position is incorrect on frame 48. Video time: 0:01.60
280
- Left foot position is incorrect on frame 48. Video time: 0:01.60
281
- Left thigh position is incorrect on frame 48. Video time: 0:01.60
282
- Right foot position is incorrect on frame 48. Video time: 0:01.60
283
- Right shin position is incorrect on frame 48. Video time: 0:01.60
284
- Left shin position is incorrect on frame 48. Video time: 0:01.60
285
- Right middle finger position is incorrect on frame 48. Video time: 0:01.60
286
- Left foot position is incorrect on frame 49. Video time: 0:01.63
287
- Right foot position is incorrect on frame 49. Video time: 0:01.63
288
- Right shin position is incorrect on frame 49. Video time: 0:01.63
289
- Left thigh position is incorrect on frame 49. Video time: 0:01.63
290
- Left shin position is incorrect on frame 49. Video time: 0:01.63
291
- Right middle finger position is incorrect on frame 49. Video time: 0:01.63
292
- Right index finger position is incorrect on frame 49. Video time: 0:01.63
293
- Left thigh position is incorrect on frame 50. Video time: 0:01.66
294
- Right foot position is incorrect on frame 50. Video time: 0:01.66
295
- Right shin position is incorrect on frame 50. Video time: 0:01.66
296
- Left shin position is incorrect on frame 50. Video time: 0:01.66
297
- Right middle finger position is incorrect on frame 50. Video time: 0:01.66
298
- Right index finger position is incorrect on frame 50. Video time: 0:01.66
299
- Right ring finger position is incorrect on frame 50. Video time: 0:01.66
300
- Left foot position is incorrect on frame 50. Video time: 0:01.66
301
- Right shin position is incorrect on frame 51. Video time: 0:01.70
302
- Left shin position is incorrect on frame 51. Video time: 0:01.70
303
- Right middle finger position is incorrect on frame 51. Video time: 0:01.70
304
- Right ring finger position is incorrect on frame 51. Video time: 0:01.70
305
- Left foot position is incorrect on frame 51. Video time: 0:01.70
306
- Right foot position is incorrect on frame 51. Video time: 0:01.70
307
- Left thigh position is incorrect on frame 51. Video time: 0:01.70
308
- Left shin position is incorrect on frame 52. Video time: 0:01.73
309
- Right ring finger position is incorrect on frame 52. Video time: 0:01.73
310
- Left foot position is incorrect on frame 52. Video time: 0:01.73
311
- Right foot position is incorrect on frame 52. Video time: 0:01.73
312
- Right shin position is incorrect on frame 52. Video time: 0:01.73
313
- Left thigh position is incorrect on frame 52. Video time: 0:01.73
314
- Right middle finger position is incorrect on frame 52. Video time: 0:01.73
315
- Right ring finger position is incorrect on frame 53. Video time: 0:01.76
316
- Left foot position is incorrect on frame 53. Video time: 0:01.76
317
- Right foot position is incorrect on frame 53. Video time: 0:01.76
318
- Left thigh position is incorrect on frame 53. Video time: 0:01.76
319
- Right shin position is incorrect on frame 53. Video time: 0:01.76
320
- Left shin position is incorrect on frame 53. Video time: 0:01.76
321
- Right middle finger position is incorrect on frame 53. Video time: 0:01.76
322
- Right foot position is incorrect on frame 54. Video time: 0:01.80
323
- Right shin position is incorrect on frame 54. Video time: 0:01.80
324
- Left thigh position is incorrect on frame 54. Video time: 0:01.80
325
- Left shin position is incorrect on frame 54. Video time: 0:01.80
326
- Left thumb finger position is incorrect on frame 54. Video time: 0:01.80
327
- Right ring finger position is incorrect on frame 54. Video time: 0:01.80
328
- Left foot position is incorrect on frame 54. Video time: 0:01.80
329
- Left thigh position is incorrect on frame 55. Video time: 0:01.83
330
- Right foot position is incorrect on frame 55. Video time: 0:01.83
331
- Right shin position is incorrect on frame 55. Video time: 0:01.83
332
- Left shin position is incorrect on frame 55. Video time: 0:01.83
333
- Right index finger position is incorrect on frame 55. Video time: 0:01.83
334
- Right ring finger position is incorrect on frame 55. Video time: 0:01.83
335
- Left foot position is incorrect on frame 55. Video time: 0:01.83
336
- Right shin position is incorrect on frame 56. Video time: 0:01.86
337
- Left shin position is incorrect on frame 56. Video time: 0:01.86
338
- Right ring finger position is incorrect on frame 56. Video time: 0:01.86
339
- Left foot position is incorrect on frame 56. Video time: 0:01.86
340
- Right foot position is incorrect on frame 56. Video time: 0:01.86
341
- Left thigh position is incorrect on frame 56. Video time: 0:01.86
342
- Left shin position is incorrect on frame 57. Video time: 0:01.90
343
- Right ring finger position is incorrect on frame 57. Video time: 0:01.90
344
- Left foot position is incorrect on frame 57. Video time: 0:01.90
345
- Right foot position is incorrect on frame 57. Video time: 0:01.90
346
- Right shin position is incorrect on frame 57. Video time: 0:01.90
347
- Left thigh position is incorrect on frame 57. Video time: 0:01.90
348
- Left foot position is incorrect on frame 58. Video time: 0:01.93
349
- Right foot position is incorrect on frame 58. Video time: 0:01.93
350
- Right shin position is incorrect on frame 58. Video time: 0:01.93
351
- Left shin position is incorrect on frame 58. Video time: 0:01.93
352
- Right ring finger position is incorrect on frame 58. Video time: 0:01.93
353
- Right foot position is incorrect on frame 59. Video time: 0:01.96
354
- Right shin position is incorrect on frame 59. Video time: 0:01.96
355
- Left shin position is incorrect on frame 59. Video time: 0:01.96
356
- Right ring finger position is incorrect on frame 59. Video time: 0:01.96
357
- Left foot position is incorrect on frame 59. Video time: 0:01.96
358
- Right foot position is incorrect on frame 60. Video time:
359
- Right shin position is incorrect on frame 60. Video time:
360
- Left shin position is incorrect on frame 60. Video time:
361
- Right middle finger position is incorrect on frame 60. Video time:
362
- Right ring finger position is incorrect on frame 60. Video time:
363
- Left foot position is incorrect on frame 60. Video time:
364
- Right ring finger position is incorrect on frame 61. Video time: 0:02.03
365
- Right foot position is incorrect on frame 61. Video time: 0:02.03
366
- Right shin position is incorrect on frame 61. Video time: 0:02.03
367
- Right ring finger position is incorrect on frame 62. Video time: 0:02.06
368
- Right foot position is incorrect on frame 62. Video time: 0:02.06
369
- Right shin position is incorrect on frame 62. Video time: 0:02.06
370
- Right foot position is incorrect on frame 63. Video time: 0:02.10
371
- Right shin position is incorrect on frame 63. Video time: 0:02.10
372
- Right ring finger position is incorrect on frame 63. Video time: 0:02.10
373
- Right foot position is incorrect on frame 64. Video time: 0:02.13
374
- Right shin position is incorrect on frame 64. Video time: 0:02.13
375
- Right middle finger position is incorrect on frame 64. Video time: 0:02.13
376
- Left shin position is incorrect on frame 64. Video time: 0:02.13
377
- Right ring finger position is incorrect on frame 64. Video time: 0:02.13
378
- Left foot position is incorrect on frame 64. Video time: 0:02.13
379
- Right shin position is incorrect on frame 65. Video time: 0:02.16
380
- Left shin position is incorrect on frame 65. Video time: 0:02.16
381
- Right middle finger position is incorrect on frame 65. Video time: 0:02.16
382
- Left foot position is incorrect on frame 65. Video time: 0:02.16
383
- Right foot position is incorrect on frame 65. Video time: 0:02.16
384
- Left shin position is incorrect on frame 66. Video time: 0:02.20
385
- Left foot position is incorrect on frame 66. Video time: 0:02.20
386
- Right foot position is incorrect on frame 66. Video time: 0:02.20
387
- Right shin position is incorrect on frame 66. Video time: 0:02.20
388
- Right pinky finger position is incorrect on frame 67. Video time: 0:02.23
389
- Left foot position is incorrect on frame 67. Video time: 0:02.23
390
- Right foot position is incorrect on frame 67. Video time: 0:02.23
391
- Right shin position is incorrect on frame 67. Video time: 0:02.23
392
- Left shin position is incorrect on frame 67. Video time: 0:02.23
393
- Right foot position is incorrect on frame 68. Video time: 0:02.26
394
- Right shin position is incorrect on frame 68. Video time: 0:02.26
395
- Left shin position is incorrect on frame 68. Video time: 0:02.26
396
- Right pinky finger position is incorrect on frame 68. Video time: 0:02.26
397
- Left foot position is incorrect on frame 68. Video time: 0:02.26
398
- Right foot position is incorrect on frame 69. Video time: 0:02.30
399
- Right shin position is incorrect on frame 69. Video time: 0:02.30
400
- Left shin position is incorrect on frame 69. Video time: 0:02.30
401
- Left foot position is incorrect on frame 69. Video time: 0:02.30
402
- Right shin position is incorrect on frame 70. Video time: 0:02.33
403
- Left shin position is incorrect on frame 70. Video time: 0:02.33
404
- Left foot position is incorrect on frame 70. Video time: 0:02.33
405
- Right foot position is incorrect on frame 70. Video time: 0:02.33
406
- Left thigh position is incorrect on frame 70. Video time: 0:02.33
407
- Left shin position is incorrect on frame 71. Video time: 0:02.36
408
- Left foot position is incorrect on frame 71. Video time: 0:02.36
409
- Right foot position is incorrect on frame 71. Video time: 0:02.36
410
- Right shin position is incorrect on frame 71. Video time: 0:02.36
411
- Left thigh position is incorrect on frame 71. Video time: 0:02.36
412
- Right pinky finger position is incorrect on frame 72. Video time: 0:02.40
413
- Left foot position is incorrect on frame 72. Video time: 0:02.40
414
- Right foot position is incorrect on frame 72. Video time: 0:02.40
415
- Right shin position is incorrect on frame 72. Video time: 0:02.40
416
- Left shin position is incorrect on frame 72. Video time: 0:02.40
417
- Right foot position is incorrect on frame 73. Video time: 0:02.43
418
- Right shin position is incorrect on frame 73. Video time: 0:02.43
419
- Left shin position is incorrect on frame 73. Video time: 0:02.43
420
- Right pinky finger position is incorrect on frame 73. Video time: 0:02.43
421
- Left foot position is incorrect on frame 73. Video time: 0:02.43
422
- Right foot position is incorrect on frame 74. Video time: 0:02.46
423
- Right shin position is incorrect on frame 74. Video time: 0:02.46
424
- Left shin position is incorrect on frame 74. Video time: 0:02.46
425
- Right middle finger position is incorrect on frame 74. Video time: 0:02.46
426
- Left foot position is incorrect on frame 74. Video time: 0:02.46
427
- Right shin position is incorrect on frame 75. Video time: 0:02.50
428
- Left shin position is incorrect on frame 75. Video time: 0:02.50
429
- Right index finger position is incorrect on frame 75. Video time: 0:02.50
430
- Left foot position is incorrect on frame 75. Video time: 0:02.50
431
- Right foot position is incorrect on frame 75. Video time: 0:02.50
432
- Left shin position is incorrect on frame 76. Video time: 0:02.53
433
- Left foot position is incorrect on frame 76. Video time: 0:02.53
434
- Right foot position is incorrect on frame 76. Video time: 0:02.53
435
- Right shin position is incorrect on frame 76. Video time: 0:02.53
436
- Right index finger position is incorrect on frame 76. Video time: 0:02.53
437
- Left foot position is incorrect on frame 77. Video time: 0:02.56
438
- Right foot position is incorrect on frame 77. Video time: 0:02.56
439
- Right shin position is incorrect on frame 77. Video time: 0:02.56
440
- Left shin position is incorrect on frame 77. Video time: 0:02.56
441
- Left middle finger position is incorrect on frame 78. Video time: 0:02.60
442
- Right foot position is incorrect on frame 78. Video time: 0:02.60
443
- Right shin position is incorrect on frame 78. Video time: 0:02.60
444
- Right pinky finger position is incorrect on frame 78. Video time: 0:02.60
445
- Right shin position is incorrect on frame 79. Video time: 0:02.63
446
- Right pinky finger position is incorrect on frame 79. Video time: 0:02.63
447
- Right foot position is incorrect on frame 79. Video time: 0:02.63
448
- Left middle finger position is incorrect on frame 79. Video time: 0:02.63
449
- Left middle finger position is incorrect on frame 80. Video time: 0:02.66
450
- Right thumb finger position is incorrect on frame 80. Video time: 0:02.66
451
- Right foot position is incorrect on frame 80. Video time: 0:02.66
452
- Right shin position is incorrect on frame 80. Video time: 0:02.66
453
- Left foot position is incorrect on frame 81. Video time: 0:02.70
454
- Right thumb finger position is incorrect on frame 81. Video time: 0:02.70
455
- Left pinky finger position is incorrect on frame 81. Video time: 0:02.70
456
- Left middle finger position is incorrect on frame 81. Video time: 0:02.70
457
- Right foot position is incorrect on frame 81. Video time: 0:02.70
458
- Right shin position is incorrect on frame 81. Video time: 0:02.70
459
- Left shin position is incorrect on frame 81. Video time: 0:02.70
460
- Left foot position is incorrect on frame 82. Video time: 0:02.73
461
- Right thumb finger position is incorrect on frame 82. Video time: 0:02.73
462
- Right foot position is incorrect on frame 82. Video time: 0:02.73
463
- Left pinky finger position is incorrect on frame 82. Video time: 0:02.73
464
- Left middle finger position is incorrect on frame 82. Video time: 0:02.73
465
- Right shin position is incorrect on frame 82. Video time: 0:02.73
466
- Left shin position is incorrect on frame 82. Video time: 0:02.73
467
- Left middle finger position is incorrect on frame 83. Video time: 0:02.76
468
- Left shin position is incorrect on frame 83. Video time: 0:02.76
469
- Left foot position is incorrect on frame 83. Video time: 0:02.76
470
- Left pinky finger position is incorrect on frame 83. Video time: 0:02.76
471
- Left shin position is incorrect on frame 84. Video time: 0:02.80
472
- Left ring finger position is incorrect on frame 84. Video time: 0:02.80
473
- Left foot position is incorrect on frame 84. Video time: 0:02.80
474
- Left pinky finger position is incorrect on frame 84. Video time: 0:02.80
475
- Left middle finger position is incorrect on frame 84. Video time: 0:02.80
476
- Left shin position is incorrect on frame 85. Video time: 0:02.83
477
- Left index finger position is incorrect on frame 85. Video time: 0:02.83
478
- Left foot position is incorrect on frame 85. Video time: 0:02.83
479
- Left pinky finger position is incorrect on frame 85. Video time: 0:02.83
480
- Left middle finger position is incorrect on frame 85. Video time: 0:02.83
481
- Left foot position is incorrect on frame 86. Video time: 0:02.86
482
- Left pinky finger position is incorrect on frame 86. Video time: 0:02.86
483
- Left middle finger position is incorrect on frame 86. Video time: 0:02.86
484
- Left shin position is incorrect on frame 86. Video time: 0:02.86
485
- Left index finger position is incorrect on frame 86. Video time: 0:02.86
486
- Left middle finger position is incorrect on frame 87. Video time: 0:02.90
487
- Right foot position is incorrect on frame 87. Video time: 0:02.90
488
- Right shin position is incorrect on frame 87. Video time: 0:02.90
489
- Left thigh position is incorrect on frame 87. Video time: 0:02.90
490
- Left shin position is incorrect on frame 87. Video time: 0:02.90
491
- Left index finger position is incorrect on frame 87. Video time: 0:02.90
492
- Left foot position is incorrect on frame 87. Video time: 0:02.90
493
- Left pinky finger position is incorrect on frame 90. Video time:
494
- Left pinky finger position is incorrect on frame 91. Video time: 0:03.03
495
- Left middle finger position is incorrect on frame 91. Video time: 0:03.03
496
- Right middle finger position is incorrect on frame 91. Video time: 0:03.03
497
- Left middle finger position is incorrect on frame 92. Video time: 0:03.06
498
- Left pinky finger position is incorrect on frame 92. Video time: 0:03.06
499
- Left shin position is incorrect on frame 93. Video time: 0:03.10
500
- Left foot position is incorrect on frame 93. Video time: 0:03.10
501
- Left middle finger position is incorrect on frame 93. Video time: 0:03.10
502
- Left shin position is incorrect on frame 94. Video time: 0:03.13
503
- Left foot position is incorrect on frame 94. Video time: 0:03.13
504
- Left middle finger position is incorrect on frame 94. Video time: 0:03.13
505
- Left index finger position is incorrect on frame 95. Video time: 0:03.16
506
- Left middle finger position is incorrect on frame 95. Video time: 0:03.16
507
- Right thumb finger position is incorrect on frame 96. Video time: 0:03.20
508
- Left middle finger position is incorrect on frame 96. Video time: 0:03.20
509
- Right foot position is incorrect on frame 97. Video time: 0:03.23
510
- Right shin position is incorrect on frame 97. Video time: 0:03.23
511
- Right thumb finger position is incorrect on frame 97. Video time: 0:03.23
512
- Left middle finger position is incorrect on frame 97. Video time: 0:03.23
513
- Right shin position is incorrect on frame 98. Video time: 0:03.26
514
- Left shin position is incorrect on frame 98. Video time: 0:03.26
515
- Left foot position is incorrect on frame 98. Video time: 0:03.26
516
- Right foot position is incorrect on frame 98. Video time: 0:03.26
517
- Left shin position is incorrect on frame 99. Video time: 0:03.30
518
- Left foot position is incorrect on frame 99. Video time: 0:03.30
519
- Left foot position is incorrect on frame 100. Video time: 0:03.33
520
- Left shin position is incorrect on frame 100. Video time: 0:03.33
521
- Left middle finger position is incorrect on frame 101. Video time: 0:03.36
522
- Left foot position is incorrect on frame 101. Video time: 0:03.36
523
- Left shin position is incorrect on frame 101. Video time: 0:03.36
524
- Right ring finger position is incorrect on frame 101. Video time: 0:03.36
525
- Right foot position is incorrect on frame 102. Video time: 0:03.40
526
- Right shin position is incorrect on frame 102. Video time: 0:03.40
527
- Left ring finger position is incorrect on frame 102. Video time: 0:03.40
528
- Left shin position is incorrect on frame 102. Video time: 0:03.40
529
- Left index finger position is incorrect on frame 102. Video time: 0:03.40
530
- Left foot position is incorrect on frame 102. Video time: 0:03.40
531
- Left pinky finger position is incorrect on frame 102. Video time: 0:03.40
532
- Left middle finger position is incorrect on frame 102. Video time: 0:03.40
533
- Left shin position is incorrect on frame 103. Video time: 0:03.43
534
- Left ring finger position is incorrect on frame 103. Video time: 0:03.43
535
- Left foot position is incorrect on frame 103. Video time: 0:03.43
536
- Left pinky finger position is incorrect on frame 103. Video time: 0:03.43
537
- Left middle finger position is incorrect on frame 103. Video time: 0:03.43
538
- Left ring finger position is incorrect on frame 104. Video time: 0:03.46
539
- Left pinky finger position is incorrect on frame 104. Video time: 0:03.46
540
- Left middle finger position is incorrect on frame 104. Video time: 0:03.46
541
- Left pinky finger position is incorrect on frame 105. Video time: 0:03.50
542
- Left middle finger position is incorrect on frame 105. Video time: 0:03.50
543
- Left ring finger position is incorrect on frame 105. Video time: 0:03.50
544
- Right foot position is incorrect on frame 106. Video time: 0:03.53
545
- Right shin position is incorrect on frame 106. Video time: 0:03.53
546
- Left pinky finger position is incorrect on frame 106. Video time: 0:03.53
547
- Left index finger position is incorrect on frame 106. Video time: 0:03.53
548
- Right middle finger position is incorrect on frame 106. Video time: 0:03.53
549
- Left ring finger position is incorrect on frame 106. Video time: 0:03.53
550
- Left middle finger position is incorrect on frame 106. Video time: 0:03.53
551
- Right foot position is incorrect on frame 107. Video time: 0:03.56
552
- Right shin position is incorrect on frame 107. Video time: 0:03.56
553
- Left shin position is incorrect on frame 107. Video time: 0:03.56
554
- Left index finger position is incorrect on frame 107. Video time: 0:03.56
555
- Left ring finger position is incorrect on frame 107. Video time: 0:03.56
556
- Left foot position is incorrect on frame 107. Video time: 0:03.56
557
- Left pinky finger position is incorrect on frame 107. Video time: 0:03.56
558
- Left middle finger position is incorrect on frame 107. Video time: 0:03.56
559
- Right shin position is incorrect on frame 108. Video time: 0:03.60
560
- Left shin position is incorrect on frame 108. Video time: 0:03.60
561
- Left index finger position is incorrect on frame 108. Video time: 0:03.60
562
- Left ring finger position is incorrect on frame 108. Video time: 0:03.60
563
- Left foot position is incorrect on frame 108. Video time: 0:03.60
564
- Right foot position is incorrect on frame 108. Video time: 0:03.60
565
- Left pinky finger position is incorrect on frame 108. Video time: 0:03.60
566
- Left middle finger position is incorrect on frame 108. Video time: 0:03.60
567
- Right thigh position is incorrect on frame 109. Video time: 0:03.63
568
- Left foot position is incorrect on frame 109. Video time: 0:03.63
569
- Left pinky finger position is incorrect on frame 109. Video time: 0:03.63
570
- Left middle finger position is incorrect on frame 109. Video time: 0:03.63
571
- Right foot position is incorrect on frame 109. Video time: 0:03.63
572
- Right shin position is incorrect on frame 109. Video time: 0:03.63
573
- Left ring finger position is incorrect on frame 109. Video time: 0:03.63
574
- Left shin position is incorrect on frame 109. Video time: 0:03.63
575
- Left index finger position is incorrect on frame 109. Video time: 0:03.63
576
- Left foot position is incorrect on frame 110. Video time: 0:03.66
577
- Left pinky finger position is incorrect on frame 110. Video time: 0:03.66
578
- Left middle finger position is incorrect on frame 110. Video time: 0:03.66
579
- Left shin position is incorrect on frame 110. Video time: 0:03.66
580
- Left index finger position is incorrect on frame 110. Video time: 0:03.66
581
- Left ring finger position is incorrect on frame 110. Video time: 0:03.66
582
- Left shin position is incorrect on frame 111. Video time: 0:03.70
583
- Left index finger position is incorrect on frame 111. Video time: 0:03.70
584
- Left thumb finger position is incorrect on frame 111. Video time: 0:03.70
585
- Left ring finger position is incorrect on frame 111. Video time: 0:03.70
586
- Left foot position is incorrect on frame 111. Video time: 0:03.70
587
- Left pinky finger position is incorrect on frame 111. Video time: 0:03.70
588
- Left middle finger position is incorrect on frame 111. Video time: 0:03.70
589
- Left shin position is incorrect on frame 112. Video time: 0:03.73
590
- Left index finger position is incorrect on frame 112. Video time: 0:03.73
591
- Left ring finger position is incorrect on frame 112. Video time: 0:03.73
592
- Left thumb finger position is incorrect on frame 112. Video time: 0:03.73
593
- Left foot position is incorrect on frame 112. Video time: 0:03.73
594
- Left pinky finger position is incorrect on frame 112. Video time: 0:03.73
595
- Left middle finger position is incorrect on frame 112. Video time: 0:03.73
596
- Right pinky finger position is incorrect on frame 113. Video time: 0:03.76
597
- Right ring finger position is incorrect on frame 113. Video time: 0:03.76
598
- Left foot position is incorrect on frame 113. Video time: 0:03.76
599
- Right thumb finger position is incorrect on frame 113. Video time: 0:03.76
600
- Left shin position is incorrect on frame 113. Video time: 0:03.76
601
- Right ring finger position is incorrect on frame 114. Video time: 0:03.80
602
- Left foot position is incorrect on frame 114. Video time: 0:03.80
603
- Left shin position is incorrect on frame 114. Video time: 0:03.80
604
- Right pinky finger position is incorrect on frame 114. Video time: 0:03.80
605
- Right pinky finger position is incorrect on frame 115. Video time: 0:03.83
606
- Right middle finger position is incorrect on frame 115. Video time: 0:03.83
607
- Right index finger position is incorrect on frame 115. Video time: 0:03.83
608
- Right ring finger position is incorrect on frame 115. Video time: 0:03.83
609
- Right index finger position is incorrect on frame 116. Video time: 0:03.86
610
- Right shin position is incorrect on frame 117. Video time: 0:03.90
611
- Right index finger position is incorrect on frame 117. Video time: 0:03.90
612
- Right foot position is incorrect on frame 117. Video time: 0:03.90
613
- Left foot position is incorrect on frame 118. Video time: 0:03.93
614
- Right foot position is incorrect on frame 118. Video time: 0:03.93
615
- Right shin position is incorrect on frame 118. Video time: 0:03.93
616
- Left shin position is incorrect on frame 118. Video time: 0:03.93
617
- Left index finger position is incorrect on frame 118. Video time: 0:03.93
618
- Left foot position is incorrect on frame 119. Video time: 0:03.96
619
- Left shin position is incorrect on frame 119. Video time: 0:03.96
620
- Right middle finger position is incorrect on frame 119. Video time: 0:03.96
621
- Right ring finger position is incorrect on frame 119. Video time: 0:03.96
622
- Left shin position is incorrect on frame 120. Video time:
623
- Right middle finger position is incorrect on frame 120. Video time:
624
- Right ring finger position is incorrect on frame 120. Video time:
625
- Left foot position is incorrect on frame 120. Video time:
626
- Left shin position is incorrect on frame 121. Video time: 0:04.03
627
- Left foot position is incorrect on frame 121. Video time: 0:04.03
628
- Left index finger position is incorrect on frame 122. Video time: 0:04.06
629
- Left ring finger position is incorrect on frame 122. Video time: 0:04.06
630
- Left foot position is incorrect on frame 122. Video time: 0:04.06
631
- Left pinky finger position is incorrect on frame 122. Video time: 0:04.06
632
- Left shin position is incorrect on frame 122. Video time: 0:04.06
633
- Left foot position is incorrect on frame 123. Video time: 0:04.10
634
- Left shin position is incorrect on frame 123. Video time: 0:04.10
635
- Left index finger position is incorrect on frame 123. Video time: 0:04.10
636
- Left foot position is incorrect on frame 124. Video time: 0:04.13
637
- Left shin position is incorrect on frame 124. Video time: 0:04.13
638
- Left index finger position is incorrect on frame 124. Video time: 0:04.13
639
- Left shin position is incorrect on frame 125. Video time: 0:04.16
640
- Left index finger position is incorrect on frame 125. Video time: 0:04.16
641
- Left foot position is incorrect on frame 125. Video time: 0:04.16
642
- Left shin position is incorrect on frame 126. Video time: 0:04.20
643
- Left index finger position is incorrect on frame 126. Video time: 0:04.20
644
- Left ring finger position is incorrect on frame 126. Video time: 0:04.20
645
- Left middle finger position is incorrect on frame 126. Video time: 0:04.20
646
- Left foot position is incorrect on frame 126. Video time: 0:04.20
647
- Left pinky finger position is incorrect on frame 126. Video time: 0:04.20
648
- Left ring finger position is incorrect on frame 127. Video time: 0:04.23
649
- Left foot position is incorrect on frame 127. Video time: 0:04.23
650
- Left pinky finger position is incorrect on frame 127. Video time: 0:04.23
651
- Left middle finger position is incorrect on frame 127. Video time: 0:04.23
652
- Left shin position is incorrect on frame 127. Video time: 0:04.23
653
- Left index finger position is incorrect on frame 127. Video time: 0:04.23
654
- Right middle finger position is incorrect on frame 127. Video time: 0:04.23
655
- Left foot position is incorrect on frame 128. Video time: 0:04.26
656
- Left pinky finger position is incorrect on frame 128. Video time: 0:04.26
657
- Left middle finger position is incorrect on frame 128. Video time: 0:04.26
658
- Right foot position is incorrect on frame 128. Video time: 0:04.26
659
- Right shin position is incorrect on frame 128. Video time: 0:04.26
660
- Left ring finger position is incorrect on frame 128. Video time: 0:04.26
661
- Left shin position is incorrect on frame 128. Video time: 0:04.26
662
- Left index finger position is incorrect on frame 128. Video time: 0:04.26
663
- Left thumb finger position is incorrect on frame 129. Video time: 0:04.30
664
- Left foot position is incorrect on frame 129. Video time: 0:04.30
665
- Right foot position is incorrect on frame 129. Video time: 0:04.30
666
- Left pinky finger position is incorrect on frame 129. Video time: 0:04.30
667
- Left middle finger position is incorrect on frame 129. Video time: 0:04.30
668
- Right shin position is incorrect on frame 129. Video time: 0:04.30
669
- Left shin position is incorrect on frame 129. Video time: 0:04.30
670
- Left index finger position is incorrect on frame 129. Video time: 0:04.30
671
- Left ring finger position is incorrect on frame 129. Video time: 0:04.30
672
- Right foot position is incorrect on frame 130. Video time: 0:04.33
673
- Right shin position is incorrect on frame 130. Video time: 0:04.33
674
- Left shin position is incorrect on frame 130. Video time: 0:04.33
675
- Left index finger position is incorrect on frame 130. Video time: 0:04.33
676
- Left ring finger position is incorrect on frame 130. Video time: 0:04.33
677
- Left foot position is incorrect on frame 130. Video time: 0:04.33
678
- Left pinky finger position is incorrect on frame 130. Video time: 0:04.33
679
- Left middle finger position is incorrect on frame 130. Video time: 0:04.33
680
- Left index finger position is incorrect on frame 131. Video time: 0:04.36
681
- Left ring finger position is incorrect on frame 131. Video time: 0:04.36
682
- Left pinky finger position is incorrect on frame 131. Video time: 0:04.36
683
- Left middle finger position is incorrect on frame 131. Video time: 0:04.36
684
- Left ring finger position is incorrect on frame 132. Video time: 0:04.40
685
- Left pinky finger position is incorrect on frame 132. Video time: 0:04.40
686
- Left thumb finger position is incorrect on frame 133. Video time: 0:04.43
687
- Left pinky finger position is incorrect on frame 133. Video time: 0:04.43
688
- Left ring finger position is incorrect on frame 133. Video time: 0:04.43
689
- Left foot position is incorrect on frame 134. Video time: 0:04.46
690
- Right foot position is incorrect on frame 134. Video time: 0:04.46
691
- Left pinky finger position is incorrect on frame 134. Video time: 0:04.46
692
- Right shin position is incorrect on frame 134. Video time: 0:04.46
693
- Left shin position is incorrect on frame 134. Video time: 0:04.46
694
- Left thumb finger position is incorrect on frame 134. Video time: 0:04.46
695
- Left ring finger position is incorrect on frame 134. Video time: 0:04.46
696
- Right shin position is incorrect on frame 135. Video time: 0:04.50
697
- Left shin position is incorrect on frame 135. Video time: 0:04.50
698
- Left index finger position is incorrect on frame 135. Video time: 0:04.50
699
- Right thigh position is incorrect on frame 135. Video time: 0:04.50
700
- Left ring finger position is incorrect on frame 135. Video time: 0:04.50
701
- Left foot position is incorrect on frame 135. Video time: 0:04.50
702
- Left pinky finger position is incorrect on frame 135. Video time: 0:04.50
703
- Left middle finger position is incorrect on frame 135. Video time: 0:04.50
704
- Right foot position is incorrect on frame 135. Video time: 0:04.50
705
- Right thigh position is incorrect on frame 136. Video time: 0:04.53
706
- Left foot position is incorrect on frame 136. Video time: 0:04.53
707
- Right foot position is incorrect on frame 136. Video time: 0:04.53
708
- Left pinky finger position is incorrect on frame 136. Video time: 0:04.53
709
- Left middle finger position is incorrect on frame 136. Video time: 0:04.53
710
- Right shin position is incorrect on frame 136. Video time: 0:04.53
711
- Left shin position is incorrect on frame 136. Video time: 0:04.53
712
- Left index finger position is incorrect on frame 136. Video time: 0:04.53
713
- Left foot position is incorrect on frame 137. Video time: 0:04.56
714
- Left middle finger position is incorrect on frame 137. Video time: 0:04.56
715
- Right foot position is incorrect on frame 137. Video time: 0:04.56
716
- Right shin position is incorrect on frame 137. Video time: 0:04.56
717
- Left pinky finger position is incorrect on frame 137. Video time: 0:04.56
718
- Left shin position is incorrect on frame 137. Video time: 0:04.56
719
- Left index finger position is incorrect on frame 137. Video time: 0:04.56
720
- Left foot position is incorrect on frame 138. Video time: 0:04.60
721
- Left pinky finger position is incorrect on frame 138. Video time: 0:04.60
722
- Left middle finger position is incorrect on frame 138. Video time: 0:04.60
723
- Right foot position is incorrect on frame 138. Video time: 0:04.60
724
- Right shin position is incorrect on frame 138. Video time: 0:04.60
725
- Left shin position is incorrect on frame 138. Video time: 0:04.60
726
- Left index finger position is incorrect on frame 138. Video time: 0:04.60
727
- Right foot position is incorrect on frame 139. Video time: 0:04.63
728
- Left pinky finger position is incorrect on frame 139. Video time: 0:04.63
729
- Right shin position is incorrect on frame 139. Video time: 0:04.63
730
- Left shin position is incorrect on frame 139. Video time: 0:04.63
731
- Left index finger position is incorrect on frame 139. Video time: 0:04.63
732
- Right middle finger position is incorrect on frame 139. Video time: 0:04.63
733
- Right ring finger position is incorrect on frame 139. Video time: 0:04.63
734
- Left foot position is incorrect on frame 139. Video time: 0:04.63
735
- Left index finger position is incorrect on frame 140. Video time: 0:04.66
736
- Left foot position is incorrect on frame 140. Video time: 0:04.66
737
- Left pinky finger position is incorrect on frame 140. Video time: 0:04.66
738
- Right foot position is incorrect on frame 140. Video time: 0:04.66
739
- Right shin position is incorrect on frame 140. Video time: 0:04.66
740
- Left shin position is incorrect on frame 140. Video time: 0:04.66
741
- Right thigh position is incorrect on frame 141. Video time: 0:04.70
742
- Left ring finger position is incorrect on frame 141. Video time: 0:04.70
743
- Left foot position is incorrect on frame 141. Video time: 0:04.70
744
- Right foot position is incorrect on frame 141. Video time: 0:04.70
745
- Left pinky finger position is incorrect on frame 141. Video time: 0:04.70
746
- Right shin position is incorrect on frame 141. Video time: 0:04.70
747
- Left shin position is incorrect on frame 141. Video time: 0:04.70
748
- Left index finger position is incorrect on frame 141. Video time: 0:04.70
749
- Left ring finger position is incorrect on frame 142. Video time: 0:04.73
750
- Left foot position is incorrect on frame 142. Video time: 0:04.73
751
- Left pinky finger position is incorrect on frame 142. Video time: 0:04.73
752
- Left middle finger position is incorrect on frame 142. Video time: 0:04.73
753
- Right foot position is incorrect on frame 142. Video time: 0:04.73
754
- Right shin position is incorrect on frame 142. Video time: 0:04.73
755
- Left shin position is incorrect on frame 142. Video time: 0:04.73
756
- Left index finger position is incorrect on frame 142. Video time: 0:04.73
757
- Left foot position is incorrect on frame 143. Video time: 0:04.76
758
- Right foot position is incorrect on frame 143. Video time: 0:04.76
759
- Left pinky finger position is incorrect on frame 143. Video time: 0:04.76
760
- Left middle finger position is incorrect on frame 143. Video time: 0:04.76
761
- Right shin position is incorrect on frame 143. Video time: 0:04.76
762
- Left shin position is incorrect on frame 143. Video time: 0:04.76
763
- Left index finger position is incorrect on frame 143. Video time: 0:04.76
764
- Left ring finger position is incorrect on frame 143. Video time: 0:04.76
765
- Right shin position is incorrect on frame 144. Video time: 0:04.80
766
- Left pinky finger position is incorrect on frame 144. Video time: 0:04.80
767
- Left shin position is incorrect on frame 144. Video time: 0:04.80
768
- Left thumb finger position is incorrect on frame 144. Video time: 0:04.80
769
- Left ring finger position is incorrect on frame 144. Video time: 0:04.80
770
- Left foot position is incorrect on frame 144. Video time: 0:04.80
771
- Left middle finger position is incorrect on frame 144. Video time: 0:04.80
772
- Right foot position is incorrect on frame 144. Video time: 0:04.80
773
- Left ring finger position is incorrect on frame 145. Video time: 0:04.83
774
- Left middle finger position is incorrect on frame 145. Video time: 0:04.83
775
- Left thumb finger position is incorrect on frame 145. Video time: 0:04.83
776
- Left foot position is incorrect on frame 145. Video time: 0:04.83
777
- Left pinky finger position is incorrect on frame 145. Video time: 0:04.83
778
- Right foot position is incorrect on frame 145. Video time: 0:04.83
779
- Right shin position is incorrect on frame 145. Video time: 0:04.83
780
- Left shin position is incorrect on frame 145. Video time: 0:04.83
781
- Left ring finger position is incorrect on frame 146. Video time: 0:04.86
782
- Left middle finger position is incorrect on frame 146. Video time: 0:04.86
783
- Left foot position is incorrect on frame 146. Video time: 0:04.86
784
- Right foot position is incorrect on frame 146. Video time: 0:04.86
785
- Left pinky finger position is incorrect on frame 146. Video time: 0:04.86
786
- Right shin position is incorrect on frame 146. Video time: 0:04.86
787
- Left shin position is incorrect on frame 146. Video time: 0:04.86
788
- Right ring finger position is incorrect on frame 147. Video time: 0:04.90
789
- Left foot position is incorrect on frame 147. Video time: 0:04.90
790
- Left pinky finger position is incorrect on frame 147. Video time: 0:04.90
791
- Left middle finger position is incorrect on frame 147. Video time: 0:04.90
792
- Right foot position is incorrect on frame 147. Video time: 0:04.90
793
- Right shin position is incorrect on frame 147. Video time: 0:04.90
794
- Right index finger position is incorrect on frame 147. Video time: 0:04.90
795
- Left ring finger position is incorrect on frame 147. Video time: 0:04.90
796
- Left shin position is incorrect on frame 147. Video time: 0:04.90
797
- Right pinky finger position is incorrect on frame 147. Video time: 0:04.90
798
- Right foot position is incorrect on frame 148. Video time: 0:04.93
799
- Left pinky finger position is incorrect on frame 148. Video time: 0:04.93
800
- Left middle finger position is incorrect on frame 148. Video time: 0:04.93
801
- Right shin position is incorrect on frame 148. Video time: 0:04.93
802
- Left shin position is incorrect on frame 148. Video time: 0:04.93
803
- Left index finger position is incorrect on frame 148. Video time: 0:04.93
804
- Left foot position is incorrect on frame 148. Video time: 0:04.93
805
- Left shin position is incorrect on frame 149. Video time: 0:04.96
806
- Left index finger position is incorrect on frame 149. Video time: 0:04.96
807
- Left foot position is incorrect on frame 149. Video time: 0:04.96
808
- Left pinky finger position is incorrect on frame 149. Video time: 0:04.96
809
- Left middle finger position is incorrect on frame 149. Video time: 0:04.96
810
- Right foot position is incorrect on frame 149. Video time: 0:04.96
811
- Right shin position is incorrect on frame 149. Video time: 0:04.96
812
- Left middle finger position is incorrect on frame 150. Video time:
813
- Left index finger position is incorrect on frame 150. Video time:
814
- Right ring finger position is incorrect on frame 151. Video time: 0:05.03
815
- Left ring finger position is incorrect on frame 151. Video time: 0:05.03
816
- Left middle finger position is incorrect on frame 151. Video time: 0:05.03
817
- Right thumb finger position is incorrect on frame 151. Video time: 0:05.03
818
- Left index finger position is incorrect on frame 151. Video time: 0:05.03
819
- Right pinky finger position is incorrect on frame 151. Video time: 0:05.03
820
- Right middle finger position is incorrect on frame 151. Video time: 0:05.03
821
- Right ring finger position is incorrect on frame 152. Video time: 0:05.06
822
- Right middle finger position is incorrect on frame 152. Video time: 0:05.06
823
- Right index finger position is incorrect on frame 152. Video time: 0:05.06
824
- Right pinky finger position is incorrect on frame 152. Video time: 0:05.06
825
- Left shin position is incorrect on frame 154. Video time: 0:05.13
826
- Left foot position is incorrect on frame 154. Video time: 0:05.13
827
- Left foot position is incorrect on frame 155. Video time: 0:05.16
828
- Right foot position is incorrect on frame 155. Video time: 0:05.16
829
- Right shin position is incorrect on frame 155. Video time: 0:05.16
830
- Left shin position is incorrect on frame 155. Video time: 0:05.16
831
- Left foot position is incorrect on frame 156. Video time: 0:05.20
832
- Right foot position is incorrect on frame 156. Video time: 0:05.20
833
- Right shin position is incorrect on frame 156. Video time: 0:05.20
834
- Left shin position is incorrect on frame 156. Video time: 0:05.20
835
- Left middle finger position is incorrect on frame 157. Video time: 0:05.23
836
- Right foot position is incorrect on frame 157. Video time: 0:05.23
837
- Right shin position is incorrect on frame 157. Video time: 0:05.23
838
- Left shin position is incorrect on frame 157. Video time: 0:05.23
839
- Right middle finger position is incorrect on frame 157. Video time: 0:05.23
840
- Right index finger position is incorrect on frame 157. Video time: 0:05.23
841
- Left foot position is incorrect on frame 157. Video time: 0:05.23
842
- Left shin position is incorrect on frame 158. Video time: 0:05.26
843
- Right middle finger position is incorrect on frame 158. Video time: 0:05.26
844
- Left foot position is incorrect on frame 158. Video time: 0:05.26
845
- Left middle finger position is incorrect on frame 158. Video time: 0:05.26
846
- Right foot position is incorrect on frame 158. Video time: 0:05.26
847
- Right shin position is incorrect on frame 158. Video time: 0:05.26
848
- Right ring finger position is incorrect on frame 159. Video time: 0:05.30
849
- Left foot position is incorrect on frame 159. Video time: 0:05.30
850
- Left middle finger position is incorrect on frame 159. Video time: 0:05.30
851
- Right foot position is incorrect on frame 159. Video time: 0:05.30
852
- Right shin position is incorrect on frame 159. Video time: 0:05.30
853
- Left shin position is incorrect on frame 159. Video time: 0:05.30
854
- Right middle finger position is incorrect on frame 159. Video time: 0:05.30
855
- Right ring finger position is incorrect on frame 160. Video time: 0:05.33
856
- Left foot position is incorrect on frame 160. Video time: 0:05.33
857
- Left middle finger position is incorrect on frame 160. Video time: 0:05.33
858
- Left shin position is incorrect on frame 160. Video time: 0:05.33
859
- Right middle finger position is incorrect on frame 160. Video time: 0:05.33
860
- Right ring finger position is incorrect on frame 161. Video time: 0:05.36
861
- Left foot position is incorrect on frame 161. Video time: 0:05.36
862
- Right middle finger position is incorrect on frame 161. Video time: 0:05.36
863
- Left shin position is incorrect on frame 161. Video time: 0:05.36
864
- Right pinky finger position is incorrect on frame 161. Video time: 0:05.36
865
- Left shin position is incorrect on frame 162. Video time: 0:05.40
866
- Right middle finger position is incorrect on frame 162. Video time: 0:05.40
867
- Right index finger position is incorrect on frame 162. Video time: 0:05.40
868
- Right ring finger position is incorrect on frame 162. Video time: 0:05.40
869
- Right pinky finger position is incorrect on frame 162. Video time: 0:05.40
870
- Left foot position is incorrect on frame 162. Video time: 0:05.40
871
- Left shin position is incorrect on frame 163. Video time: 0:05.43
872
- Right middle finger position is incorrect on frame 163. Video time: 0:05.43
873
- Right index finger position is incorrect on frame 163. Video time: 0:05.43
874
- Right ring finger position is incorrect on frame 163. Video time: 0:05.43
875
- Left foot position is incorrect on frame 163. Video time: 0:05.43
876
- Right index finger position is incorrect on frame 164. Video time: 0:05.46
877
- Right ring finger position is incorrect on frame 164. Video time: 0:05.46
878
- Left foot position is incorrect on frame 164. Video time: 0:05.46
879
- Right thumb finger position is incorrect on frame 164. Video time: 0:05.46
880
- Left shin position is incorrect on frame 164. Video time: 0:05.46
881
- Right middle finger position is incorrect on frame 164. Video time: 0:05.46
882
- Right index finger position is incorrect on frame 165. Video time: 0:05.50
883
- Right ring finger position is incorrect on frame 165. Video time: 0:05.50
884
- Left foot position is incorrect on frame 165. Video time: 0:05.50
885
- Right foot position is incorrect on frame 165. Video time: 0:05.50
886
- Right shin position is incorrect on frame 165. Video time: 0:05.50
887
- Left shin position is incorrect on frame 165. Video time: 0:05.50
888
- Right middle finger position is incorrect on frame 165. Video time: 0:05.50
889
- Right index finger position is incorrect on frame 166. Video time: 0:05.53
890
- Left shin position is incorrect on frame 166. Video time: 0:05.53
891
- Left foot position is incorrect on frame 166. Video time: 0:05.53
892
- Left shin position is incorrect on frame 167. Video time: 0:05.56
893
- Left foot position is incorrect on frame 167. Video time: 0:05.56
894
- Left shin position is incorrect on frame 168. Video time: 0:05.60
895
- Left foot position is incorrect on frame 168. Video time: 0:05.60
896
- Left foot position is incorrect on frame 169. Video time: 0:05.63
897
- Left shin position is incorrect on frame 169. Video time: 0:05.63
898
- Left foot position is incorrect on frame 170. Video time: 0:05.66
899
- Right thumb finger position is incorrect on frame 170. Video time: 0:05.66
900
- Right foot position is incorrect on frame 170. Video time: 0:05.66
901
- Right shin position is incorrect on frame 170. Video time: 0:05.66
902
- Left shin position is incorrect on frame 170. Video time: 0:05.66
903
- Left middle finger position is incorrect on frame 171. Video time: 0:05.70
904
- Right foot position is incorrect on frame 171. Video time: 0:05.70
905
- Right shin position is incorrect on frame 171. Video time: 0:05.70
906
- Left index finger position is incorrect on frame 171. Video time: 0:05.70
907
- Right index finger position is incorrect on frame 171. Video time: 0:05.70
908
- Right pinky finger position is incorrect on frame 171. Video time: 0:05.70
909
- Right ring finger position is incorrect on frame 171. Video time: 0:05.70
910
- Right shin position is incorrect on frame 172. Video time: 0:05.73
911
- Right pinky finger position is incorrect on frame 172. Video time: 0:05.73
912
- Right middle finger position is incorrect on frame 172. Video time: 0:05.73
913
- Right index finger position is incorrect on frame 172. Video time: 0:05.73
914
- Right ring finger position is incorrect on frame 172. Video time: 0:05.73
915
- Right foot position is incorrect on frame 172. Video time: 0:05.73
916
- Right foot position is incorrect on frame 173. Video time: 0:05.76
917
- Right shin position is incorrect on frame 173. Video time: 0:05.76
918
- Left foot position is incorrect on frame 174. Video time: 0:05.80
919
- Right foot position is incorrect on frame 174. Video time: 0:05.80
920
- Right shin position is incorrect on frame 174. Video time: 0:05.80
921
- Left shin position is incorrect on frame 174. Video time: 0:05.80
922
- Left pinky finger position is incorrect on frame 175. Video time: 0:05.83
923
- Left middle finger position is incorrect on frame 175. Video time: 0:05.83
924
- Right foot position is incorrect on frame 175. Video time: 0:05.83
925
- Right shin position is incorrect on frame 175. Video time: 0:05.83
926
- Left shin position is incorrect on frame 175. Video time: 0:05.83
927
- Left foot position is incorrect on frame 175. Video time: 0:05.83
928
- Left middle finger position is incorrect on frame 176. Video time: 0:05.86
929
- Right foot position is incorrect on frame 176. Video time: 0:05.86
930
- Right shin position is incorrect on frame 176. Video time: 0:05.86
931
- Right foot position is incorrect on frame 177. Video time: 0:05.90
932
- Right shin position is incorrect on frame 177. Video time: 0:05.90
933
- Right thigh position is incorrect on frame 178. Video time: 0:05.93
934
- Right foot position is incorrect on frame 178. Video time: 0:05.93
935
- Right shin position is incorrect on frame 178. Video time: 0:05.93
936
- Right thigh position is incorrect on frame 179. Video time: 0:05.96
937
- Left foot position is incorrect on frame 179. Video time: 0:05.96
938
- Right foot position is incorrect on frame 179. Video time: 0:05.96
939
- Right shin position is incorrect on frame 179. Video time: 0:05.96
940
- Left shin position is incorrect on frame 179. Video time: 0:05.96
941
- Right foot position is incorrect on frame 180. Video time:
942
- Right shin position is incorrect on frame 180. Video time:
943
- Left shin position is incorrect on frame 180. Video time:
944
- Right thigh position is incorrect on frame 180. Video time:
945
- Left foot position is incorrect on frame 180. Video time:
946
- Right thumb finger position is incorrect on frame 180. Video time:
947
- Right shin position is incorrect on frame 181. Video time: 0:06.03
948
- Right thigh position is incorrect on frame 181. Video time: 0:06.03
949
- Right thumb finger position is incorrect on frame 181. Video time: 0:06.03
950
- Right foot position is incorrect on frame 181. Video time: 0:06.03
951
- Right index finger position is incorrect on frame 182. Video time: 0:06.06
952
- Right ring finger position is incorrect on frame 182. Video time: 0:06.06
953
- Right thigh position is incorrect on frame 182. Video time: 0:06.06
954
- Right foot position is incorrect on frame 182. Video time: 0:06.06
955
- Right shin position is incorrect on frame 182. Video time: 0:06.06
956
- Right thumb finger position is incorrect on frame 182. Video time: 0:06.06
957
- Right middle finger position is incorrect on frame 182. Video time: 0:06.06
958
- Right index finger position is incorrect on frame 183. Video time: 0:06.10
959
- Right ring finger position is incorrect on frame 183. Video time: 0:06.10
960
- Right thigh position is incorrect on frame 183. Video time: 0:06.10
961
- Right middle finger position is incorrect on frame 183. Video time: 0:06.10
962
- Right thumb finger position is incorrect on frame 183. Video time: 0:06.10
963
- Right foot position is incorrect on frame 183. Video time: 0:06.10
964
- Right shin position is incorrect on frame 183. Video time: 0:06.10
965
- Right thumb finger position is incorrect on frame 184. Video time: 0:06.13
966
- Right foot position is incorrect on frame 184. Video time: 0:06.13
967
- Right shin position is incorrect on frame 184. Video time: 0:06.13
968
- Right pinky finger position is incorrect on frame 184. Video time: 0:06.13
969
- Right middle finger position is incorrect on frame 184. Video time: 0:06.13
970
- Right index finger position is incorrect on frame 184. Video time: 0:06.13
971
- Right ring finger position is incorrect on frame 184. Video time: 0:06.13
972
- Right foot position is incorrect on frame 185. Video time: 0:06.16
973
- Right shin position is incorrect on frame 185. Video time: 0:06.16
974
- Right index finger position is incorrect on frame 185. Video time: 0:06.16
975
- Right pinky finger position is incorrect on frame 185. Video time: 0:06.16
976
- Right ring finger position is incorrect on frame 185. Video time: 0:06.16
977
- Right thumb finger position is incorrect on frame 185. Video time: 0:06.16
978
- Right shin position is incorrect on frame 186. Video time: 0:06.20
979
- Right pinky finger position is incorrect on frame 186. Video time: 0:06.20
980
- Right ring finger position is incorrect on frame 186. Video time: 0:06.20
981
- Right thumb finger position is incorrect on frame 186. Video time: 0:06.20
982
- Right foot position is incorrect on frame 186. Video time: 0:06.20
983
- Right ring finger position is incorrect on frame 187. Video time: 0:06.23
984
- Right thumb finger position is incorrect on frame 187. Video time: 0:06.23
985
- Right ring finger position is incorrect on frame 188. Video time: 0:06.26
986
- Right middle finger position is incorrect on frame 188. Video time: 0:06.26
987
- Right middle finger position is incorrect on frame 189. Video time: 0:06.30
988
- Right ring finger position is incorrect on frame 189. Video time: 0:06.30
989
- Right foot position is incorrect on frame 190. Video time: 0:06.33
990
- Right shin position is incorrect on frame 190. Video time: 0:06.33
991
- Right middle finger position is incorrect on frame 190. Video time: 0:06.33
992
- Right ring finger position is incorrect on frame 190. Video time: 0:06.33
993
- Right shin position is incorrect on frame 191. Video time: 0:06.36
994
- Right middle finger position is incorrect on frame 191. Video time: 0:06.36
995
- Right ring finger position is incorrect on frame 191. Video time: 0:06.36
996
- Right thumb finger position is incorrect on frame 191. Video time: 0:06.36
997
- Right foot position is incorrect on frame 191. Video time: 0:06.36
998
- Right pinky finger position is incorrect on frame 192. Video time: 0:06.40
999
- Right ring finger position is incorrect on frame 192. Video time: 0:06.40
1000
- Right thumb finger position is incorrect on frame 192. Video time: 0:06.40
1001
- Right foot position is incorrect on frame 192. Video time: 0:06.40
1002
- Right shin position is incorrect on frame 192. Video time: 0:06.40
1003
- Right middle finger position is incorrect on frame 192. Video time: 0:06.40
1004
- Right foot position is incorrect on frame 193. Video time: 0:06.43
1005
- Right shin position is incorrect on frame 193. Video time: 0:06.43
1006
- Right foot position is incorrect on frame 194. Video time: 0:06.46
1007
- Right shin position is incorrect on frame 194. Video time: 0:06.46
1008
- Right thigh position is incorrect on frame 194. Video time: 0:06.46
1009
- Right foot position is incorrect on frame 195. Video time: 0:06.50
1010
- Right shin position is incorrect on frame 195. Video time: 0:06.50
1011
- Right foot position is incorrect on frame 196. Video time: 0:06.53
1012
- Right shin position is incorrect on frame 196. Video time: 0:06.53
1013
- Right foot position is incorrect on frame 197. Video time: 0:06.56
1014
- Right shin position is incorrect on frame 197. Video time: 0:06.56
1015
- Right foot position is incorrect on frame 198. Video time: 0:06.60
1016
- Right shin position is incorrect on frame 198. Video time: 0:06.60
1017
- Right middle finger position is incorrect on frame 198. Video time: 0:06.60
1018
- Right foot position is incorrect on frame 199. Video time: 0:06.63
1019
- Right shin position is incorrect on frame 199. Video time: 0:06.63
1020
- Right shin position is incorrect on frame 200. Video time: 0:06.66
1021
- Right foot position is incorrect on frame 200. Video time: 0:06.66
1022
- Right foot position is incorrect on frame 201. Video time: 0:06.70
1023
- Right shin position is incorrect on frame 201. Video time: 0:06.70
1024
- Right pinky finger position is incorrect on frame 202. Video time: 0:06.73
1025
- Right thumb finger position is incorrect on frame 202. Video time: 0:06.73
1026
- Right foot position is incorrect on frame 202. Video time: 0:06.73
1027
- Right shin position is incorrect on frame 202. Video time: 0:06.73
1028
- Right ring finger position is incorrect on frame 202. Video time: 0:06.73
1029
- Right thumb finger position is incorrect on frame 203. Video time: 0:06.76
1030
- Right foot position is incorrect on frame 203. Video time: 0:06.76
1031
- Right shin position is incorrect on frame 203. Video time: 0:06.76
1032
- Right pinky finger position is incorrect on frame 203. Video time: 0:06.76
1033
- Right index finger position is incorrect on frame 203. Video time: 0:06.76
1034
- Right ring finger position is incorrect on frame 203. Video time: 0:06.76
1035
- Right foot position is incorrect on frame 204. Video time: 0:06.80
1036
- Right shin position is incorrect on frame 204. Video time: 0:06.80
1037
- Right index finger position is incorrect on frame 204. Video time: 0:06.80
1038
- Right thigh position is incorrect on frame 204. Video time: 0:06.80
1039
- Right pinky finger position is incorrect on frame 204. Video time: 0:06.80
1040
- Right middle finger position is incorrect on frame 204. Video time: 0:06.80
1041
- Right ring finger position is incorrect on frame 204. Video time: 0:06.80
1042
- Right shin position is incorrect on frame 205. Video time: 0:06.83
1043
- Right pinky finger position is incorrect on frame 205. Video time: 0:06.83
1044
- Right index finger position is incorrect on frame 205. Video time: 0:06.83
1045
- Right ring finger position is incorrect on frame 205. Video time: 0:06.83
1046
- Right thigh position is incorrect on frame 205. Video time: 0:06.83
1047
- Right middle finger position is incorrect on frame 205. Video time: 0:06.83
1048
- Right foot position is incorrect on frame 205. Video time: 0:06.83
1049
- Left pinky finger position is incorrect on frame 205. Video time: 0:06.83
1050
- Left middle finger position is incorrect on frame 205. Video time: 0:06.83
1051
- Right pinky finger position is incorrect on frame 206. Video time: 0:06.86
1052
- Right index finger position is incorrect on frame 206. Video time: 0:06.86
1053
- Right ring finger position is incorrect on frame 206. Video time: 0:06.86
1054
- Right foot position is incorrect on frame 206. Video time: 0:06.86
1055
- Right shin position is incorrect on frame 206. Video time: 0:06.86
1056
- Right middle finger position is incorrect on frame 206. Video time: 0:06.86
1057
- Right foot position is incorrect on frame 207. Video time: 0:06.90
1058
- Right shin position is incorrect on frame 207. Video time: 0:06.90
1059
- Right foot position is incorrect on frame 208. Video time: 0:06.93
1060
- Right shin position is incorrect on frame 208. Video time: 0:06.93
1061
- Left thigh position is incorrect on frame 208. Video time: 0:06.93
1062
- Left shin position is incorrect on frame 208. Video time: 0:06.93
1063
- Left foot position is incorrect on frame 208. Video time: 0:06.93
1064
- Right foot position is incorrect on frame 209. Video time: 0:06.96
1065
- Right shin position is incorrect on frame 209. Video time: 0:06.96
1066
- Right thigh position is incorrect on frame 209. Video time: 0:06.96
1067
- Right shin position is incorrect on frame 210. Video time:
1068
- Right middle finger position is incorrect on frame 210. Video time:
1069
- Right thigh position is incorrect on frame 210. Video time:
1070
- Right foot position is incorrect on frame 210. Video time:
1071
- Right thumb finger position is incorrect on frame 211. Video time: 0:07.03
1072
- Right foot position is incorrect on frame 211. Video time: 0:07.03
1073
- Right shin position is incorrect on frame 211. Video time: 0:07.03
1074
- Right middle finger position is incorrect on frame 211. Video time: 0:07.03
1075
- Right index finger position is incorrect on frame 211. Video time: 0:07.03
1076
- Right thigh position is incorrect on frame 211. Video time: 0:07.03
1077
- Right thumb finger position is incorrect on frame 212. Video time: 0:07.06
1078
- Right foot position is incorrect on frame 212. Video time: 0:07.06
1079
- Right shin position is incorrect on frame 212. Video time: 0:07.06
1080
- Right middle finger position is incorrect on frame 212. Video time: 0:07.06
1081
- Right index finger position is incorrect on frame 212. Video time: 0:07.06
1082
- Right thigh position is incorrect on frame 212. Video time: 0:07.06
1083
- Right thumb finger position is incorrect on frame 213. Video time: 0:07.10
1084
- Right foot position is incorrect on frame 213. Video time: 0:07.10
1085
- Right shin position is incorrect on frame 213. Video time: 0:07.10
1086
- Right middle finger position is incorrect on frame 213. Video time: 0:07.10
1087
- Right thigh position is incorrect on frame 213. Video time: 0:07.10
1088
- Right index finger position is incorrect on frame 213. Video time: 0:07.10
1089
- Right shin position is incorrect on frame 214. Video time: 0:07.13
1090
- Right middle finger position is incorrect on frame 214. Video time: 0:07.13
1091
- Right index finger position is incorrect on frame 214. Video time: 0:07.13
1092
- Right thigh position is incorrect on frame 214. Video time: 0:07.13
1093
- Right thumb finger position is incorrect on frame 214. Video time: 0:07.13
1094
- Right foot position is incorrect on frame 214. Video time: 0:07.13
1095
- Right thigh position is incorrect on frame 215. Video time: 0:07.16
1096
- Right foot position is incorrect on frame 215. Video time: 0:07.16
1097
- Right shin position is incorrect on frame 215. Video time: 0:07.16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
main_func.py CHANGED
@@ -1,12 +1,17 @@
 
 
1
  from utils import (
2
  predict_keypoints_vitpose,
3
  get_edge_groups,
4
  get_series,
5
  z_score_normalization,
6
  modify_student_frame,
7
- modify_student_frame_2,
8
  get_video_frames,
9
- check_and_download_models
 
 
 
 
10
  )
11
 
12
  from config import (
@@ -17,17 +22,21 @@ from config import (
17
  get_thresholds
18
  )
19
 
20
- from dtaidistance import dtw
21
- import numpy as np
22
- from scipy.signal import savgol_filter
23
- from scipy.stats import mstats
24
- import datetime
25
- from datetime import timedelta
26
- import cv2
27
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- def video_identity(dtw_mean, dtw_filter, angles_sensitive, angles_common, angles_insensitive, trigger_state, video_teacher, video_student):
30
-
 
31
  check_and_download_models()
32
 
33
  detection_result_teacher = predict_keypoints_vitpose(
@@ -44,6 +53,10 @@ def video_identity(dtw_mean, dtw_filter, angles_sensitive, angles_common, angles
44
  detector_path="models/yolov8s.pt"
45
  )
46
 
 
 
 
 
47
  detection_result_teacher_angles = get_series(detection_result_teacher[:, :,:-1], EDGE_GROUPS_FOR_ERRORS).T
48
  detection_result_student_angles = get_series(detection_result_student[:, :,:-1], EDGE_GROUPS_FOR_ERRORS).T
49
 
@@ -55,61 +68,35 @@ def video_identity(dtw_mean, dtw_filter, angles_sensitive, angles_common, angles
55
  serieses_teacher = z_score_normalization(serieses_teacher)
56
  serieses_student = z_score_normalization(serieses_student)
57
 
58
- list_of_paths = []
59
- for idx in range(len(serieses_teacher)):
60
- series_teacher = np.array(serieses_teacher[idx])
61
- series_student = np.array(serieses_student[idx])
62
- _ , paths = dtw.warping_paths(series_teacher, series_student, window=50)
63
- path = dtw.best_path(paths)
64
 
65
- list_of_paths.append(path)
66
-
67
-
68
- all_dtw_tupples = []
69
- for path in list_of_paths:
70
- all_dtw_tupples.extend(path)
71
-
72
- mean_path = []
73
- for student_frame in range(len(serieses_student[0])):
74
- frame_from_teacher = []
75
- for frame_teacher in all_dtw_tupples:
76
- if frame_teacher[1] == student_frame:
77
- frame_from_teacher.append(frame_teacher[0])
78
-
79
- mean_path.append((int(mstats.winsorize(np.array(frame_from_teacher), limits=[dtw_mean, dtw_mean]).mean()), student_frame))
80
-
81
- path_array = np.array(mean_path)
82
- smoothed_data = savgol_filter(path_array, window_length=dtw_filter, polyorder=0, axis=0)
83
- path_array = np.array(smoothed_data).astype(int)
84
-
85
- video_teacher_loaded = get_video_frames(video_teacher)
86
- video_student_loaded = get_video_frames(video_student)
87
-
88
- alignments = np.unique(path_array, axis=0)
89
 
90
- threshouds_for_errors = get_thresholds(angles_sensitive, angles_common, angles_insensitive)
91
 
92
  # ======================================================================================
93
-
 
94
  trigger_1 = []
95
  trigger_2 = []
96
-
97
  save_teacher_frames = []
98
  save_student_frames = []
99
  all_text_summaries = []
 
 
 
 
 
100
  for idx, alignment in enumerate(alignments):
101
 
102
  frame_student_out, frame_teacher_out, trigger_1, trigger_2, text_info_summary = modify_student_frame(
103
  detection_result_student=detection_result_student,
104
-
105
  detection_result_teacher_angles=detection_result_teacher_angles,
106
  detection_result_student_angles=detection_result_student_angles,
107
-
108
  video_teacher=video_teacher_loaded,
109
  video_student=video_student_loaded,
110
-
111
  alignment_frames=alignment,
112
-
113
  edge_groups=EDGE_GROUPS_FOR_ERRORS,
114
  connections=CONNECTIONS_FOR_ERROR,
115
  thresholds=threshouds_for_errors,
@@ -121,83 +108,27 @@ def video_identity(dtw_mean, dtw_filter, angles_sensitive, angles_common, angles
121
 
122
  save_teacher_frames.append(frame_teacher_out)
123
  save_student_frames.append(frame_student_out)
124
-
125
- text_info_summary = [(log, idx) for log in text_info_summary]
126
- all_text_summaries.extend(text_info_summary)
127
 
128
-
 
 
129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
- save_teacher_frames = np.array(save_teacher_frames)
132
- save_student_frames = np.array(save_student_frames)
133
-
134
- save_teacher_frames_resized = np.array([cv2.resize(frame, (1280, 720)) for frame in save_teacher_frames])
135
- save_student_frames_resized = np.array([cv2.resize(frame, (1280, 720)) for frame in save_student_frames])
136
-
137
- # print(f"video shape: {save_student_frames.shape}")
138
-
139
- print(f"shape s: {save_student_frames.shape}")
140
- print(f"shape t: {save_teacher_frames.shape}")
141
-
142
- concat_video = []
143
- # print(alignments)
144
-
145
-
146
- concat_video = np.concatenate((save_teacher_frames_resized, save_student_frames_resized), axis=2)
147
- concat_video = np.array(concat_video)
148
-
149
- current_time = datetime.datetime.now()
150
- timestamp_str = current_time.strftime("%Y_%m-%d_%H_%M_%S")
151
- video_path = f"videos/pose_{timestamp_str}.mp4"
152
-
153
- out = cv2.VideoWriter(video_path, cv2.VideoWriter_fourcc(*'mp4v'), 30, (1280*2, 720))
154
- for frame in concat_video:
155
- out.write(frame)
156
- out.release()
157
-
158
-
159
- all_text_summaries_clean = list(set(all_text_summaries))
160
- all_text_summaries_clean.sort(key=lambda x: x[1])
161
-
162
- general_summary = []
163
-
164
- for log in all_text_summaries_clean:
165
- comment, frame = log
166
-
167
- total_seconds = frame / 30
168
-
169
- general_summary.append(f"{comment} on frame {frame}. Video time: {str(timedelta(seconds=total_seconds))[3:-4]}")
170
-
171
-
172
- general_summary = "\n".join(general_summary)
173
-
174
- log_path = f"logs/log_{timestamp_str}.txt"
175
-
176
-
177
- content = f"""
178
- Settings:
179
-
180
- Dynamic Time Warping:
181
- - Winsorize mean: {dtw_mean}
182
- - Savitzky-Golay Filter: {dtw_filter}
183
-
184
- Thresholds:
185
- - Sensitive: {angles_sensitive}
186
- - Standart: {angles_common}
187
- - Insensitive: {angles_insensitive}
188
-
189
- Patience:
190
- - trigger count: {trigger_state}
191
-
192
-
193
- Error logs:
194
-
195
- {general_summary}
196
- """
197
-
198
- with open(log_path, "w") as file:
199
- file.write(content)
200
-
201
-
202
-
203
- return video_path, general_summary, log_path
 
1
+ import datetime
2
+
3
  from utils import (
4
  predict_keypoints_vitpose,
5
  get_edge_groups,
6
  get_series,
7
  z_score_normalization,
8
  modify_student_frame,
 
9
  get_video_frames,
10
+ check_and_download_models,
11
+ get_dtw_mean_path,
12
+ generate_output_video,
13
+ generate_log,
14
+ write_log,
15
  )
16
 
17
  from config import (
 
22
  get_thresholds
23
  )
24
 
 
 
 
 
 
 
 
25
 
26
+ def video_identity(
27
+ dtw_mean,
28
+ dtw_filter,
29
+ angles_sensitive,
30
+ angles_common,
31
+ angles_insensitive,
32
+ trigger_state,
33
+ video_teacher,
34
+ video_student
35
+ ):
36
 
37
+ # ======================================================================================
38
+ # This part is responsible for keypoints detection on two videos.
39
+ # ======================================================================================
40
  check_and_download_models()
41
 
42
  detection_result_teacher = predict_keypoints_vitpose(
 
53
  detector_path="models/yolov8s.pt"
54
  )
55
 
56
+
57
+ # ======================================================================================
58
+ # Here we perform transformations of keypoints to angles between keypoints and normalize them.
59
+ # ======================================================================================
60
  detection_result_teacher_angles = get_series(detection_result_teacher[:, :,:-1], EDGE_GROUPS_FOR_ERRORS).T
61
  detection_result_student_angles = get_series(detection_result_student[:, :,:-1], EDGE_GROUPS_FOR_ERRORS).T
62
 
 
68
  serieses_teacher = z_score_normalization(serieses_teacher)
69
  serieses_student = z_score_normalization(serieses_student)
70
 
 
 
 
 
 
 
71
 
72
+ # ======================================================================================
73
+ # Finding of frame to frame mean alignment with DTW algorithm.
74
+ # ======================================================================================
75
+ alignments = get_dtw_mean_path(serieses_teacher, serieses_student, dtw_mean, dtw_filter)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
 
77
 
78
  # ======================================================================================
79
+ # Adding visual marks on student's video, speed alignment and error log generation.
80
+ # ======================================================================================
81
  trigger_1 = []
82
  trigger_2 = []
 
83
  save_teacher_frames = []
84
  save_student_frames = []
85
  all_text_summaries = []
86
+
87
+ video_teacher_loaded = get_video_frames(video_teacher)
88
+ video_student_loaded = get_video_frames(video_student)
89
+ threshouds_for_errors = get_thresholds(angles_sensitive, angles_common, angles_insensitive)
90
+
91
  for idx, alignment in enumerate(alignments):
92
 
93
  frame_student_out, frame_teacher_out, trigger_1, trigger_2, text_info_summary = modify_student_frame(
94
  detection_result_student=detection_result_student,
 
95
  detection_result_teacher_angles=detection_result_teacher_angles,
96
  detection_result_student_angles=detection_result_student_angles,
 
97
  video_teacher=video_teacher_loaded,
98
  video_student=video_student_loaded,
 
99
  alignment_frames=alignment,
 
100
  edge_groups=EDGE_GROUPS_FOR_ERRORS,
101
  connections=CONNECTIONS_FOR_ERROR,
102
  thresholds=threshouds_for_errors,
 
108
 
109
  save_teacher_frames.append(frame_teacher_out)
110
  save_student_frames.append(frame_student_out)
111
+ all_text_summaries.extend([(log, idx) for log in text_info_summary])
 
 
112
 
113
+ # ======================================================================================
114
+ # create files for downloading and displaying.
115
+ # ======================================================================================
116
 
117
+ timestamp_str = datetime.datetime.now().strftime("%Y_%m-%d_%H_%M_%S")
118
+
119
+ video_path = generate_output_video(save_teacher_frames, save_student_frames, timestamp_str)
120
+
121
+ general_summary = generate_log(all_text_summaries)
122
+
123
+ log_path = write_log(
124
+ timestamp_str,
125
+ dtw_mean,
126
+ dtw_filter,
127
+ angles_sensitive,
128
+ angles_common,
129
+ angles_insensitive,
130
+ trigger_state,
131
+ general_summary
132
+ )
133
 
134
+ return video_path, general_summary, log_path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
utils.py CHANGED
@@ -6,7 +6,9 @@ from easy_ViTPose.inference import VitInference
6
  import os
7
  import requests
8
  from pathlib import Path
9
-
 
 
10
 
11
  def predict_keypoints_vitpose(
12
  video_path,
@@ -33,9 +35,10 @@ def predict_keypoints_vitpose(
33
  while True:
34
  ret, frame = cap.read()
35
  if not ret:
36
- print("End")
37
  break
38
 
 
39
  frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
40
  frame_keypoints = model.inference(frame)
41
 
@@ -67,7 +70,6 @@ def get_edge_groups(connections):
67
  all_pairs = []
68
  for i in range(len(connections)):
69
  pairs = []
70
-
71
  init_con = connections[i]
72
  for k in range(len(connections)):
73
  if k == i:
@@ -95,10 +97,8 @@ def get_edge_groups(connections):
95
  clean_pairs.append(points_for_edge)
96
  all_point_for_edges.extend(clean_pairs)
97
 
98
-
99
  unique_set = set()
100
  unique_list = []
101
-
102
  for sublist in all_point_for_edges:
103
  sublist_tuple = tuple(sublist)
104
  if sublist_tuple not in unique_set:
@@ -111,45 +111,28 @@ def get_edge_groups(connections):
111
 
112
 
113
  def calculate_angle(A, B, C):
114
- """
115
- Calculate the angle at point B formed by the line segments AB and BC,
116
- and the minimum length of these segments.
117
-
118
- Parameters:
119
- A Numpy array: Coordinates of point A (e.g., [x1, y1, z1]).
120
- B Numpy array: Coordinates of point B (e.g., [x2, y2, z2]).
121
- C Numpy array: Coordinates of point C (e.g., [x3, y3, z3]).
122
-
123
- Returns:
124
- tuple: A tuple containing:
125
- - angle (float): The angle at point B in degrees.
126
- - minimum (float): The minimum length of the segments AB and BC.
127
- """
128
  A = np.round(np.array(A), decimals=3)
129
  B = np.round(np.array(B), decimals=3)
130
  C = np.round(np.array(C), decimals=3)
131
 
132
- # Create vectors BA and BC
133
  BA = A - B
134
  BC = C - B
135
 
136
- # Compute the cosine of the angle using the dot product and magnitudes of BA and BC
137
- cosine_angle = np.dot(BA, BC) / ((np.linalg.norm(BA) * np.linalg.norm(BC))+ 0.00001)
138
  cosine_angle = np.clip(cosine_angle, -1, 1)
139
- # Calculate the angle in radians and then convert to degrees
140
  angle = np.arccos(cosine_angle)
141
 
142
  if np.isnan(angle):
143
- print(f"Invalid angle calculation.\n{A} \n{B} \n{C}")
144
- # Find the minimum length of the segments BA and BC
145
  minimum = np.min(np.array((np.linalg.norm(BA), np.linalg.norm(BC))))
146
 
147
- # Return the angle in degrees and the minimum segment length
148
  return np.degrees(angle), minimum
149
 
150
 
151
-
152
  def compute_all_angels(keypoints, edge_groups):
 
153
  all_angles = []
154
  for group in edge_groups:
155
 
@@ -164,10 +147,10 @@ def compute_all_angels(keypoints, edge_groups):
164
 
165
 
166
  def xy2phi(points_result, connections):
167
- edge_groups = get_edge_groups(connections)
168
-
169
 
 
170
  new_array = np.zeros((points_result.shape[0], len(edge_groups), 1))
 
171
  for idx, frame in enumerate(points_result):
172
  all_angels = compute_all_angels(keypoints=frame, edge_groups=edge_groups)[:, 0]
173
  new_array[idx, :, :] = all_angels.reshape((len(edge_groups), 1))
@@ -178,16 +161,14 @@ def xy2phi(points_result, connections):
178
  def get_series(point_list, edge_groups):
179
 
180
  list_of_series = []
181
-
182
  for edge_group in edge_groups:
 
183
  keypoint_1, keypoint_2, keypoint_3 = edge_group
184
  relevant_point_list = point_list[:, (keypoint_1, keypoint_2, keypoint_3), :]
185
 
186
  series = []
187
  for frame in relevant_point_list:
188
-
189
  angle, _ = calculate_angle(frame[0, :], frame[1, :], frame[2, :])
190
-
191
  series.append(angle)
192
  list_of_series.append(series)
193
 
@@ -195,14 +176,14 @@ def get_series(point_list, edge_groups):
195
 
196
 
197
  def plot_serieses(series_1, series_2):
 
198
  plt.figure(dpi=150, figsize=(12, 5))
199
- plt.plot(series_1, label='Video #1: normal speed. 30 fps', lw=1)
200
- plt.plot(series_2, label='Video #2: slowed(2X) / Croped. 30 fps', lw=1)
201
  plt.axis("on")
202
  plt.grid(True)
203
- # plt.title("x-coordinate of the left elbow (keypoint 13) for two identical videos with different speeds but the same FPS")
204
  plt.xlabel("frames")
205
- plt.ylabel("mean of 72 angles")
206
  plt.legend()
207
 
208
 
@@ -215,70 +196,45 @@ def z_score_normalization(serieses, axis_for_znorm=1):
215
  return serieses_normalized
216
 
217
 
218
- def modify_student_frame_2(
219
- detection_result_student,
220
- detection_result_teacher_angles,
221
- detection_result_student_angles,
222
- video_teacher,
223
- video_student,
224
- alignment_frames,
225
- edge_groups,
226
- connections,
227
- thresholds,
228
- previously_trigered,
229
- previously_trigered_2,
230
- triger_state
231
- ):
232
- frame_copy = video_student[alignment_frames[1]]
233
- frame_teacher_copy = video_teacher[alignment_frames[0]]
234
-
235
- frame_errors = np.abs(detection_result_teacher_angles[alignment_frames[0]] - detection_result_student_angles[alignment_frames[1]])
236
-
237
- edge_groups_as_keys = [tuple(group) for group in edge_groups]
238
- edge_groups2errors = dict(zip(edge_groups_as_keys, frame_errors))
239
- edge_groups2thresholds = dict(zip(edge_groups_as_keys, thresholds))
240
- edge_groups_relevant = [tuple(edge_group[1:]) for edge_group in edge_groups]
241
 
242
- trigered_connections = []
243
- trigered_connections2 = []
 
244
 
245
- for connection in connections:
246
- edges_for_given_connection = [edge for edge in edge_groups2errors if connection[0] in edge or connection[1] in edge]
 
 
 
 
247
 
248
- for edge in edges_for_given_connection:
249
- if edge_groups2errors[edge] > edge_groups2thresholds[edge]:
250
- if all(detection_result_student[alignment_frames[1], keypoint, -1] >= 0.7 for keypoint in edge):
251
- if (connection[0], connection[1]) in edge_groups_relevant or (connection[1], connection[0]) in edge_groups_relevant:
252
- point1 = detection_result_student[alignment_frames[1], connection[0], :2].astype(int)
253
- point2 = detection_result_student[alignment_frames[1], connection[1], :2].astype(int)
254
- point1, point2 = point1[::-1], point2[::-1]
255
 
256
- if triger_state == "three":
257
- trigered_connections.append((connection[0], connection[1]))
258
- if (connection[0], connection[1]) in previously_trigered:
259
- trigered_connections2.append((connection[0], connection[1]))
260
- if (connection[0], connection[1]) in previously_trigered_2:
261
- cv2.line(frame_copy, tuple(point1), tuple(point2), (0, 0, 255), 5)
262
- elif triger_state == "two":
263
- trigered_connections.append((connection[0], connection[1]))
264
- if (connection[0], connection[1]) in previously_trigered:
265
- cv2.line(frame_copy, tuple(point1), tuple(point2), (0, 0, 255), 5)
266
 
267
- return frame_copy, frame_teacher_copy, list(set(trigered_connections)), list(set(trigered_connections2))
268
 
 
269
 
270
 
271
  def modify_student_frame(
272
  detection_result_student,
273
-
274
  detection_result_teacher_angles,
275
  detection_result_student_angles,
276
-
277
  video_teacher,
278
  video_student,
279
-
280
  alignment_frames,
281
-
282
  edge_groups,
283
  connections,
284
  thresholds,
@@ -290,31 +246,21 @@ def modify_student_frame(
290
 
291
  frame_copy = video_student[alignment_frames[1]]
292
  frame_teacher_copy = video_teacher[alignment_frames[0]]
293
-
294
  frame_errors = np.abs(detection_result_teacher_angles[alignment_frames[0]] - detection_result_student_angles[alignment_frames[1]])
295
-
296
  edge_groups_as_keys = [tuple(group) for group in edge_groups]
297
  edge_groups2errors = dict(zip(edge_groups_as_keys, frame_errors))
298
-
299
  edge_groups2thresholds = dict(zip(edge_groups_as_keys, thresholds))
300
-
301
  edge_groups_relevant = [edge_group[1:] for edge_group in edge_groups]
302
 
303
  text_info = []
304
  trigered_connections = []
305
  trigered_connections2 = []
306
-
307
  for connection in connections:
308
 
309
- # check every edge, that contain atleast one keypoint from connection
310
  edges_for_given_connection = [edge for edge in edge_groups2errors if connection[0] in edge or connection[1] in edge]
311
 
312
-
313
  for edge in edges_for_given_connection:
314
 
315
- # check if error in edge are grather then threshold for this edge
316
-
317
-
318
  check_threshold = edge_groups2errors[edge] > edge_groups2thresholds[edge]
319
  check_certain = True
320
  for keypoint in edge:
@@ -324,11 +270,8 @@ def modify_student_frame(
324
 
325
  relevant_plane = [connection[0], connection[1]] in edge_groups_relevant or [connection[1], connection[0]] in edge_groups_relevant
326
 
327
-
328
  if check_threshold and check_certain and relevant_plane:
329
 
330
-
331
-
332
  point1 = detection_result_student[:, :, :-1][alignment_frames[1]][connection[0]]
333
  point2 = detection_result_student[:, :, :-1][alignment_frames[1]][connection[1]]
334
 
@@ -338,7 +281,24 @@ def modify_student_frame(
338
  point1 = [point1[1], point1[0]]
339
  point2 = [ point2[1], point2[0]]
340
 
341
- # print(f"trigger stats: {triger_state}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
 
343
  if triger_state == "three":
344
 
@@ -354,17 +314,6 @@ def modify_student_frame(
354
 
355
  if (connection[0], connection[1]) in text_dictionary:
356
  text_info.append(text_dictionary[(connection[0], connection[1])])
357
-
358
- if triger_state == "two":
359
-
360
- trigered_connections.append((connection[0], connection[1]))
361
-
362
- if (connection[0], connection[1]) in previously_trigered:
363
-
364
- _ = cv2.line(frame_copy, point1, point2, (0, 0, 255), 10)
365
-
366
- if (connection[0], connection[1]) in text_dictionary:
367
- text_info.append(text_dictionary[(connection[0], connection[1])])
368
 
369
  return frame_copy, frame_teacher_copy, list(set(trigered_connections)), list(set(trigered_connections2)), text_info
370
 
@@ -375,10 +324,9 @@ def get_video_frames(video_path):
375
  while True:
376
  ret, frame = cap.read()
377
  if not ret:
378
- print("End")
379
  break
380
-
381
- # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
382
  video.append(frame)
383
 
384
  return np.array(video)
@@ -391,25 +339,129 @@ def download_file(url, save_path):
391
  for chunk in response.iter_content(chunk_size=8192):
392
  file.write(chunk)
393
 
 
394
  def check_and_download_models():
 
 
 
 
395
 
396
- vit_model_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/torch/wholebody/vitpose-b-wholebody.pth?download=true"
397
  yolo_model_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/yolov8/yolov8s.pt?download=true"
398
 
399
- vit_model_path = "models/vitpose-b-wholebody.pth"
 
 
400
 
401
  yolo_model_path = "models/yolov8s.pt"
402
 
 
 
 
403
 
404
- Path(os.path.dirname(vit_model_path)).mkdir(parents=True, exist_ok=True)
405
  Path(os.path.dirname(yolo_model_path)).mkdir(parents=True, exist_ok=True)
406
 
407
-
408
- if not os.path.exists(vit_model_path):
409
- print("Downloading ViT model...")
410
- download_file(vit_model_url, vit_model_path)
 
 
 
 
 
 
 
 
 
 
411
 
412
-
413
  if not os.path.exists(yolo_model_path):
414
  print("Downloading YOLO model...")
415
- download_file(yolo_model_url, yolo_model_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  import os
7
  import requests
8
  from pathlib import Path
9
+ from datetime import timedelta
10
+ from scipy.signal import savgol_filter
11
+ from scipy.stats import mstats
12
 
13
  def predict_keypoints_vitpose(
14
  video_path,
 
35
  while True:
36
  ret, frame = cap.read()
37
  if not ret:
38
+ print(f"Keypoints were extracted from {video_path}")
39
  break
40
 
41
+ frame = cv2.resize(frame, (1280, 720))
42
  frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
43
  frame_keypoints = model.inference(frame)
44
 
 
70
  all_pairs = []
71
  for i in range(len(connections)):
72
  pairs = []
 
73
  init_con = connections[i]
74
  for k in range(len(connections)):
75
  if k == i:
 
97
  clean_pairs.append(points_for_edge)
98
  all_point_for_edges.extend(clean_pairs)
99
 
 
100
  unique_set = set()
101
  unique_list = []
 
102
  for sublist in all_point_for_edges:
103
  sublist_tuple = tuple(sublist)
104
  if sublist_tuple not in unique_set:
 
111
 
112
 
113
  def calculate_angle(A, B, C):
114
+
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  A = np.round(np.array(A), decimals=3)
116
  B = np.round(np.array(B), decimals=3)
117
  C = np.round(np.array(C), decimals=3)
118
 
 
119
  BA = A - B
120
  BC = C - B
121
 
122
+ cosine_angle = np.dot(BA, BC) / ((np.linalg.norm(BA) * np.linalg.norm(BC)))
 
123
  cosine_angle = np.clip(cosine_angle, -1, 1)
 
124
  angle = np.arccos(cosine_angle)
125
 
126
  if np.isnan(angle):
127
+ print(f"Invalid angle calculation.\n{A} \n{B} \n{C}")
128
+
129
  minimum = np.min(np.array((np.linalg.norm(BA), np.linalg.norm(BC))))
130
 
 
131
  return np.degrees(angle), minimum
132
 
133
 
 
134
  def compute_all_angels(keypoints, edge_groups):
135
+
136
  all_angles = []
137
  for group in edge_groups:
138
 
 
147
 
148
 
149
  def xy2phi(points_result, connections):
 
 
150
 
151
+ edge_groups = get_edge_groups(connections)
152
  new_array = np.zeros((points_result.shape[0], len(edge_groups), 1))
153
+
154
  for idx, frame in enumerate(points_result):
155
  all_angels = compute_all_angels(keypoints=frame, edge_groups=edge_groups)[:, 0]
156
  new_array[idx, :, :] = all_angels.reshape((len(edge_groups), 1))
 
161
  def get_series(point_list, edge_groups):
162
 
163
  list_of_series = []
 
164
  for edge_group in edge_groups:
165
+
166
  keypoint_1, keypoint_2, keypoint_3 = edge_group
167
  relevant_point_list = point_list[:, (keypoint_1, keypoint_2, keypoint_3), :]
168
 
169
  series = []
170
  for frame in relevant_point_list:
 
171
  angle, _ = calculate_angle(frame[0, :], frame[1, :], frame[2, :])
 
172
  series.append(angle)
173
  list_of_series.append(series)
174
 
 
176
 
177
 
178
  def plot_serieses(series_1, series_2):
179
+
180
  plt.figure(dpi=150, figsize=(12, 5))
181
+ plt.plot(series_1, label='Video #1', lw=1)
182
+ plt.plot(series_2, label='Video #2', lw=1)
183
  plt.axis("on")
184
  plt.grid(True)
 
185
  plt.xlabel("frames")
186
+ plt.ylabel("angles")
187
  plt.legend()
188
 
189
 
 
196
  return serieses_normalized
197
 
198
 
199
+ def get_dtw_mean_path(serieses_teacher, serieses_student, dtw_mean, dtw_filter):
200
+
201
+ list_of_paths = []
202
+ for idx in range(len(serieses_teacher)):
203
+ series_teacher = np.array(serieses_teacher[idx])
204
+ series_student = np.array(serieses_student[idx])
205
+ _ , paths = dtw.warping_paths(series_teacher, series_student, window=50)
206
+ path = dtw.best_path(paths)
207
+ list_of_paths.append(path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
209
+ all_dtw_tupples = []
210
+ for path in list_of_paths:
211
+ all_dtw_tupples.extend(path)
212
 
213
+ mean_path = []
214
+ for student_frame in range(len(serieses_student[0])):
215
+ frame_from_teacher = []
216
+ for frame_teacher in all_dtw_tupples:
217
+ if frame_teacher[1] == student_frame:
218
+ frame_from_teacher.append(frame_teacher[0])
219
 
220
+ mean_path.append((int(mstats.winsorize(np.array(frame_from_teacher), limits=[dtw_mean, dtw_mean]).mean()), student_frame))
 
 
 
 
 
 
221
 
222
+ path_array = np.array(mean_path)
223
+ smoothed_data = savgol_filter(path_array, window_length=dtw_filter, polyorder=0, axis=0)
224
+ path_array = np.array(smoothed_data).astype(int)
 
 
 
 
 
 
 
225
 
226
+ alignments = np.unique(path_array, axis=0) # TODO check if this correct
227
 
228
+ return alignments
229
 
230
 
231
  def modify_student_frame(
232
  detection_result_student,
 
233
  detection_result_teacher_angles,
234
  detection_result_student_angles,
 
235
  video_teacher,
236
  video_student,
 
237
  alignment_frames,
 
238
  edge_groups,
239
  connections,
240
  thresholds,
 
246
 
247
  frame_copy = video_student[alignment_frames[1]]
248
  frame_teacher_copy = video_teacher[alignment_frames[0]]
 
249
  frame_errors = np.abs(detection_result_teacher_angles[alignment_frames[0]] - detection_result_student_angles[alignment_frames[1]])
 
250
  edge_groups_as_keys = [tuple(group) for group in edge_groups]
251
  edge_groups2errors = dict(zip(edge_groups_as_keys, frame_errors))
 
252
  edge_groups2thresholds = dict(zip(edge_groups_as_keys, thresholds))
 
253
  edge_groups_relevant = [edge_group[1:] for edge_group in edge_groups]
254
 
255
  text_info = []
256
  trigered_connections = []
257
  trigered_connections2 = []
 
258
  for connection in connections:
259
 
 
260
  edges_for_given_connection = [edge for edge in edge_groups2errors if connection[0] in edge or connection[1] in edge]
261
 
 
262
  for edge in edges_for_given_connection:
263
 
 
 
 
264
  check_threshold = edge_groups2errors[edge] > edge_groups2thresholds[edge]
265
  check_certain = True
266
  for keypoint in edge:
 
270
 
271
  relevant_plane = [connection[0], connection[1]] in edge_groups_relevant or [connection[1], connection[0]] in edge_groups_relevant
272
 
 
273
  if check_threshold and check_certain and relevant_plane:
274
 
 
 
275
  point1 = detection_result_student[:, :, :-1][alignment_frames[1]][connection[0]]
276
  point2 = detection_result_student[:, :, :-1][alignment_frames[1]][connection[1]]
277
 
 
281
  point1 = [point1[1], point1[0]]
282
  point2 = [ point2[1], point2[0]]
283
 
284
+
285
+ if triger_state == "one":
286
+
287
+ _ = cv2.line(frame_copy, point1, point2, (0, 0, 255), 10)
288
+
289
+ if (connection[0], connection[1]) in text_dictionary:
290
+ text_info.append(text_dictionary[(connection[0], connection[1])])
291
+
292
+ if triger_state == "two":
293
+
294
+ trigered_connections.append((connection[0], connection[1]))
295
+
296
+ if (connection[0], connection[1]) in previously_trigered:
297
+
298
+ _ = cv2.line(frame_copy, point1, point2, (0, 0, 255), 10)
299
+
300
+ if (connection[0], connection[1]) in text_dictionary:
301
+ text_info.append(text_dictionary[(connection[0], connection[1])])
302
 
303
  if triger_state == "three":
304
 
 
314
 
315
  if (connection[0], connection[1]) in text_dictionary:
316
  text_info.append(text_dictionary[(connection[0], connection[1])])
 
 
 
 
 
 
 
 
 
 
 
317
 
318
  return frame_copy, frame_teacher_copy, list(set(trigered_connections)), list(set(trigered_connections2)), text_info
319
 
 
324
  while True:
325
  ret, frame = cap.read()
326
  if not ret:
327
+ print(f"Video {video_path} was loaded")
328
  break
329
+ frame = cv2.resize(frame, (1280, 720))
 
330
  video.append(frame)
331
 
332
  return np.array(video)
 
339
  for chunk in response.iter_content(chunk_size=8192):
340
  file.write(chunk)
341
 
342
+
343
  def check_and_download_models():
344
+
345
+ # vit_model_s_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/torch/wholebody/vitpose-s-wholebody.pth?download=true"
346
+ vit_model_b_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/torch/wholebody/vitpose-b-wholebody.pth?download=true"
347
+ # vit_model_l_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/torch/wholebody/vitpose-l-wholebody.pth?download=true"
348
 
 
349
  yolo_model_url = "https://huggingface.co/JunkyByte/easy_ViTPose/resolve/main/yolov8/yolov8s.pt?download=true"
350
 
351
+ # vit_model_s_path = "models/vitpose-s-wholebody.pth"
352
+ vit_model_b_path = "models/vitpose-b-wholebody.pth"
353
+ # vit_model_l_path = "models/vitpose-l-wholebody.pth"
354
 
355
  yolo_model_path = "models/yolov8s.pt"
356
 
357
+ # Path(os.path.dirname(vit_model_s_path)).mkdir(parents=True, exist_ok=True)
358
+ Path(os.path.dirname(vit_model_b_path)).mkdir(parents=True, exist_ok=True)
359
+ # Path(os.path.dirname(vit_model_l_path)).mkdir(parents=True, exist_ok=True)
360
 
 
361
  Path(os.path.dirname(yolo_model_path)).mkdir(parents=True, exist_ok=True)
362
 
363
+ # if not os.path.exists(vit_model_s_path):
364
+ # print("Downloading ViT-Pose-s model...")
365
+ # download_file(vit_model_s_url, vit_model_s_path)
366
+ # print("ViT-Pose-s model was downloaded.")
367
+
368
+ if not os.path.exists(vit_model_b_path):
369
+ print("Downloading ViT-Pose-b model...")
370
+ download_file(vit_model_b_url, vit_model_b_path)
371
+ print("ViT-Pose-b model was downloaded.")
372
+
373
+ # if not os.path.exists(vit_model_l_path):
374
+ # print("Downloading ViT-Pose-l model...")
375
+ # download_file(vit_model_l_url, vit_model_l_path)
376
+ # print("ViT-Pose-l model was downloaded.")
377
 
 
378
  if not os.path.exists(yolo_model_path):
379
  print("Downloading YOLO model...")
380
+ download_file(yolo_model_url, yolo_model_path)
381
+ print("YOLO model was downloaded.")
382
+
383
+
384
+ def generate_output_video(teacher_frames, student_frames, timestamp_str):
385
+
386
+ teacher_frames = np.array(teacher_frames)
387
+ student_frames = np.array(student_frames)
388
+
389
+ teacher_frames_resized = np.array([cv2.resize(frame, (1280, 720)) for frame in teacher_frames])
390
+ student_frames_resized = np.array([cv2.resize(frame, (1280, 720)) for frame in student_frames])
391
+
392
+ concat_video = np.concatenate((teacher_frames_resized, student_frames_resized), axis=2)
393
+ concat_video = np.array(concat_video)
394
+
395
+ root_dir = "videos"
396
+ if not os.path.exists(root_dir):
397
+ os.makedirs(root_dir)
398
+
399
+ video_path = f"{root_dir}/pose_{timestamp_str}.mp4"
400
+ out = cv2.VideoWriter(video_path, cv2.VideoWriter_fourcc(*'mp4v'), 30, (1280 * 2, 720))
401
+ for frame in concat_video:
402
+ out.write(frame)
403
+ out.release()
404
+
405
+ return video_path
406
+
407
+
408
+ def generate_log(all_text_summaries):
409
+
410
+ all_text_summaries_clean = list(set(all_text_summaries))
411
+ all_text_summaries_clean.sort(key=lambda x: x[1])
412
+
413
+ general_summary = []
414
+ for log in all_text_summaries_clean:
415
+ comment, frame = log
416
+ total_seconds = frame / 30
417
+ general_summary.append(f"{comment}. Video time: {str(timedelta(seconds=total_seconds))[3:-4]}")
418
+
419
+ general_summary = "\n".join(general_summary)
420
+
421
+ return general_summary
422
+
423
+
424
+ def write_log(
425
+ timestamp_str,
426
+ dtw_mean,
427
+ dtw_filter,
428
+ angles_sensitive,
429
+ angles_common,
430
+ angles_insensitive,
431
+ trigger_state,
432
+ general_summary
433
+ ):
434
+
435
+ logs_dir = "logs"
436
+ if not os.path.exists(logs_dir):
437
+ os.makedirs(logs_dir)
438
+
439
+ log_path = f"{logs_dir}/log_{timestamp_str}.txt"
440
+
441
+ content = f"""
442
+ Settings:
443
+
444
+ Dynamic Time Warping:
445
+ - Winsorize mean: {dtw_mean}
446
+ - Savitzky-Golay Filter: {dtw_filter}
447
+
448
+ Thresholds:
449
+ - Sensitive: {angles_sensitive}
450
+ - Standart: {angles_common}
451
+ - Insensitive: {angles_insensitive}
452
+
453
+ Patience:
454
+ - trigger count: {trigger_state}
455
+
456
+
457
+ Error logs:
458
+
459
+ {general_summary}
460
+ """
461
+
462
+ with open(log_path, "w") as file:
463
+ file.write(content)
464
+
465
+ print(f"log {log_path} was created.")
466
+
467
+ return log_path