company_banner

Переводчик с языка жестов: реализация метода опорных векторов на Intel Edison

Original author: Roy Allela
  • Translation
В мире живёт 30 миллионов человек, имеющих проблемы с речью. Для того, чтобы общаться с окружающими, они пользуются языком жестов. А что, если собеседник такого языка не понимает? Как преодолеть языковой барьер? Наш сегодняшний рассказ посвящён проекту распознавания жестов. Плата Intel Edison принимает сведения от датчиков, закреплённых на специальной перчатке, обрабатывает их с использованием метода опорных векторов, узнаёт, какой букве соответствует жест, и отправляет то, что получилось, Android-приложению для озвучивания.


Intel Edison и перчатка с датчиками: основа системы распознавания языка жестов

Intel Edison стал основой нашей разработки не случайно. Он, во-первых, обладает достаточной производительностью и объёмом оперативной памяти для реализации метода опорных векторов и обработки данных в реальном времени. Во-вторых, в Edison встроен Bluetooth-модуль, который используется для связи с Android-устройством. Если вам не терпится ознакомиться с программной частью проекта, загляните сюда. А мы пока расскажем о том, как устроена наша система.

Аппаратная часть


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


Датчик, электрическое сопротивление которого зависит от изгиба

В частности, здесь мы пользуемся однонаправленными гибкими датчиками размером 4,5" производства Spectra Symbol. Они представляют собой аналоговые резисторы, которые работают как переменные делители напряжения.

Вот как выглядит схема печатной платы для перчатки в KiCad.


Печатная плата для перчатки

Чтение показателей датчиков в Intel XDK IoT Edition выполняется с помощью библиотеки для работы с гибкими датчиками.

var flexSensor_lib = require('jsupm_flex');
var Flex1 = new flexSensor_lib.Flex(4);

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

var ScaleMin = 1.0;
var ScaleMax = 2.0;
var flexOneMin = 280;
var flexOneMax = 400;

var flex1 = (scaleDown(Flex1.value(), flexOneMin, flexOneMax)).toFixed(2);

function scaleDown(flexval, flexMin, flexMax) {

    var new_val = (flexval - flexMin) / (flexMax - flexMin) * ((ScaleMax - ScaleMin) + ScaleMin);

    return new_val;
}

После предварительной обработки данных мы передаём их в систему распознавания языка жестов. Это – классификатор, основанный на методе опорных векторов.

Реализация метода опорных векторов


Метод опорных векторов (support vector machine, SVM) – это алгоритм обучения с учителем, который анализирует данные, используемые для классификации и регрессионного анализа. На начальном этапе работы на вход системы подаётся набор обучающих примеров, каждый из которых принадлежит одной из n категорий. На основе этих данных алгоритм обучения строит модель, которая классифицирует новые наборы показателей, относя их к одной из существующих категорий. Это – детерминированный бинарный линейный классификатор. На основе обучающих примеров алгоритм находит оптимальную гиперплоскость, что позволяет ему относить к существующим категориям новые примеры.

В проекте мы пользуемся библиотекой node-svm – JavaScript-реализацией одной из наиболее популярных SVM-библиотек LIBSVM. Для установки библиотеки используется такая команда:

npm install node-svm

Затем мы копируем папку библиотеки в директорию проекта. Кроме того, перед использованием библиотеки node-svm, нужно установить некоторые дополнительные npm-пакеты, от которых эта библиотека зависит:

  • Stringify-object.
  • Mout.
  • Graceful-fs.
  • Optimist.
  • Osenv.
  • Numeric.
  • Q.
  • underscore.

Для установки пакетов используется команда такого вида:

npm install <package name>

После того, как всё установлено, мы можем создать классификатор и настроить параметры ядра:

var clf = new svm.CSVC({
    gamma: 0.25,
    c: 1,
    normalize: false,
    reduce: false,
    kFold: 2 // включаем перекрёстную проверку по k блокам
});

Параметр C управляет соотношением между ошибками SVM на тренировочных данных и максимизацией ширины границы между классами. Этот параметр используется на стадии обучения модели и указывает на то, насколько будут учитываться выбросы при вычислении опорных векторов. Наилучшие значения для параметров C и gamma определяются с использованием поиска по сетке. Здесь мы не выполняем уменьшение размерности данных, так как каждое из значений (измерений), поступающих от датчиков, важно в классификации жестов.

Следующий шаг нашей работы заключается в построении модели: в обучении классификатора и создании отчёта. На обучение уходит несколько секунд.

svm.read(fileName)
    .then(function (dataset) {
        return clf.train(dataset)
            .progress(function (progress) {
                console.log('training progress: %d%', Math.round(progress*100));
            });
    })
    .spread(function (model, report) {
        console.log('SVM trained. \nReport:\n%s', so(report));
    }).done(function () {
        console.log('Training Complete.');
    });

