Распознавание жестов пальцев и рук с помощью Kinect

Позвольте мне объяснить мою потребность, прежде чем я объясню проблему. Я с нетерпением жду приложения с ручным управлением. Навигация с помощью ладони и щелчки с помощью захвата/кулака.

В настоящее время я работаю с Openni, который звучит многообещающе и имеет несколько примеров, которые оказались полезными в моем случае, поскольку он имеет встроенный трекер рук в образцах. который служит моей цели на данный момент.

Я хочу спросить,

1) как лучше всего иметь детектор кулака/хватки?

Я обучил и использовал кулачные классификаторы Adaboost для извлеченных данных RGB, которые были довольно хорошими, но у них слишком много ложных срабатываний, чтобы двигаться дальше.

Итак, здесь я формулирую еще два вопроса

2) Есть ли другая хорошая библиотека, способная удовлетворить мои потребности, используя данные о глубине?

3) Можем ли мы тренировать свои собственные жесты рук, особенно с использованием пальцев, поскольку в некоторых статьях упоминается HMM, если да, то как нам поступить с библиотекой, такой как OpenNI?

Да, я пытался использовать промежуточные библиотеки в OpenNI, такие как детектор захвата, но они не будут служить моей цели, поскольку они не являются открытым исходным кодом и не соответствуют моим потребностям.

Помимо того, что я спросил, если есть что-то, что, по вашему мнению, могло бы мне помочь, будет принято как хорошее предложение.


person 4nonymou5    schedule 14.02.2014    source источник
comment
Какую операционную систему вы использовали, чтобы ладить с тем же? Вы случайно не использовали Mac или Windows?   -  person TheLuminor    schedule 30.09.2015


Ответы (8)


Вам не нужно обучать свой первый алгоритм, так как это все усложнит. Также не используйте цвет, поскольку он ненадежен (смешивается с фоном и непредсказуемо меняется в зависимости от освещения и точки обзора).

  1. Предполагая, что ваша рука является ближайшим объектом, вы можете просто сегментировать ее по порогу глубины. Вы можете установить порог вручную, использовать ближайшую область гистограммы глубины или выполнить подключенный компонент на карте глубины, чтобы сначала разбить его на значимые части (а затем выбрать объект не только на основе его глубины, но и с учетом его размеров, движения, пользовательского ввода и т. д.). Вот результат работы метода подключенных компонентов: .imgur.com/vN4C6.png" alt="подключенные компоненты"> маска для рук улучшена с помощью захвата
  2. Примените выпуклые дефекты из библиотеки opencv найти пальцы;

  3. Отслеживайте пальцы, а не открывайте их заново в 3D. Это повысит стабильность. Я успешно реализовал такое обнаружение пальцев около 3 лет назад.

person Vlad    schedule 26.02.2014
comment
У меня есть эта реализация, я пробовал аналогичным образом, а не в цветовом режиме, я пробовал выпуклые дефекты с порогом и некоторым диапазоном глубины, о котором вы упомянули, и да, только на области, извлеченной вручную, подход очень хороший, но, разве это не так грубый, как ручной скелет. Но из всех упомянутых подходов этот выглядит лучшим с еще несколькими модификациями. - person 4nonymou5; 28.02.2014
comment
Дьявол кроется в деталях, как говорится. Вы должны изучить случаи, когда производительность ненадежна - возможно, вы сможете улучшить свою реализацию. В конечном счете, вы можете иметь цикл обратной связи от нескольких проанализированных форм обратно к этапам предварительной обработки и выбора, а это означает, что ваша постобработка должна информировать вашу в противном случае несовершенную предварительную обработку о том, что выбрать. Однако эти петли опасны и должны выполняться с полным пониманием. - person Vlad; 28.02.2014

Прочтите мою статью :) http://robau.files.wordpress.com/2010/06/final_report_00012.pdf

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

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

Я использую моменты изображения сегментированной руки, чтобы определить ее вращение, поэтому на контуре руки есть хорошая отправная точка. Очень легко определить кулак, вытянутую руку и количество вытянутых пальцев.

Обратите внимание, что хотя это работает нормально, ваша рука имеет тенденцию уставать, указывая в воздух.

person RobAu    schedule 01.03.2014

Похоже, вы не знаете о библиотеке облачных точек (PCL). Это библиотека с открытым исходным кодом, предназначенная для обработки облаков точек и данных RGB-D, которая основана на OpenNI для низкоуровневых операций и предоставляет множество высокоуровневых алгоритмов, например, для выполнения регистрации, сегментации, а также распознавания.

