Прорыв Kinect обусловлен несколькими компонентами.
Его аппаратное обеспечение хорошо спроектировано и выполняет свою работу по разумной цене.
Однако после того, как изумление от быстрого оборудования для измерения глубины проходит, внимание неизбежно переключается на то, как оно (Kinect) отслеживает человеческое тело.
В данном случае герой представляет собой довольно классическую технику распознавания образов, но реализованную с изяществом.
Устройства, отслеживающие положение тела, существовали и раньше; но их большая проблема — необходимость того, чтобы пользователь занял эталонную позу, в которой алгоритм узнает его посредством простого сравнения.
После этого используется алгоритм отслеживания, отслеживающий движения тела.
Основная идея: если у нас есть область, идентифицированная как рука в первом кадре, то в следующем кадре эта рука не может двигаться очень далеко, а значит, мы просто пытаемся определить близлежащие области.
Алгоритмы слежения хороши в теории, но на практике они дают сбой, если по каким-то причинам положение тела потеряно; и они очень плохо справляются с другими объектами, блокирующими слежку за человеком, даже на короткое время.
Кроме того, сложно отслеживать нескольких людей; а при такой «потере следа» его можно будет восстановить через довольно долгое время, если вообще удастся.
Так что же сделали ребята из Microsoft Research с этой проблемой, из-за которой Kinect стал работать намного лучше? Они вернулись к первоначальным принципам и решили создать систему распознавания тела, которая не опирается на отслеживание, а находит части тела на основе локального анализа каждого пикселя.
Традиционное распознавание образов работает с использованием структуры принятия решений, обученной на множестве образцов.
Чтобы это работало, вы обычно предоставляете классификатору большое количество значений признаков, которые, по вашему мнению, содержат информацию, необходимую для распознавания объекта.
Во многих случаях задача выбора информативных признаков является наиболее сложной задачей.
Выбранные признаки могут удивить, поскольку они просты и далеко не очевидны с точки зрения информативности для идентификации частей тела.
Все знаки получаются по простой формуле е = d( x + u/d(x) ) — d( x + v/d(x) ) Где ты, в — пара векторов смещения, а д(х) — глубина пикселя, то есть расстояние от Kinect до точки, проецируемой на него Икс .
Это очень простой знак; по сути, это просто разница в глубине двух пикселей, сдвинутых относительно оригинала на u и v. (Варьируя u и v, мы получаем набор признаков.
В самой работе (ссылка ниже) все гораздо понятнее.
— Пер.
)
Единственная сложность заключается в том, что смещение нормируется по глубине исходного пикселя, то есть делится на d(x).
Это делает смещения независимыми от глубины и связывает их с видимыми размерами тела.
Очевидно, что эти характеристики измеряют что-то, связанное с трехмерной формой области вокруг пикселя; но достаточно ли их, чтобы отличить, скажем, ногу от руки – это другой вопрос.
Следующим шагом, который выполнила команда, было обучение классификатора, называемого «лесом решений», то есть набора деревьев решений.
Каждое дерево было обучено на наборе функций в глубоких изображениях, которые предварительно были присвоены соответствующим частям тела.
То есть деревья перестраивались до тех пор, пока не давали правильную классификацию конкретной части тела на тестовом наборе изображений.
Обучение всего трех деревьев для 1 миллиона изображений на 1000-ядерном кластере заняло около суток.
Обученные классификаторы обеспечивают вероятность принадлежности пикселя к определенной части тела; а следующий этап алгоритма просто выбирает регионы с максимальной вероятностью для деталей каждого типа.
Например, область будет классифицирована как «нога», если классификатор «ступня» дает максимальную вероятность в этой области.
Заключительный этап – расчет предполагаемого расположения суставов относительно участков, идентифицированных как конкретные части тела.
На этой диаграмме максимальные вероятности для разных частей тела обозначены цветными областями:
Обратите внимание, что посчитать все это довольно просто, имея значения глубины минимум для трех пикселей и здесь можно использовать графический процессор.
Таким образом, система может обрабатывать 200 кадров в секунду и не требует начальной эталонной позы.
Поскольку каждый кадр анализируется независимо и отслеживания как такового нет, то и проблем с потерей изображения тела нет; и несколько тел могут обрабатываться одновременно.
Теперь, когда вы немного понимаете, как все это работает, посмотрите видео от Microsoft Research: (альтернативный источник ) Kinect является значительным достижением и основан на довольно стандартном классическом распознавании изображений, но умело примененном.
Также необходимо учитывать наличие больших многоядерных вычислительных мощностей, что позволило сделать обучающую выборку достаточно большой.
Это одна из особенностей методов распознавания, на обучение которой можно потратить столетия, но тогда саму классификацию можно выполнить очень быстро.
Возможно, мы вступаем в «золотой век», когда вычислительная мощность, необходимая для эффективной работы распознавания образов и машинного обучения, наконец-то сделает их практичными.
Сама публикация (PDF, 4,6 МБ) P.S. 1. Это перевод. Поскольку всеобъемлющая мудрость Хабра не предусматривает такой мелочи, как смена типа темы при первой публикации в песочнице, то она не форматируется должным образом.
Оригинал от Гарри Фэйрхед с Я Программист. 2. Поскольку всеобъемлющая мудрость Хабра тоже не терпит спешки, я уже решил, что тема не прошла премодерацию и опубликовал ее в другом месте.
Так что, если кто-нибудь его там видел, никому не говорите.
Но знайте, что оно предназначалось для Хабра.
:) Теги: #Машинное обучение #искусственный интеллект #распознавание образов #ИИ #kinect #Microsoft Research
-
Гофмейстер, Вильгельм
19 Oct, 24 -
Неделя Мобильной Безопасности (21–27 Мая)
19 Oct, 24 -
10 Проблем При Работе С Клиентами. Часть 1.
19 Oct, 24 -
Хакатон От Abbyy
19 Oct, 24