狠狠撸

狠狠撸Share a Scribd company logo
1
日程:2018年02月27日(火)18:30~21:00
主催:DELTA(Neural Network Libraries / Console 勉強会グループ)
共催:ソニーネットワークコミュニケーションズ株式会社
2
タイムテーブル
3
Neural Network Libraries / Console
専門の勉強会兼コミュニティです
目的
? Neural Network Libraries / Console の使い方や応用に関する知見
を蓄積?共有します。
? Neural Network Libraries / Console で使えるデータ?モデル?
ソースコードなどの資産を蓄積?共有します。
? Neural Network Libraries / Console のユーザー間の情報交換?連
携の機会を提供します。
4
運営方針
? 誰でも参加自由。オープンな勉強会コミュニティ。
? ボランティア運営。参加費無料(※会場費が必要な場合有)。
? 開催頻度は1~2ヶ月に1度。
運営メンバー募集!
5
ソニーのディープラーニング技術による
ジェスチャー認識?予測プログラムの開発
2018年02月27日(火)
神 谷 亮 平
6
アジェンダ
? はじめに
? 自己紹介
? ジェスチャー認識とは
? ジェスチャー認識プログラムの開発
? データの用意
? ジェスチャー認識器の作成
? Neural Network Console
? ジェスチャー認識器の使用
? Neural Network Libraries
? ジェスチャー予測プログラムの開発
? LSTMでジェスチャー予測
7
自己紹介
▼開発経験
?アルゴリズム/ライブラリ開発(C / C++、Python)
?組み込みソフトウェア開発(C)
?WEBアプリケーション開発(Java、 PHP 、JavaScript、 Python、Go)
?Windowsデスクトップアプリケーション開発(C#)
株式会社LABBIZ 代表取締役
ソフトウェアエンジニア
▼略歴
時計メーカー研究開発職 ? データ分析会社新規事業開発職
? IoTスタートアップ研究開発職 ? 創業
神谷 亮平
▼その他
AI Code Hackers(人工知能のコードをハックする会)主催者
8
株式会社LABBIZ事業紹介
Lab(研究/アイディア)をBiz(ビジネス)に!
起業家/研究者/技術者の挑戦をサポートします
9
【一般的な意味】
ジェスチャーとは、他の人に何かを伝えるために
する身振り手振りのこと(Wikipedia日本語版より)。
【今回の定義】
連続性のある2次元平面上の一連の動き。
一筆書きの軌跡のこと。
ジェスチャーとは
10
ようするに......
11
または......
センサデータ ?(変換)? 二次元点列 ?(認識)? アクション
12
ジェスチャー認識
プログラムの開発
13
①データを用意する
②認識器を作る
③認識器を使う
全体の流れ
14
①データを用意する
15
データセットの作成
1. 以下のプログラムを作成
A) ジェスチャーパターンを入力?記録するプログラム
B) ジェスチャーパターンをデータ拡張?整形するプログラム
C) 各データの索引を作るプログラム
2. 1のプログラムをA) => B) => C)の順に実行
https://github.com/ryohei-kamiya/2D-GRD
プログラムのソースコードは
GitHubで公開しています。
16
ジェスチャーパターンの入力?記録
$ python3 gesture_painter.py
SAVE
A列:X座標 (0 ~ 255)
B列:Y座標 (0 ~ 255)
CSVファイル
(画像はExcelでオープンしたところ)
17
実際に入力?記録したデータ
クラス数:26クラス
パターン数/クラス:10パターン
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
データ拡張?整形
$ 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
データ拡張?整形
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
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
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
DATASET_DIR/image/以下の画像データ
? スケールを変えて画像化
? DATASET_DIR/points/以下の点列データのスケールを下記の通り変更して画像化
? 0 ≦ x ≦ 27, 0 ≦ y ≦ 27 (その後、28 pix × 28 pix の画像として保存)
画像化
点列
データ
ジェスチャー
開始点
ジェスチャー
終了点 0 ≦ x ≦ 27
0 ≦ x ≦ 27
24
データ拡張方法
? 非線形の幾何的な複合変換(以降、データ拡張変換と呼ぶ)を適用
① Gaussianによる空間歪曲
② Homography変換(射影変換)による空間歪曲
Gaussianの中心点をランダムに選択して歪曲
4隅の点を(制限された範囲で)ランダムに移動
① ? ②の順に
各々を適用
25
データ拡張方法
データ拡張変換未適用
1回適用
2回適用
26
データセット索引作成
DATASET_DIR $ ./make-points-dataset.sh
DATASET_DIR $ ./make-spoints-dataset.sh
点列データのデータセット索引ファイルを作成
サンプリングされた点列データのデータセット
索引ファイルを作成
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
サンプリング点列データセット索引ファイル
? 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
各データセットのサイズ
? 全体サイズ
? 1クラスあたり
? データ拡張変換未適用データ:10パターン
? データ拡張変換1回適用データ:80パターン
? データ拡張変換2回適用データ:640パターン
? 全部(26クラス)で18980パターン
? Lサイズデータセットサイズ
? 学習用データセット:全体サイズの7割
? 検証用データセット:全体サイズの2割
? 評価用データセット:全体サイズの1割
? Mサイズデータセットサイズ
? Lサイズデータセットの半分
? Sサイズデータセットサイズ
? Mサイズデータセットの半分
クラスごとに730パターン
30
②認識器を作る
Neural Network Consoleで
31
Neural Network Console起動
32
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の設計
入力層
中間層
出力層
損失関数
33
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の設計
入力データ
(サンプリング点列データを使用)に
合わせて「Dataset」「Size」を設定
34
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の設計
分類先のクラス数と一致するように
「OutShape」を設定
35
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の設計
学習用データセットのクラス番号の
列の変数(y)と一致するように
「T.Dataset」を設定
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
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器のConfig設定
ExecutorのDatasetにTestを設定
残りは初期値でOK
38
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の学習
39
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の評価
40
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の評価
41
2層MLP(Multi-Layer Perceptron)
ジェスチャー認識器の評価
正解率:99.56% !
42
③認識器を使う
Neural Network Librariesで
43
ソースコードのエクスポート
44
エクスポートできる
2層MLPのソースコード
45
エクスポートできる
2層MLPのソースコード
学習時など確率値が必要な
場合は必要。
認識?分類処理時は不要。
46
エクスポートできる
2層MLPのソースコード
学習時には必要。
認識?分類処理時は不要。
47
ジェスチャー認識プログラム
delta2_mlp_gesture_recognizer.py
48
ジェスチャー認識プログラム
キャンバス上で
マウスの左ボタンをドラッグして
ペイント
認識結果表示
ボタンリリース
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
プログラムの全体像
初期化
入力
認識
結果表示
Neural Network Libraries、認識モデルの初期化処理
マウスのドラッグ中のポイントを記録、整形。
認識モデルに投入し、推論処理実行
認識結果表示
51
モデル初期化処理
delta2_mlp_gesture_recognizer.py
Neural Network Libraries
初期化
推論処理クラス初期化
52
ジェスチャー入力処理
マウスクリック
(入力開始)
マウスドラッグ
(点列入力)
マウスリリース
(認識実行/結果表示)
delta2_mlp_gesture_recognizer.py
53
ジェスチャー認識処理
スケールと点列
の長さの正規化
推論処理実行
delta2_mlp_gesture_recognizer.py
54
推論処理クラス
学習済みモデル
パラメータ読込
エクスポートした
コード
推論処理
delta2_mlp_gesture_recognizer.py
55
簡単!
? プログラムの行数にして、200行くらい
? 初期化処理、推論実行処理はほぼ定型文
? ネットワーク部分はコピペ
(Neural Network Consoleからエクスポート)
56
ここまでのまとめ
? Neural Network Console / Librariesを使って、
ジェスチャー認識プログラムを作成
? Neural Network Console / Librariesのおかげ
で、モデル/プログラム作成は簡単
? 開発はほぼデータを用意するところだけ
57
ジェスチャー予測
プログラムの開発
58
ジェスチャー予測プログラム
delta2_mlp_with_lstm_gesture_recognizer.py
59
LSTMで16点先まで予測し、MLPで認識。
(「最新の16点から次の1点を予測」を16回繰り返し)
ジェスチャー予測プログラム
60
入出力データ
? 入力データ
? 現時刻の点の座標を(0, 0)とした、直近の(過去の)
N個の点列の相対位置の時系列データ
? 出力データ
? 次の(未来の)1点の現時刻の点からの相対位置
61
入出力データ
(0, 0)
(0, 0)
マウスのポインタの位置が
常に原点になるように平行移動
62
入出力データ
直近のN点(青色の点列)から
未来の1点(緑色の点)を予測
63
入出力データ
直近のN-1点(青色の点列)と未来の1点(緑色の点)
から、さらに次の未来の1点(黄色の点)を予測
64
入出力データ
N点先まで実行
65
LSTMの実装
delta2_lstm_trainer.py
66
LSTMの学習
grd-points-training-s.csvを使用し、
直近の64点から次の1点の相対位置を学習
(点列を1点ずつずらして入力)
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
まとめ
? Neural Network Librariesを使ってLSTMを
実装し、ジェスチャー予測プログラムを作成
? ソースコードは全てGitHubで公開中
お試しください
https://github.com/ryohei-kamiya/2D-GRD
69
Neural Network Consoleにさらに期待すること
? 長さが一定じゃない入力も扱えるとうれしいです
? 時系列データを扱うときにほしくなります
? 独自のコンポーネントを追加できるとうれしいです
? 今回の場合、独自の正規化処理を入れたくなりました
? LoopControl系コンポーネントがエクスポートでき
るとうれしいです

More Related Content

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