手話翻訳者:Intel Edisonでサポートベクターメソッドを実装する

音声の問題を抱える3000万人が世界に住んでいます。 他の人と通信するために、彼らは手話を使用します。 しかし、対話者がそのような言語を理解していない場合はどうでしょうか? 言語の壁を克服する方法は? 今日の話は、ジェスチャー認識プロジェクトについてです。 Intel Edisonボードは、特殊なグローブに取り付けられたセンサーから情報を受信し、サポートベクターメソッドを使用してそれを処理し、ジェスチャーに対応する文字を見つけ、スコアリングのためにAndroidアプリケーションに起こったことを送信します。


Intel Edisonとセンサー付きグローブ:手話認識の基礎

Intel Edisonは、偶然ではなく開発の基礎になりました。 まず、サポートベクター方式とリアルタイムデータ処理を実装するための十分なパフォーマンスとRAM容量を備えています。 第二に、EdisonにはBluetoothモジュールが組み込まれており、Androidデバイスとの通信に使用されます。 プロジェクトのプログラム部分に精通したい場合は、 こちらをご覧ください 。 それまでの間、システムの仕組みについてお話します。

ハードウェア


手話認識システムにソースデータを供給するグローブの5本の指のそれぞれに、柔軟なセンサーが固定されています。 センサーの電気抵抗は、曲げに依存します。 したがって、センサーが対応する曲がった指が強いほど、抵抗が大きくなります。


電気抵抗が曲げに依存するセンサー

特に、ここでは、Spectra Symbolによって製造されたサイズが4.5インチの単方向フレキシブルセンサーを使用します。これらは、可変分圧器として動作するアナログ抵抗器です。

KiCadでのグローブの回路基板レイアウトは次のとおりです。


手袋用プリント基板

Intel XDK IoT Editionのセンサー測定値の読み取りは、柔軟なセンサーを操作するためのライブラリを使用して行われます。

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

標準化された形式の各センサーからの情報が必要です。 ソースデータの値のばらつきは非常に大きいため、この形式で解釈することは困難です。 データの予備処理は、最初に最小および最大曲げに対応する値を見つけ、次にこの情報を使用してインジケーターを1.0から2.0の範囲の値にするという事実にあります。 センサーの1つに対するこの操作がコードでどのように見えるかを次に示します。

 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; } 

データの予備処理の後、手話認識システムに転送します。 これは、サポートベクターメソッドに基づく分類子です。

サポートベクターメソッドの実装


サポートベクターマシン(SVM)メソッドは、分類および回帰分析に使用されるデータを分析する教師トレーニングアルゴリズムです。 作業の初期段階では、n個のカテゴリのいずれかに属するトレーニングサンプルのセットがシステムの入力に供給されます。 これらのデータに基づいて、学習アルゴリズムは、新しいインジケーターセットを分類するモデルを構築し、既存のカテゴリの1つに関連付けます。 これは、決定論的なバイナリ線形分類器です。 アルゴリズムは、トレーニングの例に基づいて最適な超平面を見つけます。これにより、新しい例を既存のカテゴリに関連付けることができます。

このプロジェクトでは、最も人気のあるLIBSVM SVMライブラリのJavaScript実装であるnode-svmライブラリを使用します 。 ライブラリをインストールするには、次のコマンドを使用します。

 npm install node-svm 

次に、ライブラリフォルダーをプロジェクトディレクトリにコピーします。 さらに、node-svmライブラリを使用する前に、このライブラリが依存するいくつかの追加のnpmパッケージをインストールする必要があります。


パッケージをインストールするには、次のコマンドを使用します。

 npm install <package name> 

すべてをインストールしたら、分類子を作成し、カーネルパラメーターを構成できます。

 var clf = new svm.CSVC({ gamma: 0.25, c: 1, normalize: false, reduce: false, kFold: 2 //     k  }); 

パラメータCは、トレーニングデータのSVMエラーとクラス間の境界の幅の最大化との関係を制御します。 このパラメーターは、モデルのトレーニング段階で使用され、参照ベクトルの計算時に考慮される外れ値の量を示します。 Cおよびガンマパラメータの最適値は、グリッド検索を使用して決定されます。 ここでは、センサーからの値(測定値)のそれぞれがジェスチャーの分類において重要であるため、データの次元数を削減しません。

作業の次のステップは、モデルを作成することです。分類子をトレーニングし、レポートを作成します。 習得するには数秒かかります。

 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.'); }); 

次に、分類子を使用して、ジェスチャーをリアルタイムで分析します。 1次元配列がシステムの入力に供給され、出力では、特定のグループに属するジェスチャの予測が得られます。 次のコードは、センサーの読み取り値をパラメーターの形式で分類器に渡す方法を示しています。

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

さらに、ソースデータに基づいて、次のコマンドを使用して各クラスの確率を取得できます。

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

分類中に受信したキャラクターは、Edisonで実行されているプログラムがデータの読み取り要求を受信するたびにAndroidデバイスに転送されます。

トレーニングデータファイルの作成


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 

すべてが正常に実行されると、Edison BluetoothアダプターのMACアドレスが応答として表示されます。
メインプログラムを実行します。

 node main.js 

ここで、Android上で実行されるプロジェクトの一部を見てみましょう。

認識されたジェスチャーを発声するためのAndroidアプリケーション


このプロジェクトで使用されるAndroidアプリケーションは、システムの機能を使用してテキストを音声に変換し、認識されたジェスチャを音声で伝えます。 このアプリケーションにより、ユーザーは言語、速度、音声のトーンを調整したり、設定をテストしたりできます。


認識されたジェスチャーを発声するためのアプリ

アプリケーション画面のメインボタンはスキャンです。 Intel Edisonボードを見つけて接続します。 接続後、Androidアプリケーションは参照ベクトルアルゴリズムによって認識されたデータを受信し、ジェスチャに対応する文字を表示および発音します。 これがすべての外観です。



おわりに


手頃な価格のソフトウェア、柔軟なセンサー、Androidスマートフォンを使用して、手話を使ってコミュニケーションの境界を広げるのに役立つシステムを構築する方法について話しました。 ご覧のとおり、ユニバーサルコンポーネントに基づいて、まったく新しいIoTデバイスのプロトタイプを非常に迅速に作成できます。 将来、これは世界をより良い場所にすることができる「もの」の一つです。

Source: https://habr.com/ru/post/J306948/


All Articles