В карточках фитнес-приложений «ИИ-тренер» выглядит одинаково: силуэт, зелёные линии по суставам, подсказка «колени внутрь». За этим стоят две разные архитектуры. В одной кадры не покидают устройство. В другой видео или пачка кадров уезжает на сервер. Для пользователя это вопрос стыда и квартиры на фоне. Для инженера — задержка, размер модели, цикл обновления и то, какие утверждения система вообще вправе делать.

Ниже разбор не про бренд, а про пайплайн. Я опираюсь на публичные постановки: 2D body pose (Apple Vision, MediaPipe Pose / BlazePose, MoveNet и близкие), геометрические эвристики поверх ключевых точек и небольшие классификаторы упражнения. Цифр точности «на нашем датасете» здесь нет: без протокола съёмки такая цифра не переносится. Есть границы, которые видны из самой постановки задачи.

Что считается, когда «камера смотрит технику»

Почти никто в потребительском приложении не «понимает движение» в смысле тренера. Считается цепочка проще.

Кадр RGB → детектор человека → набор 2D-ключевых точек (обычно 17–33: плечи, локти, запястья, бёдра, колени, лодыжки, иногда лицо и стопы) → либо правила на углах и пропорциях, либо мелкий классификатор на последовательности точек → реп, длительность, список реплик.

Это не видеоанализ сюжета и не 3D-биомеханика. Это проекция тела на плоскость камеры плюс пороги. Уже здесь лежат все честные обещания и почти все лживые.

Публичные API это подтверждают прямо. VNDetectHumanBodyPoseRequest в Vision отдаёт точки и уверенность, не «оценку приседа». MediaPipe Pose отдаёт лендмарки в координатах кадра. Дальше продукт сам решает, что считать ошибкой. Если продукт не показывает, какие суставы и какие пороги, он продаёт интерпретацию, а не измерение.

Для трёх упражнений, которые стабильно живут в первой версии таких систем, геометрический смысл разный.

Присед. В боковой проекции можно оценить глубину через угол в колене и взаимное положение таза и колена, наклон корпуса через линию плечо–таз, грубое «колени ушли вперёд относительно стопы». Во фронтальной — асимметрию коленей и грубый valgus как уход колена внутрь относительно бедро–лодыжка. Это 2D-прокси. Это не момент на колене и не «безопасный присед».

Отжимание. В боковой проекции: угол в локте, линия плечо–таз–лодыжка (провис или «домик»), глубина опускания. Во фронтальной проекции полезного меньше: локти относительно корпуса видны хуже, глубина почти не читается.

Планка. Это удержание, не цикл. Имеют смысл длительность и отклонение линии тела: провис таза, подъём таза, грубый поворот плеч, если видны оба. Каденции нет, реп-счётчик здесь врать не должен: его не должно быть.

Общее для трёх: нужен ракурс. Боковой для приседа и отжимания информативнее фронтального. Слишком верхняя камера на ноутбуке убивает глубину приседа. Честный продукт либо просит поставить телефон, либо пишет «ракурс плохой», а не ставит оценку 87.

Две архитектуры, которые путают в одном скриншоте

On-device. Инференс идёт на телефоне. На iOS это часто Vision / Core ML. На Android — ML Kit, TFLite, MediaPipe, NNAPI / GPU-делегат. В облако в идеале не уходит ни кадр, ни клип. На сервер могут уехать агрегаты: число репов, длительность, коды подсказок, «оценка» как число. Это уже другой объект. Агрегат — не видео, но и не «ничего не отправили».

Cloud upload. Клиент грузит клип или стрим кадров. Сервер считает позу более тяжёлой моделью, иногда с временным окном подлиннее, и возвращает разбор. Кадры оказываются в транзите и, если так задумано, в хранилище. Можно делать A/B модели без релиза в сторе, копить датасет, считать офлайн. Цена — данные и задержка.

Смешанный контур встречается чаще, чем пишут в маркетинге: поза на устройстве, а «умные» текстовые советы — из облачной LLM по агрегатам. Для приватности важен не логотип «AI», а список объектов, которые пересекают границу устройства: кадр, превью, эмбеддинг, JSON с углами, только счётчики.

Обновление модели тоже разъезжается. On-device без over-the-air пакета живёт циклом стора: нашли ложные срабатывания на планке у стены — ждёте релиз. Облако патчится сразу и одинаково для всех, включая регрессии. Для техники тела регрессия не косметика: вчерашний порог «колено внутрь» завтра может начать орать на нормальную стопу из-за нового калибровочного набора.

