Введение
MVP, он же Minimal Viable Product, представляет собой базовую (ванильную) версию продукта и содержит только самый необходимый функционал. По сути, это пробник, который служит для оценки рисков и оправданности вложений в полноразмерный продукт. MVP может иметь разный вид: пробный образец, тестовая партия, или уже готовый продукт, но с урезанным функционалом.
MVP — это отдельный вид искусства, где нужно за короткое время доказать, что ты в состоянии предложить бизнесу решение, которое поможет достичь поставленных продуктовых целей, за оправданную цену. Это своего рода спидран большого проекта. Про такой MVP как раз и пойдет наш разговор.
Action recognition MVP
После выставки ExpoElectronica 2023 к нам пришел крупный производитель. Наш стенд с системой контроля производственной безопасности уверил производителя, что мы можем решить и его головную боль.
Суть задачи:
Дано: строго регламентированная последовательность операций, производимая над образцом работниками производства
Проблема: нарушение последовательности выявляется только на стадии эксплуатации изделия и ведет к его поломкам
Что требуется: организовать real-time систему слежения за сотрудниками и предупреждения нарушения регламента с помощью монтирования умных камер на производстве.
Выслушав потенциального заказчика, мы поняли, что перед нами стоит типичная задача из области Action Recognition, до недавнего времени вовсе недоступной для EDGE-устройств из-за ограниченности аппаратных возможности и сложности SOTA архитектур. Тем же интереснее для нас!
Проблемы начались изначально
Для каждого проекта необходимо учитывать его специфические особенности. Кому-то нужна работа при критических температурах, кому-то — работа в реальном времени, а кому-то — обработка более 100 кадров в секунду. В этот раз наша основная цель — обеспечить хорошую масштабируемость устройства и его низкую стоимость.
Казалось бы, вопрос масштабируемости обычно не стоит так остро: что мешает купить 200 Jetson Nano, открыть гайд в интернете, и по пунктам установить и запустить рабочую модельку?
Но есть две проблемы:
Jetson Nano это далеко не дешевый одноплатник, что критично при большой масштабируемости
NVIDIA прекратила поставку Jetsonов в Россию
В нашем случае было решено использовать устройство SoC (System on Chip) от одной фирмы, чье имя нельзя называть.
Плата обладает двумя ядрами Arm Cortex-A72 до 2.0 ГГц, четырьмя ядрами Cortex-A53 до 1.5 ГГц и графическим процессором Mali-T864, на котором мы и запускали нашу модель.
MoviNet
После нескольких дней ресерча мы остановились на моделях MoviNets. MoviNets - это семейство моделей на базе сверточных нейронных сетей, которые обладает целым рядом преимуществ:
Разработано специально под мобильные устройства, и развертывается на одноплатнике (основная проблема с SOTA action recognition моделями, что мощные ноутбуки захлебываются при их запуске)
Имеет большую вариативность моделей с различным количеством параметров (отличаются на порядок) и возможностью использовать «облегченные» слои вместо тяжеловесных 3D-слоев
Предоставляет возможность оптимизировать архитектуру для инференса в режиме real-time без риска переполнения памяти
Есть хорошая имплементация на фреймворке tensorflow
Есть предобученные веса на огромном датасете KINETIC 600
Сбор выборки или как мы смотрели 40 тысяч видео
Тут мы подходим к кульминации нашей задачи — выборке. Учитывая, что заказчик — крупное серийное производство, а проект — MVP, нам приходится работать в рамках дополнительных ограничений. Съемка на этом производстве является коммерческой тайной, поэтому количество видеоматериала, мягко говоря, ограничено. Если конкретно, то мы имеем одно видео с последовательностью действий, снятое сбоку от работников, и не слишком высокого качества. Но настоящие профессионалы не ищут легких путей, и мы взялись за работу.
Итак, для начала нам нужно определиться с положением камеры. Чтобы получить максимально релевантную картинку с точки зрения информации, видеокамеру стоит установить прямо над рабочим местом сотрудника, чтобы в ее поле зрения попадали руки рабочего, а следовательно, и все его действия.
Затем нужно решить, где брать данные для обучения. Просмотрев тестовое видео, мы выделили 5 последовательных операций. Так как других данных для обучения у нас не было, мы стали импровизировать - искать аналогичные действия, но уже в открытых датасетах. Как ни странно, многие способы взаимодействия человека с предметами похожи. Например, протирка верстака перед использованием очень похожа на любое действие человека с тряпкой, такое как полировка мебели или уборка стола перед едой.
Мы выбрали датасет Kinetics-700, состоящий из 700 классов, каждый из которых содержит 500-1000 примеров. Запустив предобученную MoviNet модель на нашем тестовом видео, для ручной проверки были отобраны классы, которые выдали наибольшую вероятность на видео и с аналогичным названием (укладка детали на рабочий стол = укладка плитки). Таким образом, осталось 80 классов из 700.
Некоторые классы были исключены после просмотра первых 20 видео, такие как занятие хоккеем или игра на приставке. Если же на видео действия кажутся похожими на производственные, то просматриваются все 1000 экземпляров данного класса с выбором наиболее близких к искомым. Таким образом просмотр, сортировка и фильтрация 40000 клипов и отбор 1500 релевантных из них заняли почти неделю работы двух датасаентистов.
Что получилось в итоге
В итоге наша модель, дообученная на новом датасете, показала неплохие результаты на тестовом видео и смогла дифференцировать (отличить) 3 из 5 операций. Но еще остались 2 операции, для которых примеров из выборки не хватило, но это уже следующий гоал. Осталось дописать постпроцессинг и будет готова начальная версия алгоритма. Для итогового решения нужно еще собирать данные, чтобы модель смогла определить все требуемые действия. Но при условии, что это проект MVP и возможности собрать выборку с нуля нет, то можно воспользоваться и таким решением, пускай не самым точным, но зато малозатратным и рабочим.