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

У світі живе 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-пристрої. У перспективі це – одна з тих «речей», які здатні зробити світ краще.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.