20201216のTensorFlowに関する記事は4件です。

Pythonパッケージ版のMediaPipeが超お手軽 + 簡易なMLPで指ジェスチャー推定

MediaPipe(Pythonパッケージ版)

Pythonパッケージ版のMediaPipeが超お手軽です。

pip install mediapipe

pipでインストールして、、、

import mediapipe as mp

importして、、、

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分類(静止、時計回り、反時計回り、移動)するモデルを
組み合わせて動かしています。
Finger Gesture Demo

「パー」「グー」「指差し」の分類

hand_landmarks.png
手のランドマークのIDはこんな感じ↑なので、、、

preprocess1.png
こんな感じに前処理して、、、(ID:0が最終的に0,0になっているの少々無駄ですが、、、)


こんな感じの簡易なMLPにぶち込んでます?

「静止」「時計回り」「反時計回り」「移動」の分類

preprocess2.png
人差指の座標履歴を16点ほど取って、こんな感じに前処理して、、、(T-15が最終的に0,0になっているの少々無駄ですが、、、)


こんな感じの簡易なMLPにぶち込んでます?

プログラム

上記のプログラムもGithubで公開しています。
適当MLPなので、もっとイカした構造にすると、もっと精度が上がります?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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()

以下が出力結果のグラフです。当然ながら、tf.keras、Pytorchともにほぼ同様の結果が出ます。
スクリーンショット 2020-12-16 20.23.19.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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()

以下が出力結果のグラフです。当然ながら、tf.keras、PyTorchともにほぼ同様の結果が出ます。
スクリーンショット 2020-12-16 20.23.19.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 500GByte

Windowsのアップデート

・先ずは、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 virtualenv

Python のインストールフォルダを確認

> 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.3

OpenCV をインストール

何かと画像処理が必要になることもあるので、OpenCV をインストール

> pip install opencv-python

Object 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-95f26a218cc0

C++ コンパイラのインストール

Object Detection のセットアップで使用する、Visual Studio Build tools を下記のURLからダウンロードして、インストーラーを実行
https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16

build 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 notebook

Object 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] ボタンをクリックして上から順番に実行していく

最後に Object Detecton 画像が表示される(ハズ)
OD-tutrial.JPG
何だか認識精度が低いけど・・・気にしない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む