[partial train] only training branches: ['arms', 'hands', 'jump_squat', 'locomotion', 'poses'] [base model] loaded 8 branches from model_jump_squat_squat_fast_rise_w10_cuda.pth: ['locomotion', 'jump_squat', 'arms', 'hands', 'seals', 'head', 'torso', 'poses'] Loading data from dataset\clip_data_back_v1_curated_20260610 … [partial load] loading 37 classes, skipping 13: ['bellyseal', 'chestseal', 'headdown', 'headseal', 'headup', 'lhandseal', 'lheadturn', 'llean', 'lshoulderturn', 'rhandseal', 'rheadturn', 'rlean', 'rshoulderturn'] calibration: 37 clips matched to noaction, 1009 clips using own frame-0 fallback classes : ['bellyseal', 'bothhandgesture', 'chestseal', 'fastwalk', 'headdown', 'headseal', 'headup', 'highknee', 'jump', 'jump_back', 'larmchop', 'larmlowside', 'lbkstep', 'lbkstep_back', 'lfwdstride', 'lfwdstride_back', 'lhandchest', 'lhandgesture', 'lhandseal', 'lheadturn', 'llean', 'lowrun', 'lshoulderturn', 'lstride', 'lstride_back', 'multichop', 'noaction', 'pickup', 'rarmchop', 'rarmlowside', 'rbkstep', 'rbkstep_back', 'rfwdstride', 'rfwdstride_back', 'rhandchest', 'rhandgesture', 'rhandseal', 'rheadturn', 'rlean', 'rshoulderturn', 'rstride', 'rstride_back', 'run', 'squat', 'squat_back', 'tpose', 'tpose_back', 'walk', 'ypose', 'ypose_back'] files : 1017 | windows: 49231 train files=932 test files=85 device : cuda run dir : C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda model : multi-branch ensemble (['locomotion', 'jump_squat', 'arms', 'hands', 'seals', 'head', 'torso', 'poses']) [build_samples] remapped→noaction: 20705 kept=20705 (action_windows=23204, ratio=1) dropped: 0 [build_samples] remapped→noaction: 1988 dropped: 0 ── Branch [locomotion] keypoints=['left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle', 'left_heel', 'right_heel', 'left_foot_index', 'right_foot_index'] classes=['walk', 'fastwalk', 'run', 'lowrun', 'lstride', 'lstride_back', 'rstride', 'rstride_back', 'lfwdstride', 'lfwdstride_back', 'rfwdstride', 'rfwdstride_back', 'lbkstep', 'lbkstep_back', 'rbkstep', 'rbkstep_back', 'highknee', 'noaction'] train=45208 test=4023 [locomotion] training settings: batch=96, lr=0.001, weight_decay=0.0001, label_smoothing=0.05, class_weight_mode=inverse, augment=True [locomotion] class weights: walk 0.68 fastwalk 5.41 run 0.65 lowrun 3.84 lstride 2.11 lstride_back 2.68 rstride 1.93 rstride_back 4.08 lfwdstride 2.21 lfwdstride_back 3.92 rfwdstride 2.20 rfwdstride_back 7.02 lbkstep 2.08 lbkstep_back 5.23 rbkstep 2.33 rbkstep_back 4.26 highknee 0.65 noaction 0.11 [locomotion] select metric: macro_f1 [locomotion] epoch 1/35 loss=1.9875 test_acc=0.3791 macro_f1=0.3785 weighted_f1=0.4203 select=0.3785 [locomotion] epoch 10/35 loss=1.2763 test_acc=0.6030 macro_f1=0.5282 weighted_f1=0.6425 select=0.5282 [locomotion] epoch 20/35 loss=1.1639 test_acc=0.7375 macro_f1=0.6295 weighted_f1=0.7441 select=0.6295 [locomotion] epoch 30/35 loss=1.1183 test_acc=0.7102 macro_f1=0.6275 weighted_f1=0.7351 select=0.6275 [locomotion] Best selected metric (macro_f1): 0.6421 @ epoch 25 acc=0.7298 [locomotion] Per-class test accuracy: walk 153/ 413 37.05% fastwalk 4/ 86 4.65% run 170/ 216 78.70% lowrun 91/ 109 83.49% lstride 32/ 48 66.67% lstride_back 62/ 62 100.00% rstride 62/ 83 74.70% rstride_back 51/ 51 100.00% lfwdstride 46/ 77 59.74% lfwdstride_back 33/ 40 82.50% rfwdstride 88/ 96 91.67% rfwdstride_back 43/ 51 84.31% lbkstep 68/ 77 88.31% lbkstep_back 2/ 2 100.00% rbkstep 56/ 122 45.90% rbkstep_back 37/ 37 100.00% highknee 181/ 242 74.79% noaction 1757/2211 79.47% [locomotion] Classification metrics: class prec recall f1 supp sw_rate sw# n_clip perfect ------------------------------------------------------------------------------ walk 0.845 0.370 0.515 413 0.058 8.00 3 0 fastwalk 0.085 0.047 0.060 86 0.106 9.00 1 0 run 0.756 0.787 0.771 216 0.047 5.00 2 0 lowrun 0.843 0.835 0.839 109 0.037 4.00 1 0 lstride 0.166 0.667 0.266 48 0.039 0.67 3 1 lstride_back 1.000 1.000 1.000 62 0.000 0.00 3 3 rstride 0.805 0.747 0.775 83 0.068 1.33 3 0 rstride_back 1.000 1.000 1.000 51 0.000 0.00 3 3 lfwdstride 0.177 0.597 0.273 77 0.160 6.00 2 0 lfwdstride_back 1.000 0.825 0.904 40 0.019 0.50 2 1 rfwdstride 0.391 0.917 0.548 96 0.041 2.00 2 1 rfwdstride_back 1.000 0.843 0.915 51 0.050 1.00 2 1 lbkstep 0.591 0.883 0.708 77 0.087 2.00 2 1 lbkstep_back 0.071 1.000 0.133 2 0.000 0.00 1 1 rbkstep 0.862 0.459 0.599 122 0.080 6.00 2 0 rbkstep_back 0.712 1.000 0.831 37 0.000 0.00 2 2 highknee 0.439 0.748 0.554 242 0.029 3.50 2 0 noaction 0.952 0.795 0.866 2211 0.037 1.84 49 24 accuracy 0.730 macro 0.650 0.751 0.642 weighted 0.828 0.730 0.753 [locomotion] Label smoothness (per clip): clips evaluated : 85 (mean len 47.3 windows) mean switches : 2.18 mean switch rate: 0.041 (0 = no flipping, 1 = flip every frame) perfectly stable clips: 38 / 85 [locomotion] Confusion matrix → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\confusion_locomotion.png [build_samples] remapped→noaction: 41171 kept=2738 (action_windows=2738, ratio=1) dropped: 0 [build_samples] remapped→noaction: 3465 dropped: 0 ── Branch [jump_squat] keypoints=['left_shoulder', 'right_shoulder', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle', 'left_heel', 'right_heel', 'left_foot_index', 'right_foot_index'] classes=['jump', 'jump_back', 'squat', 'squat_back', 'noaction'] train=6775 test=4023 [jump_squat] training settings: batch=96, lr=0.001, weight_decay=0.0001, label_smoothing=0.05, class_weight_mode=inverse, augment=True [jump_squat] class weights: jump 1.18 jump_back 3.34 squat 4.84 squat_back 1.50 noaction 0.34 [jump_squat] select metric: macro_f1 [jump_squat] epoch 1/35 loss=1.0462 test_acc=0.8459 macro_f1=0.4195 weighted_f1=0.8664 select=0.4195 [jump_squat] epoch 10/35 loss=0.5983 test_acc=0.7857 macro_f1=0.4877 weighted_f1=0.8498 select=0.4877 [jump_squat] epoch 20/35 loss=0.5445 test_acc=0.8620 macro_f1=0.6241 weighted_f1=0.8965 select=0.6241 [jump_squat] epoch 30/35 loss=0.5208 test_acc=0.9182 macro_f1=0.7559 weighted_f1=0.9312 select=0.7559 [jump_squat] Best selected metric (macro_f1): 0.7943 @ epoch 26 acc=0.9354 [jump_squat] Per-class test accuracy: jump 135/ 166 81.33% jump_back 58/ 61 95.08% squat 11/ 11 100.00% squat_back 97/ 97 100.00% noaction 3462/3688 93.87% [jump_squat] Classification metrics: class prec recall f1 supp sw_rate sw# n_clip perfect ------------------------------------------------------------------------------ jump 0.429 0.813 0.561 166 0.058 3.00 3 1 jump_back 0.716 0.951 0.817 61 0.013 0.33 3 2 squat 0.550 1.000 0.710 11 0.000 0.00 3 3 squat_back 0.851 1.000 0.919 97 0.000 0.00 4 4 noaction 0.991 0.939 0.964 3688 0.012 0.69 72 53 accuracy 0.935 macro 0.707 0.941 0.794 weighted 0.959 0.935 0.944 [jump_squat] Label smoothness (per clip): clips evaluated : 85 (mean len 47.3 windows) mean switches : 0.71 mean switch rate: 0.012 (0 = no flipping, 1 = flip every frame) perfectly stable clips: 63 / 85 [jump_squat] Confusion matrix → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\confusion_jump_squat.png [build_samples] remapped→noaction: 34332 kept=9577 (action_windows=9577, ratio=1) dropped: 0 [build_samples] remapped→noaction: 2940 dropped: 0 ── Branch [arms] keypoints=['left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_pinky', 'right_pinky', 'left_index', 'right_index', 'left_thumb', 'right_thumb'] classes=['larmchop', 'rarmchop', 'multichop', 'larmlowside', 'rarmlowside', 'noaction'] train=20453 test=4023 [arms] training settings: batch=96, lr=0.001, weight_decay=0.0001, label_smoothing=0.05, class_weight_mode=inverse, augment=True [arms] class weights: larmchop 2.46 rarmchop 2.22 multichop 1.00 larmlowside 2.07 rarmlowside 2.15 noaction 0.31 [arms] select metric: macro_f1 [arms] epoch 1/35 loss=1.0829 test_acc=0.4919 macro_f1=0.5031 weighted_f1=0.5718 select=0.5031 [arms] epoch 10/35 loss=0.6931 test_acc=0.8484 macro_f1=0.7428 weighted_f1=0.8715 select=0.7428 [arms] epoch 20/35 loss=0.6171 test_acc=0.8541 macro_f1=0.7129 weighted_f1=0.8725 select=0.7129 [arms] epoch 30/35 loss=0.5746 test_acc=0.8633 macro_f1=0.7430 weighted_f1=0.8790 select=0.7430 [arms] Best selected metric (macro_f1): 0.7892 @ epoch 28 acc=0.9075 [arms] Per-class test accuracy: larmchop 116/ 128 90.62% rarmchop 114/ 157 72.61% multichop 306/ 379 80.74% larmlowside 83/ 83 100.00% rarmlowside 105/ 113 92.92% noaction 2927/3163 92.54% [arms] Classification metrics: class prec recall f1 supp sw_rate sw# n_clip perfect ------------------------------------------------------------------------------ larmchop 0.655 0.906 0.761 128 0.013 0.67 3 2 rarmchop 0.437 0.726 0.545 157 0.044 2.33 3 0 multichop 0.867 0.807 0.836 379 0.032 3.25 4 0 larmlowside 0.741 1.000 0.851 83 0.000 0.00 2 2 rarmlowside 0.682 0.929 0.787 113 0.029 1.50 2 0 noaction 0.987 0.925 0.955 3163 0.014 0.62 71 50 accuracy 0.908 macro 0.728 0.882 0.789 weighted 0.930 0.908 0.915 [arms] Label smoothness (per clip): clips evaluated : 85 (mean len 47.3 windows) mean switches : 0.81 mean switch rate: 0.016 (0 = no flipping, 1 = flip every frame) perfectly stable clips: 54 / 85 [arms] Confusion matrix → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\confusion_arms.png [build_samples] remapped→noaction: 37741 kept=6168 (action_windows=6168, ratio=1) dropped: 0 [build_samples] remapped→noaction: 3231 dropped: 0 ── Branch [hands] keypoints=['left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_pinky', 'right_pinky', 'left_index', 'right_index', 'left_thumb', 'right_thumb'] classes=['lhandgesture', 'rhandgesture', 'bothhandgesture', 'lhandchest', 'rhandchest', 'pickup', 'noaction'] train=13635 test=4023 [hands] training settings: batch=96, lr=0.001, weight_decay=0.0001, label_smoothing=0.05, class_weight_mode=inverse, augment=True [hands] class weights: lhandgesture 13.25 rhandgesture 10.94 bothhandgesture 9.99 lhandchest 1.44 rhandchest 0.96 pickup 0.86 noaction 0.26 [hands] select metric: macro_f1 [hands] epoch 1/35 loss=1.6970 test_acc=0.3659 macro_f1=0.3179 weighted_f1=0.4572 select=0.3179 [hands] epoch 10/35 loss=1.2178 test_acc=0.7517 macro_f1=0.5221 weighted_f1=0.8032 select=0.5221 [hands] epoch 20/35 loss=1.1389 test_acc=0.8305 macro_f1=0.5640 weighted_f1=0.8588 select=0.5640 [hands] epoch 30/35 loss=1.1133 test_acc=0.7671 macro_f1=0.5215 weighted_f1=0.8108 select=0.5215 [hands] Best selected metric (macro_f1): 0.5987 @ epoch 35 acc=0.8479 [hands] Per-class test accuracy: lhandgesture 40/ 40 100.00% rhandgesture 42/ 45 93.33% bothhandgesture 59/ 65 90.77% lhandchest 39/ 98 39.80% rhandchest 143/ 145 98.62% pickup 127/ 176 72.16% noaction 2961/3454 85.73% [hands] Classification metrics: class prec recall f1 supp sw_rate sw# n_clip perfect ------------------------------------------------------------------------------ lhandgesture 0.215 1.000 0.354 40 0.000 0.00 1 1 rhandgesture 0.300 0.933 0.454 45 0.023 1.00 1 0 bothhandgesture 0.513 0.908 0.656 65 0.016 1.00 1 0 lhandchest 0.487 0.398 0.438 98 0.009 0.50 2 1 rhandchest 0.769 0.986 0.864 145 0.007 0.33 3 2 pickup 0.390 0.722 0.506 176 0.029 2.50 2 0 noaction 0.990 0.857 0.919 3454 0.040 1.43 75 47 accuracy 0.848 macro 0.523 0.829 0.599 weighted 0.921 0.848 0.872 [hands] Label smoothness (per clip): clips evaluated : 85 (mean len 47.3 windows) mean switches : 1.36 mean switch rate: 0.037 (0 = no flipping, 1 = flip every frame) perfectly stable clips: 51 / 85 [hands] Confusion matrix → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\confusion_hands.png ── Branch [seals] [INHERITED from base model, acc=0.9506] ── Branch [head] [INHERITED from base model, acc=0.9339] ── Branch [torso] [INHERITED from base model, acc=0.9731] [build_samples] remapped→noaction: 41687 kept=2222 (action_windows=2222, ratio=1) dropped: 0 [build_samples] remapped→noaction: 3576 dropped: 0 ── Branch [poses] keypoints=['nose', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle'] classes=['tpose', 'tpose_back', 'ypose', 'ypose_back', 'noaction'] train=5743 test=4023 [poses] training settings: batch=96, lr=0.001, weight_decay=0.0001, label_smoothing=0.05, class_weight_mode=inverse, augment=True [poses] class weights: tpose 1.52 tpose_back 3.84 ypose 1.11 ypose_back 8.64 noaction 0.33 [poses] select metric: macro_f1 [poses] epoch 1/35 loss=0.9267 test_acc=0.8996 macro_f1=0.5665 weighted_f1=0.9269 select=0.5665 [poses] epoch 10/35 loss=0.5963 test_acc=0.8941 macro_f1=0.7469 weighted_f1=0.9249 select=0.7469 [poses] epoch 20/35 loss=0.5634 test_acc=0.9413 macro_f1=0.7813 weighted_f1=0.9506 select=0.7813 [poses] epoch 30/35 loss=0.5584 test_acc=0.9669 macro_f1=0.8223 weighted_f1=0.9674 select=0.8223 [poses] Best selected metric (macro_f1): 0.8565 @ epoch 15 acc=0.9804 [poses] Per-class test accuracy: tpose 38/ 102 37.25% tpose_back 17/ 17 100.00% ypose 83/ 89 93.26% ypose_back 16/ 16 100.00% noaction 3790/3799 99.76% [poses] Classification metrics: class prec recall f1 supp sw_rate sw# n_clip perfect ------------------------------------------------------------------------------ tpose 1.000 0.373 0.543 102 0.009 0.67 3 2 tpose_back 1.000 1.000 1.000 17 0.000 0.00 2 2 ypose 0.664 0.933 0.776 89 0.024 1.00 2 0 ypose_back 0.941 1.000 0.970 16 0.000 0.00 2 2 noaction 0.991 0.998 0.994 3799 0.001 0.09 76 74 accuracy 0.980 macro 0.919 0.861 0.856 weighted 0.983 0.980 0.978 [poses] Label smoothness (per clip): clips evaluated : 85 (mean len 47.3 windows) mean switches : 0.13 mean switch rate: 0.002 (0 = no flipping, 1 = flip every frame) perfectly stable clips: 80 / 85 [poses] Confusion matrix → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\confusion_poses.png Multi-branch model saved → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\model_curated_v1_multihead_w10_cuda.pth locomotion acc=0.7298 classes=['walk', 'fastwalk', 'run', 'lowrun', 'lstride', 'lstride_back', 'rstride', 'rstride_back', 'lfwdstride', 'lfwdstride_back', 'rfwdstride', 'rfwdstride_back', 'lbkstep', 'lbkstep_back', 'rbkstep', 'rbkstep_back', 'highknee', 'noaction'] jump_squat acc=0.9354 classes=['jump', 'jump_back', 'squat', 'squat_back', 'noaction'] arms acc=0.9075 classes=['larmchop', 'rarmchop', 'multichop', 'larmlowside', 'rarmlowside', 'noaction'] hands acc=0.8479 classes=['lhandgesture', 'rhandgesture', 'bothhandgesture', 'lhandchest', 'rhandchest', 'pickup', 'noaction'] seals acc=0.9506 classes=['lhandseal', 'rhandseal', 'headseal', 'chestseal', 'bellyseal', 'noaction'] head acc=0.9339 classes=['headdown', 'headup', 'lheadturn', 'rheadturn', 'noaction'] torso acc=0.9731 classes=['llean', 'rlean', 'lshoulderturn', 'rshoulderturn', 'noaction'] poses acc=0.9804 classes=['tpose', 'tpose_back', 'ypose', 'ypose_back', 'noaction'] Branch config saved → C:\Workspace\ActionLinkPerception\runs\20260610_curated_v1_multihead_w10_cuda\model_curated_v1_multihead_w10_cuda.json