Method and results
Three lines: four video classifiers fine-tuned on HMDB51 and evaluated on ordered and frame-permuted clips over three splits, behind a gate that must reject a shuffled-label control. The shuffle gap separates the 3D convnets (10.8 to 16.7 points) from the transformer (2.2 to 5.0) on every split. The export path found one model that quantises losslessly and one that collapses, and the collapse is explained by the activation statistics of a single tensor.
Protocol
- Data. Official HMDB51 archive and the official three splits. Decoded once to 16 uniformly sampled frames at short side 256 into a memory-mapped array with a manifest; each model crops to its native input at train time. Contamination check: identical decoded frame 0 and frame 8 across train and test found two duplicate clips (one each in splits 1 and 2); test copies dropped.1
- Models. ImageNet ResNet-18 with per-frame logits averaged (11.2 M parameters, the control: frame-order invariant by construction); S3D (8.0 M); R(2+1)D-18 (31.3 M, 112 px); Swin3D-T (27.9 M); the 3D models from Kinetics-400 weights. Full fine-tune, new 51-way head, AdamW, cosine schedule, bf16, 30 epochs, batch 32. The test split doubles as validation; no third split exists.
- Instrument. Shuffle gap = top-1 on ordered frames − top-1 on the same clips with a fixed, seeded permutation of their 16 frames. The seed-pair noise floor (absolute top-1 difference between seeds) is measured before any gap is read; a gap under twice the floor is reported as “within noise”.
- Gate. Before any result is read: a control trained on labels permuted across clips must score at chance (≤ 3 × 1/51) and the control itself must reach ≥ 5 × chance. Labels are permuted across clips, not renamed per class: a consistent renaming is learnable and the control could not fail.
- Provenance. Each phase is a systemd-sandboxed unit launched by a per-host runner under a Temporal workflow that holds one GPU lease across the GPU phases. A unit writes metrics before its done marker; a rejected gate exits with metrics and no marker; a stamp is single-use.
Results: appearance versus motion
Split 1, 30 epochs, two seeds. Gate 0 at 10 epochs: permuted-label controls 1.9 / 2.2 % (chance 1.96 %); single middle frame 44 %; temporal noise floor 2.3 points.
| Model | Top-1 ordered (s1 / s2) | Top-1 permuted | Gap | Seed spread | ECE |
|---|---|---|---|---|---|
| 2D control | 48.1 / 49.7 | identical | 0.0 (by construction) | 1.6 | 0.12 / 0.14 |
| S3D | 66.0 / 66.0 | 52.8 / 53.0 | 13.0 | 0.0 | 0.19 |
| R(2+1)D-18 | 70.6 / 70.3 | 54.0 / 54.1 | 16.5 | 0.3 | 0.10 |
| Swin3D-T | 74.0 / 72.5 | 69.0 / 69.7 | 3.9 | 1.5 | 0.072 |
Across splits (S3D and Swin3D-T, two seeds each):
| Model | Split | Top-1 ordered (s1 / s2) | Top-1 permuted | Gap |
|---|---|---|---|---|
| S3D | 2 | 61.9 / 63.2 | 51.1 / 51.3 | 10.9 / 12.0 |
| S3D | 3 | 65.4 / 65.9 | 54.6 / 54.1 | 10.8 / 11.8 |
| Swin3D-T | 2 | 70.5 / 71.7 | 66.7 / 68.1 | 3.8 / 3.5 |
| Swin3D-T | 3 | 69.5 / 70.5 | 67.3 / 67.8 | 2.2 / 2.73 |
Reading. The 2D ceiling is 48 to 50 %. Every 3D model with permuted frames falls to 51 to 54 %, just above the control, which bounds what the backdrop is worth. Over twelve cells (three splits, two seeds, two models) the S3D gap lies in 10.8 to 13.2 and the Swin3D-T gap in 2.2 to 5.0; the transformer’s advantage on ordered clips is therefore mostly appearance modelling. It is also the best calibrated on every split (ECE 0.04 to 0.07 against 0.14 to 0.19 for S3D).
Results: frame count
R(2+1)D-18 (S3D’s pretrained weights need at least 14 frames), split 1, two seeds, the 16 decoded frames uniformly subsampled for training and every evaluation view:
| Frames per clip | Top-1 ordered (s1 / s2) | Top-1 permuted | Gap | Gate 0 verdict |
|---|---|---|---|---|
| 16 | 70.6 / 70.3 | 54.0 / 54.1 | 16.7 / 16.2 | motion above noise |
| 8 | 61.5 / 61.0 | 54.0 / 57.4 | 7.5 / 3.5 | motion above noise |
| 4 | 50.0 / 52.2 | 49.2 / 50.4 | 0.9 / 1.8 | within noise (floor 2.5)3 |
At four frames the model converges on the 2D control’s 48 to 50 % and its gap falls inside the seed-pair noise floor; the gate’s own verdict flips to “appearance-solvable” for that configuration. The permuted-frame accuracy is flat across the three settings (49 to 57 %), which is the backdrop term; the ordered accuracy is what the frames buy.
Results: edge cost
Batch-one p50 latency on the training card (a datacenter proxy shared with two other workloads; ONNX Runtime and TensorRT rows include host copies inside the timed call; “fp32” may execute in TF32; power is whole-card):
| Model | torch fp32 | torch fp16 | ORT CUDA fp32 | TRT FP16 | TRT INT8 | INT8 top-1 vs fp32 |
|---|---|---|---|---|---|---|
| 2D control | 1.02 ms | 0.63 ms | 2.14 ms | 0.94 ms | 0.81 ms | 48.2 → 48.3 |
| R(2+1)D-18 | 2.65 ms | 1.89 ms | 2.89 ms | 0.96 ms | 0.77 ms | 70.3 → 70.6 |
| S3D | 1.88 ms | 2.14 ms | 3.09 ms | 1.08 ms | 1.14 ms | 66.1 → 1.72 |
R(2+1)D-18 INT8 (entropy calibration, 192 clips) is 3.4 × fp32 at batch one and 4.5 × in batch-32 throughput with no loss. The 2D model is fastest in plain torch fp16; engine overhead dominates at that size.
The S3D INT8 collapse: mechanism
Per-layer ablation (512-clip subset, fp32 reference 67.4 %): global changes fail (MinMax calibration 2.2 %, 640 calibration clips 1.8 %, FP16 fallback 1.2 %, pooling / concatenation / last-8-layers in fp32 0.8 to 2.9 %); keeping any one of the first three layers in fp32 restores about 68 %; no later single layer helps. The tensor between those layers is the stem’s first activation (64 channels × 16 × 112²).4
Its statistics over 192 calibration clips (2.5 × 10⁹ values, reservoir percentiles):
| Statistic | Value |
|---|---|
| per-tensor absmax (sets the INT8 scale) | 45.9 |
| one INT8 step at that scale | 0.36 |
| median absolute activation | 0.46 |
| p90 / p99 / p99.9 | 2.5 / 6.1 / 13.6 |
| per-channel absmax, min to max | 0.77 to 45.9 (60 ×)3 |
Half of the tensor’s values lie within about one quantisation step of zero at any per-tensor scale that retains the tails, and the per-channel ranges span 60 ×. TensorRT quantises activations per tensor, so no calibrator can serve both the bulk and the tails, and the error compounds through the 174 downstream layers; those layers do not show the spread and quantise cleanly. Fix: the first convolution in fp32 through precision constraints (about 2 % of FLOPs). Citable run:
| S3D engine | Top-1 | Batch-1 p50 | Throughput b32 |
|---|---|---|---|
| torch fp32 | 66.3 % | 1.88 ms | 796 clips/s |
| TRT FP16 | 66.3 % | 1.08 ms | 1,290 clips/s |
| TRT INT8 naive | 2.0 % | 1.15 ms | 1,298 clips/s |
| TRT INT8, first conv fp32, entropy | 66.1 % | 1.22 ms | 1,138 clips/s |
| TRT INT8, first conv fp32, MinMax | 65.7 % | 1.22 ms | 1,136 clips/s3 |
Both calibrators recover once the layer is pinned, which is consistent with the mechanism being distributional rather than a threshold choice. The repaired INT8 engine is slower than FP16 for this model, so the deployment recommendation for S3D is FP16.
Results: test-time robustness
Checkpoints retrained on split 1 (one seed), then evaluated on the full test split under degradations applied at evaluation time only: darkening (x → x^γ), spatial Gaussian blur, H.264 re-encode at a target bitrate (achieved 572 and 185 kbps at 340 × 256), and frame hold (every k-th frame repeated k times, the 16-frame length kept). Each level is scored on ordered and permuted frames so a gap is reported per level. Top-1 / permuted / gap:
| Level | 2D control | R(2+1)D-18 | S3D | Swin3D-T |
|---|---|---|---|---|
| clean | 48.2 / 48.2 / 0.0 | 70.6 / 54.0 / 16.7 | 65.5 / 51.4 / 14.1 | 74.0 / 69.0 / 5.0 |
| γ = 1.5 | 44.3 / 44.3 / 0.0 | 69.1 / 53.2 / 16.0 | 66.3 / 51.1 / 15.2 | 72.6 / 68.7 / 3.9 |
| γ = 2.5 | 37.3 / 37.3 / 0.0 | 65.9 / 48.1 / 17.8 | 60.2 / 46.7 / 13.5 | 66.4 / 62.9 / 3.6 |
| γ = 4.0 | 22.1 / 22.1 / 0.0 | 55.7 / 38.6 / 17.1 | 49.3 / 34.9 / 14.4 | 54.9 / 50.8 / 4.1 |
| blur 3 px | 45.5 / 45.5 / 0.0 | 70.8 / 53.1 / 17.7 | 64.0 / 51.2 / 12.8 | 72.5 / 68.2 / 4.3 |
| blur 7 px | 34.7 / 34.7 / 0.0 | 65.5 / 47.9 / 17.5 | 57.6 / 42.1 / 15.6 | 66.0 / 60.7 / 5.3 |
| blur 15 px | 19.0 / 19.0 / 0.0 | 40.1 / 31.7 / 8.4 | 33.4 / 22.2 / 11.2 | 53.0 / 45.4 / 7.6 |
| 572 kbps | 45.4 / 45.4 / 0.0 | 70.1 / 53.6 / 16.5 | 63.9 / 50.7 / 13.2 | 72.1 / 68.4 / 3.7 |
| 185 kbps | 34.8 / 34.8 / 0.0 | 66.8 / 48.5 / 18.4 | 58.5 / 45.0 / 13.5 | 67.2 / 62.5 / 4.6 |
| frame hold × 2 | 48.0 / 48.0 / 0.0 | 62.9 / 52.2 / 10.7 | 64.0 / 50.3 / 13.7 | 64.6 / 68.0 / −3.3 |
| frame hold × 4 | 46.6 / 46.6 / 0.0 | 45.1 / 47.2 / −2.1 | 46.4 / 45.5 / 0.9 | 59.7 / 64.6 / −4.85 |
Reading. Darkening, blur and compression cost the per-frame control up to 29 points, while the convnets’ gaps stay within 13 to 18 points through every level except 15-pixel blur, where R(2+1)D-18’s gap halves: the motion signal survives appearance degradation that the backdrop does not. Frame hold inverts this: the control loses under 2 points at a quarter of the frame rate, the convnets lose 19 to 25 and fall to their permuted scores, and Swin3D-T’s gap turns negative at half rate (ordered-but-held frames score below permuted ones). Models trained at the full rate treat held frames as out-of-distribution motion. In absolute terms Swin3D-T is the most robust to every appearance degradation, consistent with reading larger-scale appearance.
Results: induced long tail
Training split resampled to Zipf(α = 1), 413 of 3,570 clips; S3D; two seeds. Head = the ten largest classes; tail = the 41 classes with ≤ 10 clips.
| Remedy | Top-1 | Tail recall | Head recall |
|---|---|---|---|
| none | 28.4 % | 0.244 | 0.450 |
| class-balanced sampling | 33.5 % | 0.291 | 0.517 |
| logit-adjusted loss (τ = 1) | 34.8 % | 0.334 | 0.4051 |
The first run of this table used the inverted sign (13.6 %, tail 0.078); it is kept as a negative result on the losses page.
Limitations
Two to three seeds (one for the robustness checkpoints); one dataset; clip-level evaluation only (16, 8 and 4 frames); degradations synthetic, not captured; a shared datacenter card as the edge proxy; no per-channel activation quantisation or QAT attempted for S3D; no robustness or anonymisation runs. The scene-bias framing follows the literature on the reading page.
Cost
About seventeen GPU-hours in total across all runs, two of them the one-off decode. The largest single unit was one Swin3D-T seed at 30 epochs, twice the wall time and about four and a half times the memory of the convnets.3
Sources
Numbers on this page are quoted from the lab's own records. The records are private; each note gives the record's date.