Очень интересный алгоритм распознавания формы/объекта в целом называется неявная модель формы. Чтобы обнаружить глобальный объект (например, автомобиль или открытую ладонь), нужно сначала обнаружить возможные его части (например, колеса, багажник и т. д., пальцы, ладонь, запястье). и т. д.), используя детектор локальных признаков, а затем сделать вывод о положении глобального объекта, учитывая плотность и относительное положение его частей. Например, если я могу обнаружить пять пальцев, ладонь и запястье в данном районе, есть большая вероятность, что я на самом деле смотрю на руку, однако, если я где-то обнаружу только один палец и запястье, это может быть пара ложных срабатываний. Академическую исследовательскую статью об этом алгоритме неявной модели формы можно найти здесь< /а>.

В PCL есть пара руководств, посвященных теме распознавания форм, и к счастью, один охватывает неявную модель формы , реализованный в PCL. Я никогда не тестировал эту реализацию, но из того, что я мог прочитать в руководстве, вы можете указать свои собственные облака точек для обучения классификатора.

При этом вы не упомянули об этом явно в своем вопросе, но, поскольку ваша цель — запрограммировать приложение с ручным управлением, на самом деле вас может заинтересовать работа в реальном времени алгоритм обнаружения формы. Вам нужно будет протестировать скорость неявной модели формы, представленной в PCL, но я думаю, что этот подход лучше подходит для распознавания формы в автономном режиме.

Если вам нужно распознавание формы в реальном времени, я думаю, вам следует сначала использовать алгоритм отслеживания руки / руки (который обычно быстрее, чем полное обнаружение), чтобы знать, где искать на изображениях, вместо того, чтобы пытаться выполнить полную форму. обнаружение в каждом кадре вашего потока RGB-D. Например, вы можете отслеживать местоположение руки, сегментируя карту глубины (например, используя соответствующий порог глубины), а затем обнаруживая крайности.

Затем, когда вы примерно знаете, где находится рука, должно быть легче решить, делает ли рука один жест, относящийся к вашему приложению. Я не уверен, что именно вы подразумеваете под жестами кулака/хватания, но я предлагаю вам определить и использовать некоторые жесты, управляющие приложением, которые легко и быстро отличить от одного Другая.

Надеюсь это поможет.

person BConic    schedule 25.02.2014
comment
О, да, я слышал об этом, но никогда не думал о реализации, ваше объяснение звучит привлекательно, и я обязательно его изучу, да, вы правильно догадались, я ожидаю надежного обнаружения в реальном времени. У меня уже есть довольно надежный трекер рук, который не может быть лучше, проблема остается с жестом захвата, нечеткими словами, с жестом захвата пальцем, я хочу вызвать щелчок. ваши последние два абзаца - это то, что я пробовал с классификатором Adaboost, хотя я попытаюсь реализовать его с помощью pcl, так как это звучит хорошо. Как вы думаете, это будет работать для некоторых жестов пальцами, например, для больших пальцев? - person 4nonymou5; 25.02.2014
comment
Если вы посмотрите в конец учебника PCL о неявной модели формы, вы увидите, что классификатор обучен различать 5 классов (включая кошку, лошадь, львицу и волка, что не так просто). Поэтому, если ваши жесты рук/пальцев достаточно разборчивы (например, кулак, открытая ладонь, большой палец вверх, большой палец вниз и т. д.), этот подход имеет хорошие шансы сработать. В любом случае стоит поэкспериментировать с реализацией. - person BConic; 25.02.2014
comment
Да, конечно, я попробую что-нибудь с этим. - person 4nonymou5; 25.02.2014
comment
PCL довольно известен, и многие о нем знают. Регистрация объектов работает для создания 3D-моделей и довольно медленна, в то время как моделирование формы хорошо для распознавания жестких форм, а не сильно деформируемой руки. - person Vlad; 01.03.2014
comment
@ Влад Верно, однако в вопросе ОП вы должны различать две задачи: отслеживание рук и распознавание жестов. Я согласен с тем, что неявная модель формы не подходит для отслеживания рук (я сказал это в своем ответе), однако она очень подходит для распознавания жестов. Неизвестно только совместимость с ограничением реального времени. - person BConic; 01.03.2014
comment
Хорошая точка зрения. Я думал об очень простых жестах, таких как смахивание или нажатие, которые тесно связаны с отслеживанием. Более сложные жесты, конечно, потребуют некоторого обучения и моделирования. Я бы использовал дефекты выпуклости в качестве признаков, поскольку стандартные углы могут плохо моделировать части рук. - person Vlad; 01.03.2014

Быстрый ответ: да, вы можете обучить свой собственный детектор жестов, используя данные о глубине. Это действительно легко, но это зависит от типа жеста.

