- 投稿日:2019-05-29T16:40:07+09:00
CustomVision と Edge デバイス(de:code2019パーソナルスポンサー 提供サンプルコード)
Microsoft Azure Cogniyive ServicesのCustomVision(以下 CustomVisionと表記します)を利用すると独自のオブジェクト認識モデルを簡単に作ることができます。作成したモデルはREST APIから利用することもできますが、モデルを出力してスタンドアローンで利用することもできます。
今回のサンプルコードではCustomVisionで7種類の犬を判別するモデルを作成し、出力したモデルを使ってRaspberryPi上で推論を実行してみます。実行環境
RaspberryPi3(Raspbian Stretch 04/08)
Tensorflow 1.13
OpenCV4.1.0Windows10 PC(CustomVisionのモデル作成に使用)
ブラウザが利用できればなんでも可モデルの作成
・次のURLからサンプルコードをPCにダウンロードします。
・ダウンロードしたフォルダにある「dogs.zip」を解凍します。
・CustomVisionのサイトにログインします。
・次の画面で
「Name(任意)」、
「Project Types:Object Detection」、
「Domains:General(compact)」、
「Export Capabilities:Basic platforms」
を入力します。
・続いてアップロードした画像のアノテーションを行います。
マウスカーソルを対象のオブジェクトに近づけると枠が表示されるのでサイズを調整して、タグ名を登録します。もし枠が表示されない場合は対象をドラッグして囲みます。アップロードした画像すべてにタグをつけていきます。
・アノテーションが完了したら「testset」以外残りの画像もフォルダごとに同様の作業を繰り返します。
・すべての作業が完了したら、「Performance」タブをクリックします。「Train」ボタンをクリックし、トレーニングを開始します。
・モデルの出力形式を選択します。「Tensorflow」を選んでください。
・次の「Download」ボタンをクリックしてPCに保存します。
・ダウンロードしたファイルを解凍し、「model.pb」、「label.txt」をRaspberryPiに用意したサンプルコードのディレクトリにコピーします。
・RaspberryPiのターミナルを起動して、サンプルコードのディレクトリに移動します。
・コマンドラインから「python3 predict.py (認識させる画像ファイル)」を実行します。
・無事認識されたら犬が写っている範囲と犬種、確率が表示されます。
- 投稿日:2019-05-29T00:45:29+09:00
多層パーセプトロン [TensorFlow2.0でDeep Learning 3]
(目次はこちら)
はじめに
多層パーセプトロン [TensorFlowでDeep Learning 3]をtensorflow2.0で実現するためにはどうしたらいいのかを書く(
tf.keras
)。コード
Python: 3.6.8, Tensorflow: 2.0.0a0で動作確認済み
多層パーセプトロン [TensorFlowでDeep Learning 3] (mnist_softmax_fc.py)を書き換えると、
v2/mnist_softmax_fc.pyfrom helper import * IMAGE_SIZE = 28 * 28 CATEGORY_NUM = 10 LEARNING_RATE = 0.1 FEATURE_DIM = 100 EPOCHS = 30 BATCH_SIZE = 100 LOG_DIR = 'log_softmax_fc' EPS = 1e-10 def loss_fn(y_true, y): y = tf.clip_by_value(y, EPS, 1.0) return -tf.reduce_sum(y_true * tf.math.log(y), axis=1) class Dense(tf.keras.layers.Layer): def __init__(self, units, activation, *args, **kwargs): super().__init__(*args, **kwargs) self.units = units self.activation = tf.keras.activations.get(activation) def build(self, input_shape): input_dim = int(input_shape[-1]) self.W = self.add_weight( name='weight', shape=(input_dim, self.units), initializer=tf.keras.initializers.GlorotUniform() ) self.b = self.add_weight( name='bias', shape=(self.units,), initializer=tf.keras.initializers.Zeros() ) self.built = True def call(self, x): if self.activation is None: raise Exception('Activation function is None') return self.activation(tf.matmul(x, self.W) + self.b) if __name__ == '__main__': (X_train, y_train), (X_test, y_test) = mnist_samples(flatten_image=True) model = tf.keras.models.Sequential() model.add(Dense(FEATURE_DIM, input_shape=(IMAGE_SIZE,), activation='relu')) model.add(Dense(CATEGORY_NUM, input_shape=(FEATURE_DIM,), activation='softmax')) model.compile(loss=loss_fn, optimizer=tf.keras.optimizers.SGD(LEARNING_RATE), metrics=['accuracy']) cb = [tf.keras.callbacks.TensorBoard(log_dir=LOG_DIR)] model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, callbacks=cb, validation_data=(X_test, y_test)) print(model.evaluate(X_test, y_test))と書ける。結局2つの層は活性化関数が異なるだけなのでそれを引数として渡せるように変更。
で、この、Dense
クラスは、tf.keras.layers.Dense
(tensorflow/python/keras/layers/core.py)とほぼ同じものなので、
わざわざ定義する必要は全くなく、シンプルに書ける。v2/mnist_softmax_fc_simple.pyfrom helper import * IMAGE_SIZE = 28 * 28 CATEGORY_NUM = 10 LEARNING_RATE = 0.1 FEATURE_DIM = 100 EPOCHS = 30 BATCH_SIZE = 100 LOG_DIR = 'log_softmax_fc' EPS = 1e-10 if __name__ == '__main__': (X_train, y_train), (X_test, y_test) = mnist_samples(flatten_image=True) model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(FEATURE_DIM, input_shape=(IMAGE_SIZE,), activation='relu')) model.add(tf.keras.layers.Dense(CATEGORY_NUM, input_shape=(FEATURE_DIM,), activation='softmax')) model.compile( loss='categorical_crossentropy', optimizer=tf.keras.optimizers.SGD(LEARNING_RATE), metrics=['accuracy']) cb = [tf.keras.callbacks.TensorBoard(log_dir=LOG_DIR)] model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, callbacks=cb, validation_data=(X_test, y_test)) print(model.evaluate(X_test, y_test))