Задержка: что можно показывать вживую

Живая подсказка во время приседа требует, чтобы цикл «кадр → точки → правило → текст/звук» укладывался в десятки миллисекунд, максимум в сотню-другую. Иначе человек уже встал, а система советует сесть глубже.

On-device на относительно свежем телефоне для лёгкой 2D-позы это достижимо: 15–30 fps на уменьшенном кадре (часто 256–320 по короткой стороне) — рабочий режим. Имеет смысл не каждый кадр кормить тяжёлой моделью, а считать позу на 15–20 fps и вешать эвристики на сглаженную траекторию. Сглаживание обязано быть явным: без него локоть прыгает, реп-счётчик двойничит.

Облако для живого оверлея почти всегда проигрывает. Кодирование, буфер, RTT, очередь инференса, обратная доставка — это сотни миллисекунд, часто секунды, плюс зависимость от Wi‑Fi в зале, которого нет. Облако уместно для разбора после подхода: загрузил 8 секунд, получил таймлайн. Путать «разбор после» и «купируй колено прямо сейчас» в одном UX нельзя. Это разные SLA.

Отсюда практическое правило приёмки. Если продукт обещает live-cue, а в сетевом трейсе во время подхода уходит видеопоток, либо live будет врать по времени, либо «on-device» написано для прессы. Если live заявлен и сеть молчит, это ещё не доказательство качества позы — только доказательство контура.

Батарея и тепло — часть той же приёмки. Поза + камера + экран не гаснет. На длинной планке телефон на полу через три минуты может уйти в троттлинг, fps падает, длительность ещё считается, а «провис таза» начинает мерцать. Это не крайний случай, это бытовая съёмка. Тест: пять минут планки/приседа в том помещении, где будут заниматься, не на стенде.

Приватность: видео тренировки — не тот же объект, что шаг в HealthKit

Угроза не абстрактная «слежка». Домашняя камера снимает тело, жильё, иногда других людей. Это биометрия по факту использования, даже если юрист ещё спорит про термин.

Минимальная модель данных для on-device контура:

  • кадры живут в памяти или в кольцевом буфере и умирают с сессией;

  • на диск не пишется ролик «на всякий случай»;

  • в бэкенд уходят агрегаты с явным составом полей;

  • состав полей опубликован: репы, длительность, коды подсказок, не эмбеддинг кадра;

  • удаление аккаунта убивает агрегаты;

  • отдельного обучения модели на ваших кадрах нет, потому что кадров нет.

Минимальная модель для cloud upload:

  • зачем кадр на сервере: только инференс / хранение для истории / обучение;

  • срок жизни объекта, шифрование на диске, кто из сотрудников и каких подрядчиков читает;

  • регион обработки;

  • можно ли запретить использование в обучении без потери функции;

  • что видит саппорт, если вы прислали «разбор не сработал»;

  • есть ли люди на фоне и как это вообще предполагается гасить.

Путать согласие на камеру в iOS с согласием на загрузку нельзя. Системный диалог Camera говорит: приложение видит сенсор. Он не говорит, что ролик поедет в объектное хранилище. Это должно быть вторым, отдельным, внятным шагом. Если его нет, считайте контур непрозрачным.

Отдельно: «мы не храним видео, только обрабатываем». Обработка в памяти сервера всё равно означает: кадр покинул устройство, его видел чужой процесс, его могли залогировать при ошибке, он мог попасть в дамп, в CDN-кэш, в тикет. On-device этот класс инцидентов вычёркивает целиком. Это главный инженерный аргумент в пользу локальной позы, сильнее, чем маркетинг «приватный ИИ».

Что on-device не лечит. Скриншот. Запись экрана. Облачный бэкап, если кто-то всё-таки сохранил клип в «историю техники». Метрики, по которым можно восстановить, что вы тренируетесь по ночам. Если в аккаунт пишется оценка формы каждый подход, это уже профиль тела. Его надо описывать как персональные данные, даже без картинки.

Что классификатор трёх упражнений может утверждать

Честный выход системы — не «техника отличная», а атомарные наблюдения с условием съёмки.

Можно: посчитать циклы, если есть устойчивые экстремумы угла (присед, отжимание). Можно: длительность удержания (планка). Можно: выдать дискретную реплику, привязанную к порогу, который можно объяснить: «таз ниже колена в этом кадре не виден», «локоть не разогнулся», «линия плечо–таз–пятка сломалась». Можно: отказаться считать и сказать «не вижу колени» / «встань боком». Отказ — валидный класс, не провал UX.