Затем классификатор используется для анализа жестов в реальном времени. На вход системы подаётся одномерный массив, на выходе получаем предсказание о принадлежности жеста к той или иной группе. В этом фрагменте кода показано, как мы передаём в классификатор показания датчиков в виде параметров:

prediction = clf.predictSync([flex1, flex2, flex3, flex4, flex5]);

Кроме того, на основе исходных данных можно получить вероятность для каждого класса, воспользовавшись такой командой:

probability= clf.predictProbabilitiesSync ([flex1, flex2, flex3, flex4, flex5]);

Полученный в ходе классификации символ передаётся на Android-устройство каждый раз, когда программа, работающая на Edison, получает запрос на чтение данных.

Создание файла с обучающими данными


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

Он находится в файле logtrainingdata.js:

var data = "X" + " " + "1:" + f1ex1 + " " + "2:" + flex2 + " " + "3:" + flex3 + " " + "4:" + flex4 + " " + "5:" + flex5 + "\n";
//X это текущая буква алфавита, распознавать которую мы учим систему. Буквам поставлены в соответствие цифры. Например: A=0, B=1,C=2…
//присоединим данные к файлу с набором данных
fs.appendFile('training.ds', data, function(err) {
    if (err) {
        console.log(err)
    }
});


Фрагмент файла с данными для обучения системы

Подготовка Edison и запуск программы


Прежде чем Android-устройство сможет обмениваться данными с приложением, запущенным на Edison, на плате нужно включить Bluetooth. Делается это так:

rfkill unblock bluetooth
killall bluetoothd
hciconfig hci0 up

Проверить, заработал ли Bluetooth-модуль, можно такой командой:

hcitool dev

Если всё идёт так, как нужно, в ответ будет выведен MAC-адрес Bluetooth-адаптера Edison.
Запустим основную программу:

node main.js

А теперь взглянем на ту часть проекта, которая работает на Android.

Android-приложение для озвучивания распознанных жестов


Приложение для Android, применяемое в нашем проекте, использует возможности системы по преобразованию текста в речь, и, таким образом, озвучивает распознанные жесты. Приложение даёт пользователю возможность настроить язык, скорость и тон речи, а также – протестировать установки.


Приложение для озвучивания распознанных жестов

Главная кнопка на экране приложения – это Scan. Она служит для поиска платы Intel Edison и подключения к ней. После подключения Android-приложение принимает данные, распознанные алгоритмом опорных векторов, выводит на экран и произносит букву, соответствующую жесту. Вот, как всё это выглядит.



Заключение


Мы рассказали о том, как, используя Intel Edison, доступное ПО, гибкие датчики и Android-смартфон, построить систему, которая способна помочь тем, кто пользуется языком жестов, расширить границы общения. Как видите, на основе универсальных компонентов можно очень быстро создать прототип совершенно нового IoT-устройства. В перспективе это – одна из тех «вещей», которые способны сделать мир лучше.
Intel
Company

Comments 8

    +3
    Хм. IMHO если бы человека снимали камерой, которая распознает жесты — это было бы более актуально.
    А использование специального девайся (перчатки) — почему бы просто не набирать на тачскрине или клавиатуре — быстрее и универсальнее.
      0
      Ага, а главное то, что вряд ли этот девайс кроме алфавита что-то может распознавать. Есть жесты, которые требуют не просто сложение пальцев в определенном положении, но и перемещение всей руки в пространстве + могут понадобиться две руки.
        0
        Не только руки, но и жестикуляция всем телом, особенно мимикой лица.
        0
        Я подозреваю, что разница в ощущениях говорящего. Для нас говорить — это одно, для них — другое, но никто из нас не воспринимает набор на тачскрине как «говорить». Не говоря уже о том, что по моим наблюдениями скорость «речи» с помощью жестов почти не уступает обычной речи, тогда как набор текста на тачскрине значительно медленнее.
          0
          Хм… клавогонки.ру с вами не согласятся в плане скорости набора.

          С другой стороны, с помощью жестов произносят не буквы, а слова а то и понятия целиком, включая передачу оттенков — слово «прожестикулированное» с сарказмом, само по себе не может быть записано адекватно. Где-то нужно указать, что гг саркастично ухмыльнулся.
          Но девайс из статьи вроде сканирует только буквы…
        0
        Уже было подобное «Изобретение»: Проект Enable Talk.
          –1
          Думается, это правильное направление — на мой взляд, самое уродливое в компьютере — это клавиатура (в том числе и электронные аналоги)
          Пргонозирую, что ввод жестами (с дивайсным или прямым распознаванием) задвинет клавиатуру в прошлое
            0

            возможно, но маловероятно

          Only users with full accounts can post comments. Log in, please.