```yaml

## title: "TransRAC: Encoding Multi-Scale Temporal Correlation with Transformers for Repetitive Action Counting" title_ru: "TransRAC: кодирование multi-scale темпоральной корреляции через Трансформеры для подсчёта повторных действий" short_name: "TransRAC" authors: [Hu H., Dong S., Zhao Y., Lian D., Li Z., Gao S.] year: 2022 venue: "CVPR (Oral)" venue_tier: "A*" doi: "https://openaccess.thecvf.com/content/CVPR2022/papers/Hu_TransRAC_Encoding_Multi-Scale_Temporal_Correlation_With_Transformers_for_Repetitive_Action_CVPR_2022_paper.pdf" arxiv: "https://arxiv.org/abs/2204.01018" code: "https://github.com/SvipRepetitionCounting/TransRAC" project_page: "https://svip-lab.github.io/dataset/RepCount_dataset.html" paper_type: "task_utility" task_subtype: "rep_counting" direct_ancestor: "RepNet" tags: [rep_counting, density_map, video_modality, transformer, multi_scale_processing, period_estimation] relevance_to_smartrep: 4 direction: "🅰 (preprocessing/utility)" pipeline_role: "dataset_construction_tool, distillation_teacher, reference_baseline" status: "reviewed"

````


# TransRAC (Hu et al., CVPR 2022 Oral) — литобзор для SmartRep

## 2. Core Contribution (TL;DR) + Delta over Ancestor

TransRAC — supervised метод подсчёта повторов в видео, выдающий **per-frame density map** $D \in \mathbb{R}^{64}$ (значения в окрестности 0..1, сумма по всем кадрам = предсказанный count). Решаемая задача — **rep counting на длинных видео с реалистичными аномалиями** (interruption, неравномерные циклы), где RepNet деградирует. Основной механизм: (i) **Video Swin Transformer tiny** как backbone (вместо RepNet'овского ResNet-50); (ii) **multi-scale processing** на трёх параллельных временных окнах (single-frame, 4-frame, 8-frame); (iii) замена RepNet'овского euclidean TSM на **self-attention correlation matrix**; (iv) замена RepNet'овской классификации длины периода на **density map regression** с MSE-loss на гауссиан-сглаженных ground truth. Direction для SmartRep — **🅰 (preprocessing/utility)**, как у RepNet: TransRAC даёт per-rep локализацию для downstream AQA-головы, но не сам error detection. Pipeline role — **dataset_construction_tool + distillation_teacher + reference_baseline** (НЕ deployment-кандидат; см. раздел 5).

**Delta over RepNet** (3 содержательных пункта + датасет):
1. **Correlation matrix:** евклидова TSM → self-attention (Q·Kᵀ); dot-product attention заменяет $-\|x_i - x_j\|^2$. Эмпирически даёт +0.12 MAE / +0.07 OBO на RepCount-A (см. ablation).
2. **Output head:** softmax classifier периодов $\{2, ..., N/2\}$ → density map regressor (per-frame непрерывное значение). Density map *локализует* центры повторов; RepNet локализовал только периоды. Эмпирически даёт +0.30 MAE при том же ResNet-50 backbone.
3. **Multi-scale:** single-scale RepNet → 3 параллельных backbone-прогона на разных временных окнах. Эмпирически даёт +0.10 MAE над лучшим single-scale (Scale-4).
4. **Датасет RepCount-A:** новый бенчмарк с 1 451 видео, 19 280 fine-grained аннотациями границ каждого цикла, видео 4–88 секунд (vs Countix 0.2–10 секунд), включая action interruption и inconsistent cycles. Это *главный* вклад статьи для нашей задачи (см. ниже).

[КОММЕНТАРИЙ РЕЦЕНЗЕНТА] Цифры RepNet в TransRAC-таблицах (MAE 0.9950, OBO 0.0134 на RepCount-A) — **спорные**. Авторы RepNet (release-note от 2024-11-14, ответ TransRAC от 2025-02-06) утверждают, что в TransRAC использовалась модифицированная версия RepNet (FC-слой урезан до периодов ≤32), без multi-speed evaluation. Оригинальный RepNet с multi-speed на тех же датасетах работает заметно лучше. Это **не дискредитирует архитектурные новации TransRAC** (multi-scale + density map ablations самодостаточны), но при цитировании delta-сравнения нужна осторожность.

## 3. Выходной контракт и архитектура

**Output spec:**
- **Input shape:** 64 frames из видео ≤2 минут (с zero-padding если короче). Каждый кадр 224×224×3 (стандарт Video Swin tiny). Видео расширяется в 3 параллельных subsequence: $V_1$ (single frames), $V_4$ (sliding window 4 кадра, step 2), $V_8$ (sliding window 8 кадров, step 4). Все три padded до одинаковой временной размерности 64.
- **Output shape:** $D \in \mathbb{R}^{64}$ — per-frame density map (один скаляр на кадр).
- **Output range:** значения в окрестности [0, 1], форма пиков ≈ Gaussian-smoothed центров повторов (стандартное отклонение фиксировано в supplementary).
- **Aggregation:** $\hat{c} = \sum_{i=1}^{64} D_i$ — линейная сумма. Никакого NMS / threshold'а.

**Backbone:** Video Swin Transformer tiny (Liu et al., ICCV 2021), pretrained on Kinetics-400. **Frozen во время обучения** (по признанию авторов — из-за нехватки GPU memory). Выходные features: 7×7×t×768, где t — после двукратного temporal compression. После 3D-конволюции (3×3×3, 512 фильтров, ReLU) и Global 3D MaxPool по spatial dim — embedding 64×512 на каждый scale.

**Multi-scale processing — главный архитектурный риск для edge.** Три параллельных Video Swin прохода для трёх временных масштабов. В коде backbone shared, но forward выполняется три раза с разными input subsequences — то есть **×3 inference cost от Video Swin'а**.

**Task-specific блоки:**
- **Self-attention correlation:** $C_i = \text{softmax}\left(\frac{Q_i K_i^T}{\sqrt{d_k}}\right)$ для каждого scale $i \in \{1, 4, 8\}$. 4 attention heads, $d=512$. Не 8 голов, как обычно — авторы явно указывают это design choice.
- **Concatenation:** $C = \text{concat}(C_1, C_4, C_8)$ → shape $[64, 64, M \times H] = [64, 64, 12]$ (M=3 scales × H=4 heads).
- **Density map predictor:** Conv 3×3 (32 фильтра) → Transformer → 2 FC (по 512) → output 64-D density vector.

**Аугментации.** Спецификация в коде, не в основной статье. Из общей практики Video Swin pipeline: temporal sampling, spatial random crop, horizontal flip. Camera motion augmentation (как у RepNet) **не упоминается** — это потенциальная слабость на gym-камере с тряской.

**Loss-функция в LaTeX.** Mean squared error между предсказанным density map и Gaussian-сглаженным ground truth:
$$
\mathcal{L} = \frac{1}{64} \sum_{i=1}^{64} \big(D_i - G_i^{\text{gt}}\big)^2
$$
где $G_i^{\text{gt}} = \sum_k \mathcal{N}(i; \mu_k, \sigma^2)$ — сумма гауссиан с центрами $\mu_k$ в позициях каждого размеченного периода (per-cycle boundary midpoint). $\sigma$ фиксирована в supplementary.

[КОММЕНТАРИЙ РЕЦЕНЗЕНТА] **Геометрический смысл density map'а критичен для нас.** В отличие от RepNet, где per-frame output — это «длина периода», у TransRAC per-frame output — это «вероятность того, что данный кадр близок к центру одного из повторов». Это даёт явную **локализацию пиков** (peak detection на $D$ → центры повторов → crop window для AQA-головы). Для SmartRep это означает: TransRAC естественнее стыкуется с per-rep error detection, чем RepNet (у RepNet нужен дополнительный post-processing для извлечения rep boundaries из per-frame period output'а).

**Inference protocol.** Single-pass forward (нет multi-speed как у RepNet), но **×3 multi-scale прогон через Video Swin** на каждом видео ≤2 минут.

**Mermaid-диаграмма.**

```mermaid
flowchart LR
    V[Video N=64 frames, 224x224] --> SW1[Sliding window step=1: V1]
    V --> SW4[Sliding window step=2: V4 4-frame chunks]
    V --> SW8[Sliding window step=4: V8 8-frame chunks]

    SW1 --> SWIN1[Video Swin tiny FROZEN]
    SW4 --> SWIN4[Video Swin tiny FROZEN]
    SW8 --> SWIN8[Video Swin tiny FROZEN]

    SWIN1 --> P1[3D Conv + Global MaxPool] --> X1[X1 64x512]
    SWIN4 --> P4[3D Conv + Global MaxPool] --> X4[X4 64x512]
    SWIN8 --> P8[3D Conv + Global MaxPool] --> X8[X8 64x512]

    X1 --> SA1[Self-attn 4-heads] --> C1[C1 64x64x4]
    X4 --> SA4[Self-attn 4-heads] --> C4[C4 64x64x4]
    X8 --> SA8[Self-attn 4-heads] --> C8[C8 64x64x4]

    C1 & C4 & C8 --> CAT[Concat -> 64x64x12]
    CAT --> CONV[Conv 3x3 32 filters] --> TR[Transformer] --> FC[2 FC layers] --> D[Density map D 64-D]

    D --> SUM[count = sum of D]
