Реализация AI-подсчёта повторений упражнений через камеру мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация AI-подсчёта повторений упражнений через камеру мобильного приложения
Сложная
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    864
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация AI-подсчёта повторений упражнений через камеру мобильного приложения

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

Основа: pose estimation + анализ временного ряда

Approach тот же, что в анализе осанки: VNDetectHumanBodyPoseRequest (iOS) или ML Kit Pose Detection (Android) выдают ключевые точки скелета на каждом кадре. Но для подсчёта повторений нас интересует не статическая поза, а движение ключевой точки по времени.

Для каждого упражнения выбираем tracking-точку:

Упражнение Tracking-точка Ось
Приседание Бедро (leftHip / rightHip) Y
Отжимание Запястье или плечо Y
Бицепс-кёрл Запястье Y
Берпи Запястья + голова Y комплексно
Выпад Колено Y
class RepCounter {
    private var positionHistory: [Double] = []
    private var repCount: Int = 0
    private var state: MovementState = .neutral
    private let minAmplitude: Double = 0.08  // 8% высоты экрана

    enum MovementState { case neutral, goingDown, bottom, goingUp, top }

    func update(normalizedY: Double) {
        positionHistory.append(normalizedY)
        if positionHistory.count > 30 { positionHistory.removeFirst() }

        let smoothed = positionHistory.suffix(5).reduce(0, +) / 5
        detectRep(smoothedY: smoothed)
    }

    private func detectRep(smoothedY: Double) {
        let baseline = positionHistory.prefix(10).reduce(0, +) / 10
        let deviation = smoothedY - baseline

        switch state {
        case .neutral where deviation > minAmplitude:
            state = .goingDown
        case .goingDown where deviation < minAmplitude * 0.3:
            state = .bottom
        case .bottom where deviation > minAmplitude * 0.7:
            state = .goingUp
        case .goingUp where deviation < 0:
            state = .top
            repCount += 1
            onRepCompleted?(repCount)
            state = .neutral
        default: break
        }
    }
}

Скользящее среднее по 5 кадрам (suffix(5)) — сглаживание шума pose estimation. Без него счётчик дёргается от дрожания ключевых точек между кадрами.

Калибровка под упражнение

minAmplitude = 0.08 — это процент от высоты экрана. Для приседаний подходит, для бицепс-кёрла нужно больше (рука движется в широком диапазоне), для отжиманий — меньше и другая ось.

Калибровку делаем либо через аналитику (обучаем на видео с размеченными повторениями), либо через адаптивный baseline: первые 3 секунды упражнения — измеряем амплитуду движения, подстраиваем пороги.

class AdaptiveRepCounter {
    private var calibrationPhase = true
    private var calibrationSamples: [Double] = []
    private var dynamicAmplitude: Double = 0.05

    func calibrate(y: Double) {
        calibrationSamples.append(y)
        if calibrationSamples.count >= 75 {  // ~3 секунды при 25fps
            let range = calibrationSamples.max()! - calibrationSamples.min()!
            dynamicAmplitude = range * 0.4  // 40% от наблюдённой амплитуды
            calibrationPhase = false
        }
    }
}

Ориентация камеры: боковой vs фронтальный вид

Одна и та же задача требует разных решений в зависимости от позиции камеры:

Фронтальный вид (камера перед пользователем): видны оба плеча, бёдра, голова. Хорошо для приседаний, выпадов, берпи. Координата Y бедра хорошо коррелирует с фазой приседания.

Боковой вид: видны колено, бедро, голеностоп в профиль. Лучше для анализа угла сгибания колена (техника приседа), но требует дополнительной подставки / штатива — неудобно в реальных условиях.

Большинство приложений оптимизируют под фронтальный вид с инструкцией «поставьте телефон в 2 метрах перед собой на уровне пояса».

Проблема: похожие упражнения

Модель не знает, какое упражнение выполняет пользователь. Если пользователь выбрал «приседание», а делает выпад — счётчик посчитает неправильно. Решения:

  1. Пользователь явно выбирает упражнение — простое решение, работает
  2. Автоматическое распознавание упражнения — отдельная задача классификации

Для распознавания упражнения используем time-series classifier: LSTM или 1D CNN на последовательности joint angles. Датасет: NTU RGB+D (120 классов действий), UCF101. Конвертируем в CoreML/TFLite для on-device классификации.

Обратная связь и UI

Счётчик повторений — центральный элемент. Большой, контрастный, анимированный. При каждом засчитанном повторении: UIImpactFeedbackGenerator(style: .rigid) + визуальная вспышка счётчика.

Overlay поверх камеры: отображаем skeleton (линии между ключевыми точками). Помогает пользователю понять, что модель его «видит» и правильно считает. Красный skeleton при плохой видимости (низкая уверенность точек).

Процесс работы

Интеграция pose estimation под нужную платформу. Реализация алгоритма детекции повторений для целевого набора упражнений. Адаптивная калибровка. Camera UI с overlay skeleton. Тестирование на реальных людях разной комплекции и на разных телефонах.

Ориентиры по срокам

Подсчёт 3–5 базовых упражнений — 1–2 недели. Автоматическое распознавание упражнения + полный трекинг тренировки — 3–5 недель.