Всем привет дорогие читатели! Данная статья показывает, как можно решить задачу Action Classification, а именно следить за рабочим процессом на производстве, где необходимо определить работает человек или нет.
Проблематика
Для начала необходимо определить проблематику данной задачи. Она состоит в том, что для стандартной задачи классификации изображения мы используем свёрточную сеть, на которую передаем изображение и получаем предсказание. А теперь вопрос на засыпку: можно ли по одному изображению классифицировать действие человека на снимке ниже?
Итак, это практически невозможно, так как мы не можем понять, что конкретно этот человек делает. Поэтому необходимо анализировать ряд изображений, чтобы понять то, чем занимается человек. Именно в этом состоит основная проблематика данной задачи.
Пути решения проблемы
На данный момент я нашёл 2 самых наиболее адекватных работоспособных решения:
классификация действий по видеоряду изображений;
классификация действий по keypoints.
Первый способ подразумевает использовать N изображений видеоряда и классификацию действий по ним. Грубо говоря на вход модели подается массив с размером NxWxHxK, где
N - количество изображений;
W - ширина каждого изображения;
H - высота каждого изображения;
K - количество каналов у изображения.
Но тут может возникнуть проблема. Если на видео предполагается, что людей много, то модель не сможет сделать правильный прогноз. Данная проблема решается “трекингом” каждого человека и составлением массивов изображений для каждого объекта на видеоряде.
Второй способ - это примерно такой же подход, как и у первого способа, но вместо массива изображений размером NxWxHxK в модель передаются массив кейпоинтов размером NxMxK, где
N - количество изображений;
M - количество “кейпоинтов” по оси абсцисс;
K - количество “кейпоинтов” по оси ординат.
Важный момент! Каждый сам выбирает сколько кадров необходимо за раз обрабатывать, поэтому параметр N в обоих случаях выбирается индивидуально. На практике я обрабатывал 10 кадров на видеопотоке с частотой 2 кадра в секунду и в целом за 5 секунд уже можно классифицировать действие человека.
Как подобрать параметр N для своей задачи? Просто просмотрите видео на которых вы будете обучаться и ответьте на несколько вопросов:
Сколько секунд вам необходимо, чтобы понять, что делает объект на видео?
Нужно ли вам уменьшать скорость видео? Это необходимо, когда например у вас скорость 30 кадров в секунду и вы понимаете, что вам необходимо например 5 секунд, чтобы понять, какое действие проиходит. Соответственно хранить промежуточно 150 кадров для одного объекта это довольно затратно по памяти. Именно поэтому можно ограничит скорость видео например до 2 кадров в секунду.
Подведем промежуточный итог плюсов и минусов каждого подхода
Плюсы для первого способа (классификация действий по видеоряду изображений):
Необходимы только изображения. Даже если придётся производить “crop” людей с помощью другой нейросети, то выделять bbox объектов намного проще и надёжнее чем определять keypoints каждого объекта.
Минусы
Необходимо хранить в буфере изображения для каждого объекта, поэтому этот способ будет занимать больше оперативной памяти.
Нейросеть для классификации действий должна обрабатывать изображения ряд изображений вместо матрицы keypoints. Поэтому такая модель будет иметь больше параметров.
Плюсы для второго способа (классификация действий по видеоряду):
В буфере хранятся keypoints объектов, что значительно эффективнее, чем хранить всё изображение человека
Высокая точность. Так как keypoints объекта содержит только скелет, модель не будет “привязываться” к фону, свету одежды и другим деталям. Поэтому можно быть уверенным в точности определения действия.
Минусы
Необходимы изображения, на которых человека видно полностью и в хорошем качестве, иначе определения ключевых точек может стать для модели “трудной” задачей.
Разметка кейпоинтов является более трудоемкой задачей, чем выделение bbox человека.
В данной статье я опишу только первый способ, так как ключевым фактором для определения точек является хорошая видимость каждого человека на изображении. В задаче, которую решала наша команда, людей было видно не очень хорошо и поэтому модель определения keypoints даже с дообучением выдавала не очень удовлетворительный результат.
Постановка задачи от реального заказчика
Для начала определимся с постановкой задачи от заказчика, который обратился к нам в компанию.
Есть производство, которое занимается разделкой куриного мяса и заказчик хочет определять насколько эффективно работает каждая бригада (их несколько) с помощью компьютерного зрения по камерам в помещении.
Исходя из постановки задачи мы понимаем, что это задача Action Classification, где необходимо определять для каждого работника класс условно “работает” и “не работает”. И собирать статистику, чтобы потом её анализировать.
Решение данного кейса
Для начала нам необходимо определять каждого человека на изображении и трекать его. Так как нам необходимо определить время работы каждого сотрудника.
В самом начале нашего пайплайна решения мы используем дообученную YOLOv8m от Ultralitics для выделения bbox каждого человека и трекинга. После трекинга модели мы записываем в хэш таблицу для каждого id вырезанный bbox человека, номер кадра и размеры bbox.
Если мы получили для любого id 10 изображений мы создаём numpy array размером 10x160x160x3 и передаем в модель классификации. Моделью классификации действия является модель на TensorFlow.
Архитектура модели - изменённая ResNet50 со слоями TimeDistributed над слоями свёртки и пулинга. После слоёв свертки модель имеет 3 слоя LSTM с 128, 64 и 32 нейронами соответственно. На выходе 1 нейрон с функцией активации “сигмоида”.
Также мы для привязки к рабочему месту использовали “Perspective Transformation” от OpenCV для расположения каждого объекта на карте. Благодаря этому мы можем привязать каждый объект к определенной области работы и отслеживать статистику работы. Пример представлен на рисунке 4.
Вывод
В целом пайплайн из данных моделей, может помочь компаниям отследить статистику рабочих процессов по видеокамере. Для этого достаточно выбрать оптимальный для себя способ определения действий (по изображениям объектов или по их кейпоинтам), обучить модель классификации действий и собирать статистику.
Автор статьи: Ярослав Колташев @YarKo_69
Материалы
Научная статья про классификацию действий
Научная статья про определение действий на видео
Stantin
Не совсем понятно, почему компании требуется следить за процессом, а не за результатом (количество/качество выпускаемого продукта), что выглядит технически проще
DevStars Автор
Верно подмечено! Но есть ситуации, когда работает несколько человек в едином пространстве, и выявить производительность каждого по результатам невозможно, а возможно только таким способом!
AzIdeaL
"... Но есть ситуации, когда..."
... это необходимость, продиктованная ГОСТ-ом 17025, неисполнение пункта в части "Наблюдение за персоналом" может повлечь приостановку деятельности компании (-ий).
ЗЫ: жду продолжения.