````

## 4. Эксперименты

**Training datasets.**

- **RepCount-A** (1041 видео из YouTube): squats, pull-ups, front-raises, rowing, pommel horse, soccer juggling. Длительность 4–88 секунд (среднее ~30s, vs Countix ~6s). Аннотация — границы каждого периода (start, end), не только итоговый count. **Главное содержательное достижение для нашей задачи.**
- **RepCount-B** (410 видео): локальные школьные тренировки в России/Китае, для оценки cross-domain.
- **Total: 1 451 видео, 19 280 fine-grained аннотаций периодов.**

**Evaluation datasets.**

- RepCount-A test split (in-domain)
- RepCount-B (cross-domain — школьные физ.занятия)
- UCFRep (cross-dataset, 526 видео, фитнес-action из UCF101)

**Task-specific метрики (стандарт rep counting):**

- **MAE** $= \frac{1}{N}\sum_i \frac{|\hat{c}_i - c_i|}{c_i}$ — нормализованная средняя абсолютная ошибка
- **OBO** $= \frac{1}{N}\sum_i \mathbb{1}[|\hat{c}_i - c_i| \leq 1]$ — доля правильно посчитанных видео с допуском ±1

**SOTA-таблица (RepCount-A test, обучение на RepCount-A train):**

|Method|MAE ↓|OBO ↑|
|---|---|---|
|X3D|0.9105|0.1059|
|TANet|0.6624|0.0993|
|Video Swin-T (raw classifier)|0.5756|0.1324|
|Huang et al. (action segmentation)|0.5267|0.1589|
|RepNet (modified*)|0.9950|0.0134|
|Zhang et al. (CVPR 2020)|0.8786|0.1554|
|**TransRAC**|**0.4431**|**0.2913**|

