Successfully reported this slideshow.
Your SlideShare is downloading. ×

ジェスチャー認識・予測プログラムの開発【ソニーのNeural Network Console大勉強会#2】

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Tips for passing AZ-103 once
Tips for passing AZ-103 once
Loading in …3
×

Check these out next

1 of 69 Ad

ジェスチャー認識・予測プログラムの開発【ソニーのNeural Network Console大勉強会#2】

Download to read offline

2018年2月27日に開催したイベント「ソニーのNeural Network Console大勉強会#2 ~Neural Network Consoleで始める時系列データ処理入門~」の発表資料です。Neural Network ConsoleとNeural Network Librariesを使って、2次元のジェスチャー認識・予測プログラムを作る方法について発表しました。

2018年2月27日に開催したイベント「ソニーのNeural Network Console大勉強会#2 ~Neural Network Consoleで始める時系列データ処理入門~」の発表資料です。Neural Network ConsoleとNeural Network Librariesを使って、2次元のジェスチャー認識・予測プログラムを作る方法について発表しました。

Advertisement
Advertisement

More Related Content

Similar to ジェスチャー認識・予測プログラムの開発【ソニーのNeural Network Console大勉強会#2】 (20)

Recently uploaded (20)

Advertisement

ジェスチャー認識・予測プログラムの開発【ソニーのNeural Network Console大勉強会#2】

  1. 1. 1 日程:2018年02月27日(火)18:30~21:00 主催:DELTA(Neural Network Libraries / Console 勉強会グループ) 共催:ソニーネットワークコミュニケーションズ株式会社
  2. 2. 2 タイムテーブル
  3. 3. 3 Neural Network Libraries / Console 専門の勉強会兼コミュニティです 目的 • Neural Network Libraries / Console の使い方や応用に関する知見 を蓄積・共有します。 • Neural Network Libraries / Console で使えるデータ・モデル・ ソースコードなどの資産を蓄積・共有します。 • Neural Network Libraries / Console のユーザー間の情報交換・連 携の機会を提供します。
  4. 4. 4 運営方針 • 誰でも参加自由。オープンな勉強会コミュニティ。 • ボランティア運営。参加費無料(※会場費が必要な場合有)。 • 開催頻度は1~2ヶ月に1度。 運営メンバー募集!
  5. 5. 5 ソニーのディープラーニング技術による ジェスチャー認識・予測プログラムの開発 2018年02月27日(火) 神 谷 亮 平
  6. 6. 6 アジェンダ • はじめに  自己紹介  ジェスチャー認識とは • ジェスチャー認識プログラムの開発  データの用意  ジェスチャー認識器の作成  Neural Network Console  ジェスチャー認識器の使用  Neural Network Libraries  ジェスチャー予測プログラムの開発  LSTMでジェスチャー予測
  7. 7. 7 自己紹介 ▼開発経験 ・アルゴリズム/ライブラリ開発(C / C++、Python) ・組み込みソフトウェア開発(C) ・WEBアプリケーション開発(Java、 PHP 、JavaScript、 Python、Go) ・Windowsデスクトップアプリケーション開発(C#) 株式会社LABBIZ 代表取締役 ソフトウェアエンジニア ▼略歴 時計メーカー研究開発職 ⇒ データ分析会社新規事業開発職 ⇒ IoTスタートアップ研究開発職 ⇒ 創業 神谷 亮平 ▼その他 AI Code Hackers(人工知能のコードをハックする会)主催者
  8. 8. 8 株式会社LABBIZ事業紹介 Lab(研究/アイディア)をBiz(ビジネス)に! 起業家/研究者/技術者の挑戦をサポートします
  9. 9. 9 【一般的な意味】 ジェスチャーとは、他の人に何かを伝えるために する身振り手振りのこと(Wikipedia日本語版より)。 【今回の定義】 連続性のある2次元平面上の一連の動き。 一筆書きの軌跡のこと。 ジェスチャーとは
  10. 10. 10 ようするに......
  11. 11. 11 または...... センサデータ ⇒(変換)⇒ 二次元点列 ⇒(認識)⇒ アクション
  12. 12. 12 ジェスチャー認識 プログラムの開発
  13. 13. 13 ①データを用意する ②認識器を作る ③認識器を使う 全体の流れ
  14. 14. 14 ①データを用意する
  15. 15. 15 データセットの作成 1. 以下のプログラムを作成 A) ジェスチャーパターンを入力・記録するプログラム B) ジェスチャーパターンをデータ拡張・整形するプログラム C) 各データの索引を作るプログラム 2. 1のプログラムをA) => B) => C)の順に実行 https://github.com/ryohei-kamiya/2D-GRD プログラムのソースコードは GitHubで公開しています。
  16. 16. 16 ジェスチャーパターンの入力・記録 $ python3 gesture_painter.py SAVE A列:X座標 (0 ~ 255) B列:Y座標 (0 ~ 255) CSVファイル (画像はExcelでオープンしたところ)
  17. 17. 17 実際に入力・記録したデータ クラス数:26クラス パターン数/クラス:10パターン
  18. 18. 18 記録データの整理 ORIGINAL_POINTS_DIR/ a/ b/ y/ z/ 0-1517153926.csv 0-1517154074.csv 0-1517154217.csv 1-1517153930.csv 1-1517154080.csv 1-1517154219.csv クラスごとにディレクトリを作り、 パターンを保存
  19. 19. 19 データ拡張・整形 $ python3 make_datafiles.py ORIGINAL_POINTS_DIR DATASET_DIR ORIGINAL_POINTS_DIR/ a/ b/ c/ x/ y/ z/ 0-1517153926.csv 0-1517154074.csv 0-1517154217.csv DATASET_DIR/ 0-1517153926-0000.csv 0-1517153926-0001.csv 0-1517153926-0002.csv a/ points/ sampled_points/ image/ 0-1517153926-0000.csv 0-1517153926-0001.csv 0-1517153926-0002.csv a/ 0-1517153926-0000.png 0-1517153926-0001.png 0-1517153926-0002.png a/ プログラム実行
  20. 20. 20 データ拡張・整形 DATASET_DIR/ 0-1517153926-0000.csv 0-1517153926-0001.csv 0-1517153926-0002.csv a/ points/ sampled_points/ image/ 0-1517153926-0000.csv 0-1517153926-0001.csv 0-1517153926-0002.csv a/ 0-1517153926-0000.png 0-1517153926-0001.png 0-1517153926-0002.png a/ 点列データ 64点にサンプリングされた 点列データ 画像データ
  21. 21. 21 DATASET_DIR/points/以下の点列データ • 隣接点間の関係の正規化 • 点と点の間を1ピクセル単位で補間 : p[ i + 1 ] = ( p[i].x ± 1, p[i].y ± 1 ) • その後、スケールを右記の通り変更 : -1.0 ≦ x ≦ 1.0, -1.0 ≦ y ≦ 1.0 p[ i – 1 ] p[ i ] p[ i + 1 ] 1.0 / 128.0 = 0.0078125 1.0 / 128.0 = 0.0078125 拡大
  22. 22. 22 DATASET_DIR/sampled_points/以下の点列データ • 点列の長さの正規化 • DATASET_DIR/points/以下の点列データを64点にサンプリング 0.192157 -0.57647 0.176471 -0.57647 0.176471 -0.60784 0.07451 -0.6549 -0.00392 -0.6549 -0.03529 -0.67059 -0.26275 -0.67059 -0.29412 -0.6549 -0.35686 -0.59216 -0.38039 -0.57647 -0.41961 -0.52157 -0.45098 -0.48235 -0.50588 -0.39608 -0.55294 -0.38039 -0.56863 -0.34902 -0.60784 -0.3098 -0.64706 -0.23922 -0.69412 -0.15294 -0.69412 0.003922 -0.7098 0.035294 -0.7098 0.294118 -0.67843 0.32549 -0.67843 0.34902 -0.62353 0.403922 -0.60784 0.403922 -0.55294 0.435294 -0.53726 0.435294 -0.48235 0.466667 -0.19216 0.466667 -0.16863 0.45098 -0.12157 0.435294 -0.10588 0.403922 -0.06667 0.380392 -0.05098 0.34902 -0.00392 0.294118 0.011765 0.262745 0.058824 0.239216 0.105882 0.192157 0.152941 0.105882 0.192157 0.05098 0.223529 0.019608 0.247059 -0.01177 0.278431 -0.12157 0.278431 -0.3098 0.294118 -0.33333 0.294118 -0.38039 0.317647 -0.39608 0.317647 -0.22353 0.333333 -0.15294 0.34902 -0.0902 0.411765 0.035294 0.427451 0.082353 0.458824 0.105882 0.47451 0.160784 0.521569 0.223529 0.537255 0.262745 0.584314 0.294118 0.607843 0.364706 0.678431 0.388235 0.709804 0.419608 0.72549 0.45098 0.811765 0.498039 0.866667 0.498039 0.866667 0.482353 64行2列 の点列 データ ジェスチャー 開始点 ジェスチャー 終了点 サンプリング 長さ不定 の点列 データ ジェスチャー 開始点 ジェスチャー 終了点
  23. 23. 23 DATASET_DIR/image/以下の画像データ • スケールを変えて画像化 • DATASET_DIR/points/以下の点列データのスケールを下記の通り変更して画像化 • 0 ≦ x ≦ 27, 0 ≦ y ≦ 27 (その後、28 pix × 28 pix の画像として保存) 画像化 点列 データ ジェスチャー 開始点 ジェスチャー 終了点 0 ≦ x ≦ 27 0 ≦ x ≦ 27
  24. 24. 24 データ拡張方法 • 非線形の幾何的な複合変換(以降、データ拡張変換と呼ぶ)を適用 ① Gaussianによる空間歪曲 ② Homography変換(射影変換)による空間歪曲 Gaussianの中心点をランダムに選択して歪曲 4隅の点を(制限された範囲で)ランダムに移動 ① ⇒ ②の順に 各々を適用
  25. 25. 25 データ拡張方法 データ拡張変換未適用 1回適用 2回適用
  26. 26. 26 データセット索引作成 DATASET_DIR $ ./make-points-dataset.sh DATASET_DIR $ ./make-spoints-dataset.sh 点列データのデータセット索引ファイルを作成 サンプリングされた点列データのデータセット 索引ファイルを作成
  27. 27. 27 点列データセット索引ファイル • Lサイズデータセット • grd-points-training-l.csv • grd-points-validation-l.csv • grd-points-test-l.csv • Mサイズデータセット • grd-points-training-m.csv • grd-points-validation-m.csv • grd-points-test-m.csv • Sサイズデータセット • grd-points-training-s.csv • grd-points-validation-s.csv • grd-points-test-s.csv A列:点列データファイル B列:正解クラス番号(a = 0, b = 1, ..., z = 25)
  28. 28. 28 サンプリング点列データセット索引ファイル • Lサイズデータセット • grd-sampled_points-training-l.csv • grd-sampled_points-validation-l.csv • grd-sampled_points-test-l.csv • Mサイズデータセット • grd-sampled_points-training-m.csv • grd-sampled_points-validation-m.csv • grd-sampled_points-test-m.csv • Sサイズデータセット • grd-sampled_points-training-s.csv • grd-sampled_points-validation-s.csv • grd-sampled_points-test-s.csv A列:サンプリング点列データファイル B列:正解クラス番号(a = 0, b = 1, ..., z = 25)
  29. 29. 29 各データセットのサイズ • 全体サイズ • 1クラスあたり • データ拡張変換未適用データ:10パターン • データ拡張変換1回適用データ:80パターン • データ拡張変換2回適用データ:640パターン • 全部(26クラス)で18980パターン • Lサイズデータセットサイズ • 学習用データセット:全体サイズの7割 • 検証用データセット:全体サイズの2割 • 評価用データセット:全体サイズの1割 • Mサイズデータセットサイズ • Lサイズデータセットの半分 • Sサイズデータセットサイズ • Mサイズデータセットの半分 クラスごとに730パターン
  30. 30. 30 ②認識器を作る Neural Network Consoleで
  31. 31. 31 Neural Network Console起動
  32. 32. 32 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の設計 入力層 中間層 出力層 損失関数
  33. 33. 33 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の設計 入力データ (サンプリング点列データを使用)に 合わせて「Dataset」「Size」を設定
  34. 34. 34 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の設計 分類先のクラス数と一致するように 「OutShape」を設定
  35. 35. 35 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の設計 学習用データセットのクラス番号の 列の変数(y)と一致するように 「T.Dataset」を設定
  36. 36. 36 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器のデータセット設定 学習用データセット grd-sampled_points-training-l.csv 検証用データセット grd-sampled_points-validation-l.csv 評価用データセット grd-sampled_points-test-l.csv
  37. 37. 37 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器のConfig設定 ExecutorのDatasetにTestを設定 残りは初期値でOK
  38. 38. 38 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の学習
  39. 39. 39 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の評価
  40. 40. 40 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の評価
  41. 41. 41 2層MLP(Multi-Layer Perceptron) ジェスチャー認識器の評価 正解率:99.56% !
  42. 42. 42 ③認識器を使う Neural Network Librariesで
  43. 43. 43 ソースコードのエクスポート
  44. 44. 44 エクスポートできる 2層MLPのソースコード
  45. 45. 45 エクスポートできる 2層MLPのソースコード 学習時など確率値が必要な 場合は必要。 認識・分類処理時は不要。
  46. 46. 46 エクスポートできる 2層MLPのソースコード 学習時には必要。 認識・分類処理時は不要。
  47. 47. 47 ジェスチャー認識プログラム delta2_mlp_gesture_recognizer.py
  48. 48. 48 ジェスチャー認識プログラム キャンバス上で マウスの左ボタンをドラッグして ペイント 認識結果表示 ボタンリリース
  49. 49. 49 ジェスチャー認識プログラム $ python3 delta2_mlp_gesture_recognizer.py -mlp mlp-parameters.h5 -l labels.txt 実行方法 Neural Network Consoleで学習した モデルパラメータファイル クラス番号(行番号)とクラス名を関連づけるファイル 依存ライブラリ • Neural Network Libraries • numpy • tkinter (X Window)
  50. 50. 50 プログラムの全体像 初期化 入力 認識 結果表示 Neural Network Libraries、認識モデルの初期化処理 マウスのドラッグ中のポイントを記録、整形。 認識モデルに投入し、推論処理実行 認識結果表示
  51. 51. 51 モデル初期化処理 delta2_mlp_gesture_recognizer.py Neural Network Libraries 初期化 推論処理クラス初期化
  52. 52. 52 ジェスチャー入力処理 マウスクリック (入力開始) マウスドラッグ (点列入力) マウスリリース (認識実行/結果表示) delta2_mlp_gesture_recognizer.py
  53. 53. 53 ジェスチャー認識処理 スケールと点列 の長さの正規化 推論処理実行 delta2_mlp_gesture_recognizer.py
  54. 54. 54 推論処理クラス 学習済みモデル パラメータ読込 エクスポートした コード 推論処理 delta2_mlp_gesture_recognizer.py
  55. 55. 55 簡単! • プログラムの行数にして、200行くらい • 初期化処理、推論実行処理はほぼ定型文 • ネットワーク部分はコピペ (Neural Network Consoleからエクスポート)
  56. 56. 56 ここまでのまとめ • Neural Network Console / Librariesを使って、 ジェスチャー認識プログラムを作成 • Neural Network Console / Librariesのおかげ で、モデル/プログラム作成は簡単 • 開発はほぼデータを用意するところだけ
  57. 57. 57 ジェスチャー予測 プログラムの開発
  58. 58. 58 ジェスチャー予測プログラム delta2_mlp_with_lstm_gesture_recognizer.py
  59. 59. 59 LSTMで16点先まで予測し、MLPで認識。 (「最新の16点から次の1点を予測」を16回繰り返し) ジェスチャー予測プログラム
  60. 60. 60 入出力データ • 入力データ • 現時刻の点の座標を(0, 0)とした、直近の(過去の) N個の点列の相対位置の時系列データ • 出力データ • 次の(未来の)1点の現時刻の点からの相対位置
  61. 61. 61 入出力データ (0, 0) (0, 0) マウスのポインタの位置が 常に原点になるように平行移動
  62. 62. 62 入出力データ 直近のN点(青色の点列)から 未来の1点(緑色の点)を予測
  63. 63. 63 入出力データ 直近のN-1点(青色の点列)と未来の1点(緑色の点) から、さらに次の未来の1点(黄色の点)を予測
  64. 64. 64 入出力データ N点先まで実行
  65. 65. 65 LSTMの実装 delta2_lstm_trainer.py
  66. 66. 66 LSTMの学習 grd-points-training-s.csvを使用し、 直近の64点から次の1点の相対位置を学習 (点列を1点ずつずらして入力)
  67. 67. 67 予測精度評価 入力点数 平均二乗誤差 ピクセル単位換算 誤差 16 1.115419×10^-5 0.427493 64 1.079881×10^-5 0.420628 grd-points-test-s.csvを使用し、直近の64点から次の1点の相対位置予測を評価 (点列を1点ずつずらして入力) 誤差は1ピクセル以下。 隣接8ピクセルからランダムに選択する 場合の誤差(≒1.54)よりも小さい。
  68. 68. 68 まとめ • Neural Network Librariesを使ってLSTMを 実装し、ジェスチャー予測プログラムを作成 • ソースコードは全てGitHubで公開中 お試しください https://github.com/ryohei-kamiya/2D-GRD
  69. 69. 69 Neural Network Consoleにさらに期待すること • 長さが一定じゃない入力も扱えるとうれしいです • 時系列データを扱うときにほしくなります • 独自のコンポーネントを追加できるとうれしいです • 今回の場合、独自の正規化処理を入れたくなりました • LoopControl系コンポーネントがエクスポートでき るとうれしいです

×