Предположим, вы хотите обнаружить движение руки:

  1. Определить положение руки (x,y,x). Использование OpenNi просто, так как у вас есть один узел для руки.
  2. Выполните жест и соберите ВСЕ положения руки во время жеста.
  3. С перечнем должностей обучения в НММ. Например, вы можете использовать Matlab, C или Python.
  4. Что касается ваших собственных жестов, вы можете протестировать модель и обнаружить жесты.

Здесь вы можете найти хороший учебник и код (в Matlab). Код (test.m довольно прост). Вот фрагмент:

%Load collected data
training = get_xyz_data('data/train',train_gesture);
testing = get_xyz_data('data/test',test_gesture); 

%Get clusters
[centroids N] = get_point_centroids(training,N,D);
ATrainBinned = get_point_clusters(training,centroids,D);
ATestBinned = get_point_clusters(testing,centroids,D);

% Set priors:
pP = prior_transition_matrix(M,LR);

% Train the model:
cyc = 50;
[E,P,Pi,LL] = dhmm_numeric(ATrainBinned,pP,[1:N]',M,cyc,.00001);

Работа с пальцами почти такая же, но вместо обнаружения руки вам нужно обнаружить пальцы. Поскольку у Kinect нет точек отпечатков пальцев, для их обнаружения необходимо использовать специальный код (с помощью сегментации или отслеживания контуров). Некоторые примеры использования OpenCV можно найти здесь и здесь, но наиболее многообещающей является библиотека ROS, в которой есть узел finger (см. пример здесь).

person phyrox    schedule 25.02.2014
comment
то, что вы когда-либо давали, слишком хорошо, ссылки были бы большим подспорьем. Но ваш ответ в основном касался руки, когда я сказал «хватать», я имел в виду захват движения пальца, извините, я не думал так глубоко, я должен был сформулировать вопрос как жесты пальцев. любое конкретное предложение, основанное на жестах пальцев? поскольку упомянутые коды/алгоритмы в основном связаны с движением руки, а не с конкретным жестом пальцев - person 4nonymou5; 25.02.2014
comment
@4nonymou5 Проверьте редактирование сообщения. Я добавил одну интересную ссылку, связанную с обнаружением пальцев. - person phyrox; 25.02.2014
comment
Да, я сделал что-то подобное, использовал данные о глубине с дефектами выпуклости корпуса и несколько других вещей, это было хорошо, но не способно справиться с моими потребностями, хотя ссылка ROS выглядит чистой, я попробую в этом направлении Кроме того, ваш ответ выглядит впечатляюще. - person 4nonymou5; 25.02.2014
comment
@ 4nonymou5 Я немного поработал с Kinect, и у меня были проблемы с глубиной. Разрешение ИК-камеры было невелико, поэтому вы можете принять это во внимание, особенно если движение по глубине ограничено тем, насколько далеко может двигаться палец. Я, очевидно, не знаком с вашим набором данных, но я думаю, что вам следует об этом помнить. - person wbest; 28.02.2014

Если вам нужно только обнаружение состояния кулака/захвата, вы должны дать Microsoft шанс. Microsoft.Kinect.Toolkit.Interaction содержит методы и события, определяющие состояние захвата/освобождения захвата руки. Взгляните на HandEventType InteractionHandPointer. Это работает довольно хорошо для обнаружения кулака/захвата, но не обнаруживает и не сообщает о положении отдельных пальцев.

Следующий kinect (kinect one) обнаруживает 3 сустава на руку (запястье, кисть, большой палец) и имеет 3 жеста на основе рук: открытие, закрытие (захват/кулак) и лассо (указатель). Если вам этого достаточно, вам следует рассмотреть библиотеки Microsoft.

person Thomas Hetzer    schedule 27.02.2014
comment
Это вторая версия Kinect на основе ToF? Есть ли библиотека для Linux? - person Vlad; 01.03.2014

1) Если есть много ложных срабатываний, вы можете попытаться расширить набор отрицательных выборок классификатора и обучить его снова. Расширенный набор негативных изображений должен содержать такие изображения, где кулак был обнаружен ложно. Возможно, это поможет создать лучший классификатор.

person Milan Tenk    schedule 15.02.2014
comment
да, это был бы выбор, но я подумал, что включение данных о глубине может быть дополнительным преимуществом в другом алгоритме, с помощью которого можно повысить точность. так, больше заинтересованы в этом. - person 4nonymou5; 15.02.2014


Вам может быть интересна эта статья и открытый исходный код:

Надежный шарнирный ICP для отслеживания рук в реальном времени

Код: https://github.com/OpenGP/htrack

Скриншот: http://lgg.epfl.ch/img/codedata/htrack_icp.png< /а>

Видео на YouTube: https://youtu.be/rm3YnClSmIQ

Документ в формате PDF: http://infoscience.epfl.ch/record/206951/files/htrack.pdf

person masterxilo    schedule 02.03.2017