*RepNet модифицирован: FC-слой урезан до периодов ≤32, без multi-speed evaluation. См. comment выше.

**Cross-dataset transfer (обучение на RepCount-A, тест на RepCount-B и UCFRep):**

|Method|RepCount-B MAE / OBO|UCFRep MAE / OBO|
|---|---|---|
|RepNet (modified)|0.9994 / 0.0025|0.9985 / 0.009|
|TransRAC|0.7839 / 0.091|0.6401 / 0.324|

**Failure modes (явно перечислены авторами):**

- ❌ Multi-person в кадре (например, тренер + ученик) — модель путает источники периодичности
- ❌ Imbalanced distribution (все действия концентрированы в первой половине длинного видео) — density map не справляется с такими паттернами

[КОММЕНТАРИЙ РЕЦЕНЗЕНТА] Оба failure mode'а **прямо релевантны нашему сценарию**: (i) тренер часто стоит рядом со штангой при инструктаже; (ii) типичная сессия — 5 повторов в первые 30 секунд + 1.5 минуты отдыха перед следующим подходом. Это значит, что raw TransRAC на нашем сценарии деградирует; нужно либо crop вокруг атлета (через детектор), либо собственный fine-tuning на наших данных.

**Ablations (главные).**

Correlation matrix (TSM vs self-attention):

