Разбор техники по камере телефона: что умеет 2D-поза на устройстве и чего нельзя обещать
В карточках фитнес-приложений «ИИ-тренер» выглядит одинаково: силуэт, зелёные линии по суставам, подсказка «колени внутрь». За этим стоят две разные архитектуры. В одной кадры не покидают устройство. В другой видео или пачка кадров уезжает на сервер. Для пользователя это вопрос стыда и квартиры на фоне. Для инженера — задержка, размер модели, цикл обновления и то, какие утверждения система вообще вправе делать.
Ниже разбор не про бренд, а про пайплайн. Я опираюсь на публичные постановки: 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 года. Считается как эффект в рекламном ролике.