- 投稿日:2020-12-16T23:56:26+09:00
Pythonパッケージ版のMediaPipeが超お手軽 + 簡易なMLPで指ジェスチャー推定
- この記事はTensorFlow Advent Calendar 2020の9日目の記事です。
MediaPipe(Pythonパッケージ版)
Pythonパッケージ版のMediaPipeが超お手軽です。
pip install mediapipe
pipでインストールして、、、
import mediapipe as mpimportして、、、
mp_hands = mp.solutions.hands hands = mp_hands.Hands( min_detection_confidence=0.7, min_tracking_confidence=0.5, )インスタンス作って、、、
image = cv2.imread('XXXXXXXX.jpg') image = cv2.cvtColor(image, cv.COLOR_BGR2RGB) results = hands.process(image)process()に画像投げ込んだら、手のランドマークをゲット?!
※別途、描画処理が必要です。CPU動作でもかなり早い!
むしろGPU対応していない気がする(ドキュメントのどっかに非対応な旨が書いてあるはあず、、、MediaPipe(Pythonパッケージ版)がサポートする機能(2020/12/17時点)
Pythonパッケージ版のMediaPipeは、現時点で以下の4機能をサポートしています。
Hands
Pose
Face Mesh
Holistic(Pose, Face Mesh, Handsを一度に推定)
MediaPipe(Pythonパッケージ版)サンプルプログラム
おまけ:簡易なMLPで指ジェスチャー推定
あまりにも簡単に手のランドマークが取れるようになったので、
簡易なMLPと組み合わせて、以下のようなプログラムも作ってみました。
せっかくMediaPipe自体の動作が早いので、なるべく邪魔しないようにTensorflow-Lite
で作っています。手のランドマーク座標を入力に3分類(パー、グー、指差し)するモデルと、
指差し時の軌跡を入力に4分類(静止、時計回り、反時計回り、移動)するモデルを
組み合わせて動かしています。
「パー」「グー」「指差し」の分類
こんな感じに前処理して、、、(ID:0が最終的に0,0になっているの少々無駄ですが、、、)「静止」「時計回り」「反時計回り」「移動」の分類
人差指の座標履歴を16点ほど取って、こんな感じに前処理して、、、(T-15が最終的に0,0になっているの少々無駄ですが、、、)プログラム
上記のプログラムもGithubで公開しています。
適当MLPなので、もっとイカした構造にすると、もっと精度が上がります?
- 投稿日:2020-12-16T20:29:11+09:00
Pytorch初挑戦の記録、tf.kerasとの比較実装
連載中?の会議見える化シリーズ、この先に進むにはPytorchやtorchaudioを使っていく必要がありそうです。そのため、Pytorchに入門してみました。その記録です。
こちらの記事では、Pytorchとtf.kerasとの比較も述べられています。それぞれお互いの長所を取り込みつつ進化しており、対応力を広げていくにはPytorchとtf.kerasのバイリンガルになっておく必要がありそうです。Udemyには、Pythonや機械学習の基礎は知ってますよ、という人向けのPytorch入門コースがあり、参考になります。
実装テーマとしては以下としています。
- 4次関数(+乱数ノイズ)を多層パーセプトロン(MLP)で近似
- train〜testの2分割モデル、validationは作らない
- testの精度は計算せずに、testデータと推論結果をグラフ表示する
4次関数を題材にしたのは、単純でありながら、多層のありがたみがそれなりに出るからです。
tf.kerasは伝統的?なSequential型の実装をしていますが、Pytorch風の実装も可能とのことです。今回の実装方法で比較すると、tf.kerasは記述の抽象度が高く、Pytorchはいろいろ記述が必要ですがpython風の記述であるためカスタマイズがしやすいように感じます。
一方、Pytorchはtorch.Tensor型への依存度が高く、scipyとかpandasとかsklearnとかのnumpyエコシステムを直接活用できないもどかしさがあります。実際、今回使ったsklearnのtrain_test_splitに対してのピッタリしたPytorch側のライブラリが無いため(torch.utils.data.random_splitを使うようですがピッタリしない・・・)、最初はnumpyで仕立てつつ、途中でtorch.Tensorに変換してみました。
以下がtf.kerasでの実装です。10か月前の機械学習入門時の記事と比較して、個人的にこなれた感があるなーと思いました。
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense # データ作成 x = np.linspace(-1.5, 1.5, 1000) noise = np.random.randn(1000) * 0.1 y = x ** 4 - 2 * x ** 2 + noise x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8) # モデル作成 model = Sequential([ Dense(128, input_dim=1, activation='relu'), Dense(64, activation='relu'), Dense(32, activation='relu'), Dense(16, activation='relu'), Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics='mse') # 学習 result = model.fit(x_train, y_train, batch_size=128, epochs=500) # 推論 y_pred = model.predict(x_test) # 結果表示 plt.scatter(x_test, y_test) plt.scatter(x_test, y_pred, color='red') plt.show()以下がPytorchでの実装です。
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split import torch import torch.nn as nn # データ作成 x = np.linspace(-1.5, 1.5, 1000) noise = np.random.randn(1000) * 0.1 y = x ** 4 - 2 * x ** 2 + noise x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8) # numpyからtorch.Tensorへの変換 x_train = torch.from_numpy(x_train.astype(np.float32)).view(-1, 1) x_test = torch.from_numpy(x_test.astype(np.float32)).view(-1, 1) y_train = torch.from_numpy(y_train.astype(np.float32)).view(-1, 1) y_test = torch.from_numpy(y_test.astype(np.float32)).view(-1, 1) # モデル作成 class MLP(nn.Module): def __init__(self): super().__init__() self.classifier = nn.Sequential( nn.Linear(1, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 16), nn.ReLU(), nn.Linear(16, 1) ) def forward(self, x): x = self.classifier(x) return x model = MLP() criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters()) # 学習 for epoch in range(500): optimizer.zero_grad() y_pred = model(x_train) loss = criterion(y_pred, y_train) loss.backward() optimizer.step() print(f'epoch: {epoch}, loss: {loss.item()}') # 推論 y_pred = model(x_test) # 結果表示 plt.scatter(x_test, y_test) plt.scatter(x_test, y_pred.detach(), color='red') plt.show()
- 投稿日:2020-12-16T20:29:11+09:00
PyTorch初挑戦の記録、tf.kerasとの比較実装
連載中?の会議見える化シリーズ、この先に進むにはPyTorchやtorchaudioを使っていく必要がありそうです。そのため、PyTorchに入門してみました。その記録です。
2020/12/20: PyTorchのコードをDataset、DataLoaderを使うものに修正しました。
こちらの記事では、PyTorchとtf.kerasとの比較も述べられています。それぞれお互いの長所を取り込みつつ進化しており、対応力を広げていくにはPyTorchとtf.kerasのバイリンガルになっておく必要がありそうです。Udemyには、Pythonや機械学習の基礎は知ってますよ、という人向けのPyTorch入門コースがあり、参考になります。
実装テーマとしては以下としています。
- 4次関数(+乱数ノイズ)を多層パーセプトロン(MLP)で近似
- train〜testの2分割モデル、validationは作らない
- testの精度は計算せずに、testデータと推論結果をグラフ表示する
4次関数を題材にしたのは、単純でありながら、多層のありがたみがそれなりに出るからです。
tf.kerasは伝統的?なSequential型の実装をしていますが、PyTorch風の実装も可能とのことです。今回の実装方法で比較すると、tf.kerasは記述の抽象度が高く、PyTorchはいろいろ記述が必要ですがpython風の記述であるためカスタマイズがしやすいように感じます。
一方、PyTorchはtorch.Tensor型への依存度が高く、scipyとかpandasとかsklearnとかのnumpyエコシステムを直接活用できないもどかしさがあります。早い段階でtorch.Tensor型を前提としたPyTorchの世界に移る必要があります。具体的には、torch.utils.data.Dataset型にデータをまとめ、前処理はtransformで行い、torch.utils.data.DataLoader型を介して学習やテストを行うのがPyTorch的です。
以下がtf.kerasでの実装です。10か月前の機械学習入門時の記事と比較して、個人的にこなれた感があるなーと思いました。
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense # データ作成 x = np.linspace(-1.5, 1.5, 1000) noise = np.random.randn(1000) * 0.1 y = x ** 4 - 2 * x ** 2 + noise x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8) # モデル作成 model = Sequential([ Dense(128, input_dim=1, activation='relu'), Dense(64, activation='relu'), Dense(32, activation='relu'), Dense(16, activation='relu'), Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics='mse') # 学習 result = model.fit(x_train, y_train, batch_size=128, epochs=100) # 推論 y_pred = model.predict(x_test) # 結果表示 plt.scatter(x_test, y_test) plt.scatter(x_test, y_pred, color='red') plt.show()以下がPyTorchでの実装です。
import numpy as np import matplotlib.pyplot as plt import torch import torch.nn as nn from torch.utils.data import DataLoader, Dataset, TensorDataset, random_split # データ作成 x = np.linspace(-1.5, 1.5, 1000) noise = np.random.randn(1000) * 0.1 y = x ** 4 - 2 * x ** 2 + noise dataset = TensorDataset(torch.tensor(x).float().view(-1, 1), torch.tensor(y).float().view(-1, 1)) n_train = int(len(dataset) * 0.8) n_test = len(dataset) - n_train train_dataset, test_dataset = random_split(dataset, [n_train, n_test]) train_dataloader = DataLoader(train_dataset, batch_size=128 , shuffle=True) test_dataloader = DataLoader(test_dataset, batch_size=n_test, shuffle=True) # モデル作成 class MLP(nn.Module): def __init__(self): super().__init__() self.classifier = nn.Sequential( nn.Linear(1, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 16), nn.ReLU(), nn.Linear(16, 1) ) def forward(self, x): x = self.classifier(x) return x model = MLP() criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters()) # 学習 for epoch in range(100): running_loss = 0.0 for x_train, y_train in train_dataloader: optimizer.zero_grad() y_pred = model(x_train) loss = criterion(y_pred, y_train) loss.backward() running_loss += loss.item() optimizer.step() running_loss /= len(train_dataloader) print(f'epoch: {epoch}, loss: {running_loss}') # 推論 x_test, y_test = iter(test_dataloader).next() y_pred = model(x_test) # 結果表示 plt.scatter(x_test, y_test) plt.scatter(x_test, y_pred.detach(), color='red') plt.show()
- 投稿日:2020-12-16T02:20:11+09:00
WindowsにTensorflow1.15のObject Detection 環境を作ってみた。
Tensorflow の Object Detection API を今更ながら、Windows10 で試したので、構築からAPIのデモまでのメモです。
他の人もいっぱい書いているので需要があるか分からないけど、 Qiita 初投稿の練習も兼ねて書いてみた。インストール環境
・OS:Windows 10 Home バージョン 1909
・CPU:Intel core i5-2450M
・メモリ:8G
・HDD:SSD 500GByteWindowsのアップデート
・先ずは、Windows Update で更新プログラムの更新を行う。
注意:20H2 への機能更新はしないでください。(2020/12/12時点)
numpyが対応していないようで、Object Detection APIのセットアップでエラーを吐きます。
間違えて更新してしまった場合、10日間は戻せますので、「設定」→「更新とセキュリティ」→「回復」から更新を戻す。
Pythonのインストール
WindowsのPythonをダウンロードして、インストールする。
Python japan の下記URL を参照し、パッケージのダウンロードを参考に Python のパッケージ(python-3.7.9-amd64.exe)をダウンロードしてインストーラーを実行
https://www.python.jp/install/windows/install.html
注)Tensorflow 1.15 が対応している Python のバージョンが 3.7 なので、バージョンを間違えないよう注意Python virtualenv のインストール・仮想環境の作成
今後、色々なバージョンの Python や Tensorflow を利用する可能性を考え、virtualenv を導入しておく。
Anaconda でも良かったのですが、有償化の規約がちょっとアレだったので、virtualenv を利用コマンドプロンプトを実行して、下記のコマンドで virtualenv をインストール
> pip install virtualenvPython のインストールフォルダを確認
> where python C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python37\python.exe C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps\python.exe仮想環境の作成時に \AppData\Local\Programs\ の方のPython を指定
仮想環境を作成
仮想環境名には利用する Tensorflow のバージョンを指定することにした。> python -m virtualenv --python=C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python37\python.exe tf-1153仮想環境に入るとコマンドプロンプトに仮想環境名が表示される。
> tf-1153\Scripts\activate (tf-1153) C:\Users\[ユーザ名]>Git をインストール
下記のGitのサイトからインストーラーをダウンロードし、インストーラーを実行します。
https://gitforwindows.org/基本的には、設定の変更を行わず「Next >」ボタン進み、「Install」ボタンでそのままインストールしてOKです。
Tensorflow をインストール
Tensorflow のバージョン 1.15.3 をインストール
パソコンに NVIDIA の GPU がついている場合は、CUDA や cuDNN など 必要なモジュールをインストールしたうえで「tensorflow」を「tensorflow-gpu」に変更して GPU 対応版の Tensorflow をインストール> pip install tensorflow==1.15.3OpenCV をインストール
何かと画像処理が必要になることもあるので、OpenCV をインストール
> pip install opencv-pythonObject Detection API のモジュールを取得
作業用のフォルダを作成
> mkdir wtf1153 > cd wtf1153 (tf-1153) C:\Users\[ユーザ名]\wtf1153>github から Object Detection API を取得
> git clone https://github.com/tensorflow/models
protocol buffers をインストール
Tensorflow で利用するモジュールをインストール
・github から Windows 用のバイナリ(protoc-3.14.0-win64.zip)をダウンロードする。
https://github.com/protocolbuffers/protobuf/releases/
・ダウンロードしたバイナリを適当なフォルダに展開
・C:\Program Files\
フォルダの下にフォルダ「protoc」を作成
・展開した protocol buffers を作成した「protoc」フォルダに移動
C:\Program Files\protoc\protoc-3.14.0-win64
・protoc フォルダに path を通す
①[スタート]を右クリック → [システム]の「システム情報」をクリック → [システム]の「システムの詳細設定」をクリック → [システムのプロパティ]を表示
②[詳細設定]タブ下の[環境変数(N)…]ボタンをクリック
③[ユーザ名]のユーザー環境変数(U)Path
を選択し、[編集(E)…]ボタンをクリック
④環境変数名の編集で[新規(N)]ボタンをクリックし、C:\Program Files\protoc\protoc-3.14.0-win64\bin\
を入力
⑤[OK]ボタンをクリックして「環境変数名の編集」「環境変数」「システムのプロパティ」を閉じる
⑥新しいコマンドプロンプトを実行し、protocのバージョンを確認> protoc --version libprotoc 3.14.0バージョンが表示されれば、protocol buffers のインストールは完了
Object Detection で利用する protocol buffers のモジュールをコンパイル
> tf-1153\Scripts\activate (tf-1153)> cd wtf1153\modules\research (tf-1153)> protoc object_detection\protos\*.proto --python_out=.
object_detection\protos
に拡張子が.py
のファイルが出来ていれば完了C++ ランタイムライブラリのインストール
Object Detection のセットアップで使用する、VC++ のランタイムを下記のURLからダウンロードして、インストーラーを実行
https://support.microsoft.com/ja-jp/topic/%E6%9C%80%E6%96%B0%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B-visual-c-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-2647da03-1eea-4433-9aff-95f26a218cc0C++ コンパイラのインストール
Object Detection のセットアップで使用する、Visual Studio Build tools を下記のURLからダウンロードして、インストーラーを実行
https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16build Tools が起動したら、
C++ Build Tools
を選択してインストールを実行Object Detection のセットアップ
Object Detection のセットアップファイルをコピーして、セットアップを実行
(tf-1153)> copy object_detection/packages/tf1/setup.py . (tf-1153)> python -m pip install .Object Detection のセットアップ結果を確認
セットアップ結果の確認を行うツールを実行し、セットアップが正常に行えていることを確認
(tf-1153)> python object_detection/builders/model_builder_tf1_test.py ~ ~ ---------------------------------------------------------------------- Ran 21 tests in 0.290s OK (skipped=1)最後に
OK (skipped=1)
と表示されていれば、Object Detection 環境の構築は完了Jupyter notebook のインストール、起動
動作確認のチュートリアルを実行するため、Jupyter notebookをインストール
(tf-1153)> pip install notebookObject Detectopn のチュートリアル実行
チュートリアルを実行するための、
.ipynb
を取得(tf-1153)> cd %homepath%\wtf1153 (tf-1153)> git clone https://github.com/Mogtan3939/tf115-od-tutorial.git (tf-1153)> cd tf115-od-tutorial (tf-1153)> jupyter notebookブラウザが起動し Jupyter notebook の起動フォルダのファイル一覧が表示される。
チュートリアルファイルOD-tf1153-test01.ipynb
をクリック
チュートリアルが新規タブで表示れるので [▶Run] ボタンをクリックして上から順番に実行していく