梶研 [伊達巻成功 & GCN, ST-GCN完全に理解した]
2024年4月16日

伊達巻成功 & GCN, ST-GCN完全に理解した
出席率
- 3年セミナー:??%
スケジュール
短期的な予定
- mocopi と お料理センシング
- シーンとランドマークを決める(~2月上旬)
- SVM で動作判別する
- 機械学習を深める
- 機械学習の手法を知る
- 使う手法を決める
- データセットを探す
- LSTM してみる
- 主成分分析してみる
- クラスタリング
- 自己相関
- お料理センシング
- お料理でどんな動作があるかを知る
- レシピを決める
- センシングする
- ?
- 論文書く
- 発表
- BLEビーコンのuuidを書き換えたい
- 通信内容を読み解く
- shellコマンドで通信してみる
- 実装してみる
- BookWorm
- Pasori と デスクトップアプリを接続する(技術検証)
- nfc読み込み機能 & 画面を作る
- API と連携させる
- 管理者画面を作る
長期的な予定
- ~?月 シーン検知?をする
- ~?月 論文を書く
- ~?月 論文発表したい
進捗報告
目的
料理中の動作を mocopi を使ってセンシングする。
このデータから最終的に位置推定を行う。
- 一定の区間でどの動作をしているかを当てる (クラス分類)
- 料理の手順を元にシーン検知を補正する
- 例) 焼く動作 → 卵割る動作 はおかしい
- 位置とシーンを相補的に補正する
- 例) 冷蔵庫の前で焼く動作 はおかしい
センシングした
完璧でした

生産者の顔

フライパン買ってください
横幅がもう少し広いフライパンが欲しい
動作認識
動画からではないサンプルコードが欲しい
https://colab.research.google.com/github/machine-perception-robotics-group/MPRGDeepLearningLectureNotebook/blob/master/15_gcn/03_action_recognition_ST_GCN.ipynb
よく分からないけど学習が進んだ
# Epoch: 1 | Loss: 0.0359 | Accuracy: 15.0500
# Epoch: 2 | Loss: 0.0345 | Accuracy: 20.2500
# Epoch: 3 | Loss: 0.0338 | Accuracy: 22.5000
# Epoch: 4 | Loss: 0.0327 | Accuracy: 26.2500
# Epoch: 5 | Loss: 0.0312 | Accuracy: 29.1500
# Epoch: 6 | Loss: 0.0298 | Accuracy: 32.5500
# Epoch: 7 | Loss: 0.0285 | Accuracy: 36.1500
# Epoch: 8 | Loss: 0.0265 | Accuracy: 41.6000
# Epoch: 9 | Loss: 0.0237 | Accuracy: 49.0500
...
とても時間がかかったので10回目で止めた
グラフを表示してくれた
斜め (縦と横の軸が同じところ) が濃いほど正確ぽい

何をしているか追ってみる
追ってみたけど全く分かりませんでした.
一旦GCNの理解を頑張る
入力値を生成
仮でランダムに生成する
1X = np.random.randn(num_node, in_channels) + 1
TODO: 動作認識ではこの入力値がどう変わるのか
隣接行列を生成
1E = [[0, 1], [0, 2], [0, 4], [1, 2], [2, 3]] 2# 向きを考慮しないために逆行列を足す 3reversed_E = [[j, i] for [i, j] in E] 4new_E = E + reversed_E 5A = edge2mat(new_E, num_node)
畳み込み
$$
[1,1,1,0,1]
\left[
\begin{array}{c}
v_1 \\
v_2 \\
v_3 \\
v_4 \\
v_5 \\
\end{array}
\right]
= v_1 + v_2 + v_3 + v_5
$$
隣接している部分だけ取り出すみたいな
その結果が右側
(左の X はランダムのため変化しています)

ノードによる偏りがある
TODO: なぜ偏りが良くないのか
偏りの解消
平均を使うと多少解消される
$$
\tilde{\mathbf{D}}^{-1}\tilde{\mathbf{A}}\mathbf{X}
$$
実際は正規化するべき
$$
\tilde{\mathbf{D}}^{-\frac{1}{2}}\tilde{\mathbf{A}}\tilde{\mathbf{D}}^{-\frac{1}{2}}\mathbf{X}
$$
もっと調べる
畳み込みは 特定のノード に隣接するノード間でいい感じに計算するぽい
だから 隣接行列 を作って掛け算していた
動作認識において 隣接行列 は 関節間 の接続を入れればいいぽい
入力は...
- 加速度, 角速度をうまい感じに入れる?
- 角速度から骨格の形(関節の角度)を生成して使う?
https://disassemble-channel.com/deep-learning-gcn/
↓ をみた感じ、人を正面から見た時の各関節の座標を持っているぽい
1fig, ax = plt.subplots(2, 3, figsize=(16.0, 6.0) ) 2for i in range(6): 3 r = i // 3 4 c = i % 3 5 # エッジを描画 6 for e in E: 7 ax[r,c].plot([X[i, e[0], 0], X[i, e[1], 0]], [X[i, e[0], 1], X[i, e[1], 1]], "c") 8 # ノードを描画 9 ax[r,c].scatter(X[i, :, 0], X[i, :, 1], s=7) 10 # その他設定 11 ax[r,c].set_xlim([0, width]) 12 ax[r,c].set_ylim([0, height]) 13 ax[r,c].set_aspect('equal', 'box') 14 ax[r,c].set_xticks([]) 15 ax[r,c].set_yticks([]) 16 ax[r,c].invert_yaxis()
https://zenn.dev/hash_yuki/articles/3b0f782ccffa54
入力値は、腰(ROOT) を原点とした各関節の座標とする?
やること
- 伊達巻センシングする
- BVHの1フレームのデータを入力値として、各関節の座標を出力する関数をいい感じに実装する
- 体の向きをグラフで出せるようにする
- 体の向きから各関節の座標 を修正するようにする
- 前に作成したBVHをPythonで扱う
mcp_persorは大量のデータに対応できない問題に対処する- 必要なフレームだけ読み込むみたいな?
進路関係
余談
歓迎されてきました
下校中

渋谷
下北沢コメダ
弊社オフィス
ボザロの聖地
セカオワの聖地
帰宅

歓迎しました
いちねんせいたくさん