|Correlation|MAE ↓|OBO ↑|
|---|---|---|
|TSM (RepNet style)|0.5678|0.2251|
|Self-attention (TransRAC)|**0.4431**|**0.2913**|

Density map vs classifier (с разными backbone'ами):

|Method|MAE ↓|OBO ↑|
|---|---|---|
|ResNet + CLS (≈ original RepNet)|0.9950|0.0134|
|ResNet + DM|0.6905|0.0811|
|Swin + CLS|0.7027|0.118|
|Swin + DM|0.6781|0.138|
|**Multi-scale Swin + DM (full TransRAC)**|**0.4431**|**0.2913**|

**Density map alone — значительный gain (+0.30 MAE на ResNet backbone).** Этот один компонент даёт большую часть прироста, и его можно перенести на любой backbone, включая lightweight ST-GCN.

Multi-scale ablation:

|Scale|MAE ↓|OBO ↑|
|---|---|---|
|Scale-1 only|0.6595|0.1854|
|Scale-4 only|0.5434|0.2649|
|Scale-8 only|0.6657|0.192|
|**Multi (1+4+8)**|**0.4431**|**0.2913**|

Multi-scale даёт +0.10 над лучшим single-scale (Scale-4). Это не катастрофическая потеря — single-scale модель относительно конкурентна.

[КОММЕНТАРИЙ РЕЦЕНЗЕНТА] Это **критическая находка для edge-варианта**: выбрав single-scale (Scale-4) с density map output, мы теряем ~0.10 MAE, но избавляемся от ×3 backbone overhead. Для нашей edge-цели этот trade-off правильный.

## 5. Edge feasibility (deal-breakers)

|Edge-killer|Присутствует?|Деталь|
|---|---|---|
|Multi-speed inference|❌ Нет|Single forward, в отличие от RepNet|
|Optimization loop на инференсе|❌ Нет|Pure feedforward|
|Sliding window over long video|⚠ Частично|Авторы фиксируют 64 frames для видео ≤2 минут; для более длинных нужен sliding window aggregation, в статье не описан|
|Quadratic attention|❌ Нет|$N=64$, attention $64 \times 64$ — ОК|
|**Multi-scale processing ×3**|✅ ДА|**Главный killer.** ×3 forward pass через Video Swin tiny|
|**Heavy backbone (>10M params)**|✅ ДА|Video Swin tiny ≈ 28M параметров|
|Multi-stream fusion|❌ Нет|Один stream (RGB), но 3 scales|
|Iterative refinement|❌ Нет|Single pass|
|Required intrinsics / calibration|❌ Нет|Свободная камера|

**Стандартная таблица:**

|Параметр|Значение|
|---|---|
|Параметры (M)|НЕ УКАЗАНО явно. Оценка: Video Swin tiny ≈ 28M + 3D conv (3×3×3×512×512) ≈ 7M + Transformer ≈ 1M + heads ≈ 0.5M. **Итого ≈ 36M** (backbone shared между scales).|
|GFLOPs|НЕ УКАЗАНО. Video Swin tiny на 32 кадра 224×224 ≈ 88 GFLOPs; ×3 multi-scale ≈ 260+ GFLOPs на одно видео|
|Latency + железо|НЕ УКАЗАНО. На современном GPU (RTX 3090) ≈ сотни мс на видео; на mobile NPU — секунды|
|Inference cost multiplier|**×3** (multi-scale)|
|Real-time на mobile?|**Нет.** Video Swin не оптимизирован под mobile + ×3 multi-scale делает невозможным|
|Квантизация / дистилляция|НЕ ОБСУЖДАЕТСЯ|

**Качественный вердикт: heavy → prohibitive** для real-time mobile deployment в SmartRep. Video Swin tiny + ×3 multi-scale категорически несовместимо с нашим edge-таргетом (Jetson Orin Nano / iPhone Neural Engine на ~30 FPS). Возможно offline-обработка после подхода (десятки секунд latency приемлемы для post-set feedback), но не во время выполнения.

[КОММЕНТАРИЙ РЕЦЕНЗЕНТА] Frozen backbone во время обучения (авторы признаются — из-за GPU memory) — это **дополнительный сигнал о тяжести метода**: модель настолько большая, что её разработчики не смогли учить её end-to-end. Это указывает на под-оптимизированность density map head, и оставляет место для дистилляции в более компактного student'а с end-to-end fine-tuning.

## 6. Роль в SmartRep-pipeline (центральный раздел)

### deployment_candidate

❌ **Категорически нет.** Multi-scale + Video Swin tiny + frozen backbone = prohibitive для real-time mobile. Даже offline-обработка после подхода требует мощного устройства; на смартфоне — секунды на видео. Не deployment.

### distillation_teacher

✅ **Сильный кандидат.** Density map regression — это идеальный target для distillation: непрерывный per-frame сигнал, который можно учить с MSE между teacher_density и student_density. Архитектура student'а:

- Backbone: ST-GCN/4 над skeleton input (вместо Video Swin над RGB)
- Single-scale (Scale-4 only — теряем 0.10 MAE, но получаем ×3 inference cost reduction)
- Density map regressor (тот же head, но обучаемый end-to-end)
- Можно дополнительно дистиллировать промежуточные correlation matrices как auxiliary loss

Распределение: TransRAC даёт teacher density map на наших собранных видео; ST-GCN-based student учится воспроизводить density map напрямую из skeleton.

### dataset_construction_tool

✅✅ **Самая важная роль для нас.** RepCount-A — **готовый dataset для нашей предметной области**: 1041 YouTube-видео фитнес-движений с fine-grained per-cycle аннотациями. Конкретно для нас релевантны:

- squats, pull-ups, front-raises — прямо из наших 5 целевых упражнений
- rowing — близко к bent-over row
- bench press — прямо в списке (упомянут авторами в Section 5.3)

Это **реальный бесплатный обучающий материал** для нашего собственного rep counter'а. Дополнительно: TransRAC release включает model checkpoint на OneDrive/BaiduDisk — можно прогнать его на наших собственных собранных подходах для silver-standard rep boundaries.

⚠ Но есть нюанс: RepCount-A part-A — YouTube-видео с camera angle variation; наш сценарий — преимущественно side-view статичная камера. Domain gap есть, но он меньше, чем у Countix (который вообще класс-агностичен).

### preprocessing_step

✅ **Совместим, но в дистиллированном виде.** Архитектурно: density map peaks → центры повторов → crop window вокруг каждого центра → per-rep AQA head. Нужен дистиллированный student (см. distillation_teacher), потому что raw TransRAC слишком тяжёл для real-time.

### reference_baseline

✅ **Стандартный.** Любая наша публикация про лёгкий rep counter в SmartRep должна цитировать TransRAC как SOTA на RepCount-A и доказывать, что наш метод не теряет качества при дистилляции в edge-friendly архитектуру.

**Итоговое распределение ролей: dataset_construction_tool (primary) + distillation_teacher (secondary) + reference_baseline (для публикации).**

## 7. Gap для нас (ниша новизны SmartRep)

1. **RGB-only, нет skeleton-варианта.** TransRAC, как и RepNet, работает на RGB. Density map regression концептуально применим к skeleton trajectories, но никто не делал. **Гэп: переписать TransRAC head на skeleton input** — заменить Video Swin tiny на ST-GCN/4, считать correlation matrix на skeleton embeddings, density map head оставить тем же. Edge выгода: 36M → ~1M параметров; устойчивость к освещению/одежде — выше. Это конкретная публикационная ниша.
    
2. **Multi-scale ×3 убивает edge real-time.** Авторы сами показывают, что Scale-4 single даёт MAE 0.5434 vs multi-scale 0.4431 — overhead в 3× ради 0.10 MAE. Для нашей задачи правильный trade-off — single-scale. **Гэп: показать на нашем датасете, что single-scale Scale-4 + density map + skeleton input даёт MAE ≤ 0.5 при ≤1M параметрах** — это сразу публикуемо как edge-friendly rep counter.
    
3. **Failure modes на multi-person и imbalanced distribution — наш сценарий.** Тренер рядом + длинная пауза между подходами — оба фактора в gym-видео обычны. Авторы их признают, но не решают. **Гэп: добавить person-aware crop preprocessing (детектировать активного атлета и crop вокруг него) + temporal segmentation step (отрезать паузы перед density map regression).** Это не новая методология, но прямо устраняет два названных failure mode'а в нашем домене.
    
4. **Density map output не используется для quality assessment.** TransRAC локализует центры повторов, но не оценивает их качество. Это **наша основная ниша SmartRep**. **Гэп: extend density map head с per-rep quality score** — вместе с density value предсказывать `quality_score ∈ [0, 1]` для каждого пика. Архитектурно — добавить параллельную head'у (2 FC) к той же self-attention correlation features. Совместная обучаемость на RepCount-A (для density) + наш fitness-AQA датасет (для quality) даёт multi-task SmartRep model.
    
5. **Camera motion augmentation отсутствует, в отличие от RepNet.** В RepNet это была критичная аугментация (без неё MAE падал с 0.10 до 0.72). TransRAC умолкает на этот счёт. **Гэп: проверить устойчивость TransRAC к gym camera artifacts** (motion blur, exposure shift, JPEG compression). Если деградирует — добавить camera motion augmentation в наш pretraining.
    

## 8. Вывод для литобзора

**Приоритет: ВЫСОКИЙ.** Не как методология (multi-scale + Video Swin прибиваемы edge-killer'ами), а как **готовый ресурс для нашего pipeline**: (i) RepCount-A — реальный обучающий датасет для наших 5 упражнений; (ii) released checkpoint — готовый teacher для дистилляции; (iii) density map output — методологический шаблон для нашего собственного skeleton-based rep counter'а; (iv) reference baseline для публикационного сравнения.

**Pipeline role:**

- **Primary:** dataset_construction_tool — использовать RepCount-A для обучения нашего собственного counter'а; прогнать released TransRAC checkpoint на наших собранных видео для silver-standard rep boundaries.
- **Secondary:** distillation_teacher — Video Swin → ST-GCN/4 student с density map output, MSE distillation на per-frame density values.
- **Tertiary:** reference_baseline — цитирование при публикации лёгкого rep counter'а.

**Прямой вклад в направления:**

- 🅰 (error detection): **косвенный, как preprocessing.** Density map output — естественный input для per-rep AQA head; без неё нет per-rep granularity. Это та же роль, что у RepNet, только TransRAC выдаёт более удобный output (peaks вместо периодов).
- 🅱 (biomech pose): **нулевой.**
- 🅲 (SSL adaptation): **нулевой** (метод supervised, не learning representation).

**Связанные статьи для следующего разбора:**

- **IVAC-P2L** (Yao et al., 2024) — прямой descendant TransRAC с улучшенным irregular repetition prior. Стоит проверить, сохраняется ли density map paradigm и улучшается ли cross-dataset transfer.
- **MultiCounter** (Liu et al., 2024) — multi-instance rep counter, решает multi-person failure mode TransRAC. Прямо релевантно нашему gym сценарию (тренер + атлет).
- **FCA-RAC** (2024) — улучшение TransRAC с focal context attention. Может быть полезным альтернативным backbone'ом.
- **CountLLM** (2024) — LLM-based подход к rep counting; экзотический, но интересный для понимания зрелости направления.
- **PersonalPT** (Ferreira et al., 2021) — skeleton-based RAC через DTW/GMM; единственный известный мне skeleton rep counter, прямой контраст к нашей предлагаемой skeleton-TransRAC ниши.

---
