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

в 15:17, , рубрики: Intel Edison, Intel XDK IoT Edition, IoT, Блог компании Intel, метод опорных векторов, Программирование, программирование микроконтроллеров, разработка, Разработка для интернета вещей

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

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

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

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

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

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

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

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

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

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

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

Чтение показателей датчиков в 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)
    }
});

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

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

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

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

rfkill unblock bluetooth
killall bluetoothd
hciconfig hci0 up

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

hcitool dev

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

node main.js

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

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

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

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

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

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

Заключение

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

Автор: Intel

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js