Обновление 30 марта 2011 г.
Обратите внимание, что описанный алгоритм используется текущими устройствами Kinect для отслеживания тела. Работа была проделана до того, как был запущен Kinect, и он объясняет его отличную производительность при отслеживании тела — то есть он не представляет собой будущее обновление Kinect. Программное обеспечение NITE, поставляемое с PrimeSense SDK, не использует тот же подход, что и программное обеспечение для отслеживания тела Microsoft, и из-за этого не имеет тех же желаемых характеристик.
Microsoft Research недавно опубликовала научную статью и видео, показывающие, как работает алгоритм отслеживания тела Kinect — это почти так же потрясающе, как и некоторые из применений Kinect!
Kinect является прорывом в использовании ряда различных компонентов. Его оборудование хорошо спроектировано и выполняет свою работу по доступной цене. Однако, как только вы перестанете удивляться аппаратному обеспечению для быстрого измерения глубины, ваше внимание должно переключиться на то, как оно выполняет отслеживание тела. В данном случае герой представляет собой довольно классическую технику распознавания образов, но выполненную со стилем.
Раньше существовали устройства слежения за телом, но большая проблема, от которой они страдают, заключается в том, что им нужно, чтобы пользователь стоял в позе калибровки, чтобы их можно было найти с помощью алгоритма с использованием простого сопоставления. С этого момента алгоритм использует алгоритм отслеживания для отслеживания движения тела. Основная идея заключается в том, что если у вас есть область, идентифицированная как рука в первом кадре, то в следующем кадре рука не может переместиться очень далеко, и поэтому вы просто пытаетесь сопоставить области, близкие к первой позиции.
Алгоритмы слежения хороши в теории, но на практике они терпят неудачу, если местоположение тела по какой-либо причине утеряно, и особенно плохо справляются с другими объектами, которые скрывают отслеживаемого человека даже на короткое время. Кроме того, отслеживать несколько человек сложно, и если след тела утерян, может потребоваться много времени, чтобы восстановить его, если это вообще возможно.
Так что же сделала Microsoft Research с этой проблемой, чтобы Kinect работал лучше?
Они вернулись к первым принципам и решили создать систему распознавания тела, которая не зависела бы от отслеживания, а определяла местонахождение частей тела на основе локального анализа каждого пикселя. Традиционное распознавание образов работает путем обучения структуры принятия решений на множестве целевых примеров. Чтобы это работало, вы обычно представляете классификатор с множеством измерений «характеристик», которые, как вы надеетесь, содержат информацию, необходимую для распознавания объекта. Во многих случаях разработка характеристик, которые необходимо измерить, является сложной задачей.
Используемые функции могут удивить вас тем, что они просты, и далеко не очевидно, что они содержат информацию, необходимую для идентификации частей тела. Все функции основаны на простой формуле:
f = d (x + u / d (x)) — d (x + v / d (x))
где (u, v) — пара векторов смещения, а d (c) — глубина, то есть расстояние от Kinect пикселя в точке x. Это очень простая функция, это просто разница в глубине на два пикселя, смещенных от целевого пикселя на u и v.
Единственная сложность заключается в том, что смещение масштабируется на расстояние до целевого пикселя, то есть делится на d (x). Это делает глубину смещения независимой и масштабирует их в соответствии с видимым размером тела.
Ясно, что эти функции измеряют что-то, связанное с трехмерной формой области вокруг пикселя — что их достаточно, чтобы различить, скажем, руку или ногу — другое дело.
Далее команда обучила классификатор, называемый лесом решений, то есть набором деревьев решений. Каждое дерево было обучено набору функций на изображениях глубины, которые были предварительно помечены целевыми частями тела. То есть деревья решений были изменены до тех пор, пока они не дали правильную классификацию для конкретной части тела в тестовом наборе изображений. Обучение всего трех деревьев с использованием 1 миллиона тестовых изображений заняло около дня с использованием кластера с 1000 ядрами.
Обученные классификаторы назначают вероятность наличия пикселя в каждой части тела, и на следующем этапе алгоритма просто выбираются области с максимальной вероятностью для каждого типа части тела. Таким образом, область будет отнесена к категории «нога», если классификатор ног имеет максимум вероятности в этой области. Последний этап — вычисление предлагаемых положений суставов относительно областей, определенных как определенные части тела. На диаграмме ниже максимумы вероятности различных частей тела обозначены цветными областями:
Обратите внимание, что все это легко вычислить, поскольку оно включает значения глубины в трех пикселях и может обрабатываться графическим процессором. По этой причине система может работать со скоростью 200 кадров в секунду и не требует начальной калибровочной позы. Поскольку каждый кадр анализируется независимо и нет отслеживания, нет проблем с потерей изображения тела, и он может обрабатывать несколько изображений тела одновременно.
Теперь, когда вы знаете некоторые детали того, как все это работает, следующий видеоролик Microsoft Research должен иметь смысл:
(Вы также можете посмотреть видео по адресу: Microsoft Research)
Kinect — замечательное достижение, и все это основано на довольно стандартном классическом распознавании образов, но хорошо применяется. Вы также должны принять во внимание то, что наличие большой многоядерной вычислительной мощности позволяет обучающей выборке быть очень большой. Одно из свойств методов распознавания образов состоит в том, что на их обучение может уйти много времени, но после обучения настоящая классификация может выполняться очень быстро. Возможно, мы вступаем в новый золотой век, когда, наконец, мощности компьютеров, необходимые для того, чтобы распознавание образов и машинное обучение работали достаточно хорошо, чтобы быть практичными.