Можно, осторожно: сравнивать сессию с вашей же прошлой сессией при том же ракурсе. Сдвиг глубины приседа на одной и той же кухне информативнее абсолютной «оценки 80».

Нельзя выдавать за измерение то, чего нет в 2D. Нагрузка на штанге. Сдвиг позвонка. Внутренняя ротация бедра как клинический факт. «Колени опасны». Симметрия стоп, если стоп в кадре нет. Упражнение вне набора: румынская тяга, жим лёжа, рывок. Одно число «form score» без рубрики: какой угол, какой кадр, какой вес порогов. Медицинский вывод. Замену тренеру.

Особенно ядовита шкала 0–100. Её ждут продуктовые, потому что она рисуется на графике. Для 2D-позы она почти всегда — каша из нескольких эвристик с невидимыми весами. Два человека с разной антропометрией получат разные баллы на одинаково приемлемом приседе. Если балл оставляете, публикуйте рубрику и сырые признаки рядом. Иначе это геймификация, не коучинг.

Ещё граница: один человек в кадре, одежда не чёрная на чёрном, свет не против камеры, телефон не в руке у партнёра, который ходит. Лабораторный датасет это фильтрует. Кухня — нет. Честный классификатор деградирует в отказ, не в уверенный бред.

Как проверять чужой (и свой) разбор за один вечер

Протокол короткий. Он ломает демо лучше, чем спор про mAP.

Снимите три подхода приседа сбоку, три спереди, три в плохом свете. Три отжимания с колен и три с носков. Планку минуту боком и минуту «камера на полу смотрит в потолок». Намеренно сделайте две ошибки, которые система обещает ловить: недосед и провис таза. И две, которые 2D почти не видит: лёгкий разворот стопы, «коленные ощущения» без изменения точек.

Дальше смотрите не красоту скелета, а журнал событий. Есть ли отказ при фронтальном приседе. Двойничает ли счётчик. Появляется ли реплика про глубину, когда глубины в кадре нет. Уезжает ли что-то в сеть во время live. Что остаётся в аккаунте после удаления сессии.

Если система ставит высокий балл на намеренном недоседе в боковой проекции — эвристика не калибрована, продукт рано продавать как технику. Если система ругает нормальный присед из-за камеры сверху — нет контроля ракурса. Если live работает только по Wi‑Fi — это облако, как ни называй.

Для on-device отдельно: включите авиарежим. Функция должна пережить. Если нет — в контуре есть обязательный сервер, и текст «на устройстве» надо сужать до «поза локально, решение не локально».

Для облака отдельно: прочитайте, что происходит с клипом через 24 часа. Если этого нет в политике и в интерфейсе, считайте срок жизни неизвестным. Неизвестное хранение видео тела — достаточная причина не включать камеру.

Красные флаги в формулировках

«Как живой тренер» — категория не из этого пайплайна. Живой тренер видит вес, гриф, дыхание, историю травмы и то, чего нет в 33 точках.

«Любое упражнение» при демо на приседе. Первая версия, которая честно живёт, почти всегда узкая: присед, отжимание, планка, иногда выпад и петля. Ширина номенклатуры стоит дороже точности.

«Видео не хранится» без слова, хранится ли эмбеддинг, превью, кадр ошибки. Хранение производных — тоже хранение.

Оценка техники без ракурса. Скелет, нарисованный на любом кадре, создаёт иллюзию измерения.

Медицинские слова: реабилитация, диагностика, «безопасно для коленей». У 2D-позы нет доступа к суставу. Максимум — «угол в кадре меньше порога».

Смешение live-cue и пост-разбора в одном обещании без двух задержек.

Нет класса «не вижу». Система, которая всегда что-то говорит, врёт чаще.

Зачем вообще тогда локальная поза

Потому что узкая задача реальной. Напомнить про глубину приседа, не дать планке тихо провиснуть, посчитать повторы, не отправляя квартиру на сервер — это инженерно скромно и полезно. Скромность как раз то, чего не хватает карточкам.

Рабочий контракт звучит так: система оценивает несколько упражнений в оговорённом ракурсе, считает на устройстве, в аккаунт пишет агрегаты такого-то состава, не ставит диагноз, не обещает любое движение. Всё, что шире, требует либо облака и отдельного согласия на видео, либо человека.

Если этого контракта нет, у вас не разбор техники. У вас скелет поверх камеры. Выглядит как продукт 2026 года. Считается как эффект в рекламном ролике.