M5StickV/M5UnitV の model.kmodel を Windows 10 で作成する(転移学習編)

まえがき

前回の記事までの準備が整ったところで、実際に model.kmodel を作成する手順について説明する。この記事では、MobileNet.v1 を用いた転移学習により作成したモデルをもとに kmodel 形式のファイルを生成するところまでを紹介する。

以下のサイトを参考に記事を作成した。元記事は Google Colab を使っているが、Windows 10 上の Jupyter Notebook を用いるように修正している。

https://www.lancard.com/blog/2019/09/24/m5stickv%E3%81%A7%E7%8B%AC%E8%87%AA%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E8%AA%8D%E8%AD%98/

データの準備

画像データは前々回の記事で用意した k210 フォルダ内に用意する。images フォルダの中にフォルダごとに画像ファイルを分類して入れておくものとする。例えばフォルダ構造は以下のような形になる。(以下では、imagesフォルダの下に、salad, sushi, tofu のフォルダを作成し、それぞれに画像ファイルが格納されている)

C:\USERS\EIICHIRO ITO\DOCUMENTS\K210
 ├─.ipynb_checkpoints
 ├─images
 │  ├─salad
 │  ├─sushi
 │  └─tofu
 ├─Maix_Toolbox
 │  ├─images
 │  ├─log
 │  ├─ncc
 │  │  ├─bin
 │  │  └─refs
 │  └─workspace
 └─transfer_learning_sipeed
     ├─images
     │  ├─your_class1
     │  └─your_class2
     ├─mobilenet_sipeed
     │  └─pycache
     ├─mobilenet_v1_transfer_learning
     └─model_labels

Jupyter Notebook の起動

これ以降の作業では miniconda3 でインストールした Jupyter Notebook を利用する。スタートボタンを押して「Anaconda3(64 bit)」から「Jupyter Notebook (k210)」を選んで Jupyter Notebook を起動する。

するとウェブブラウザが開いてフォルダ一覧が表示される。Documents をクリックし、さらに k210 をクリックすると以下のような画面になる。(sample1.ipynb はこれから作成するので、まだ存在しない)

右側の「New」というボタンをクリックして「Python 3」という項目を選ぶと、ブラウザの新しいタブに Notebook が表示される。

In [ ] の右にある欄に、以下の内容を入力する。

!cd

入力した後で、Shift キーを押しながら Enter キーを押すと、入力した内容が実行され、以下のように結果(作成した Notebook があるフォルダ名)が表示される。(画面上部の Run をクリックしてもよい)

miniconda の環境名が表示されれば OK である。

MobileNet.v1 による転移学習

あとは Windows 10 上であることに気をつけながら、コピペしながら Notebook を動かしていけば良い。まず、各種モジュールをインポートする。

import keras
import numpy as np
from keras import backend as K
from keras.optimizers import Adam
from keras.metrics import categorical_crossentropy
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
from keras.models import Model
from keras.applications import imagenet_utils
from keras.layers import Dense, GlobalAveragePooling2D, Dropout
import sys
sys.path.append('./transfer_learning_sipeed')
from mobilenet_sipeed.mobilenet import MobileNet
from keras.applications.mobilenet import preprocess_input
import tensorflow

キモは、後半にあるダウンロード・展開したMobileNet を使う部分である。(import sysからの3行)

続いて MobileNet を使って基本となるモデルを作成する。入力として 224×224 ピクセルの画像を使うようにしている。

IMAGE_SIZE = 224
ALPHA = 0.75
base_model=MobileNet(input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3), alpha = ALPHA, depth_multiplier = 1, dropout = 0.001, include_top = False, weights = "imagenet", classes = 1000, backend=keras.backend, layers=keras.layers,models=keras.models,utils=tensorflow.keras.utils)

最終段を追加してモデルを作成する。

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(100,activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(50,activation='relu')(x)
preds = Dense(3,activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=preds)

念の為モデルの全層を表示した後、モデルの基本部分は学習させずに追加した後半の層だけ学習させるように設定する。

for i,layer in enumerate(model.layers):
    print(i,layer.name)
for layer in model.layers[:86]:
    layer.trainable=False
for layer in model.layers[86:]:
    layer.trainable=True

準備したデータを使って転移学習させるように設定する。

train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator = train_datagen.flow_from_directory('./images', target_size=(IMAGE_SIZE,IMAGE_SIZE), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True)

以下を実行すると、画像フォルダと分類結果のインデックスとの対応がわかる。

train_generator.class_indices

モデルをコンパイルする。

model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])

学習を実行させる。

step_size_train = train_generator.n // train_generator.batch_size
model.fit_generator(generator=train_generator, steps_per_epoch=step_size_train, epochs=10)

学習したモデルを model.h5 ファイルに保存する。

model.save('model.h5')

model.kmodel ファイルに変換する

まずは TensorFlow Lite 形式に変換する。

!tflite_convert --output_file=./model.tflite --keras_model_file=./model.h5

次に kmodel 形式に変換する。

%cd Maix_Toolbox
!ncc\ncc -i tflite -o k210model --dataset ../images ../model.tflite ../model.kmodel
%cd ..

これで出来上がった(はず)である。

!dir
ドライブ C のボリューム ラベルは OS です
  ボリューム シリアル番号は 9A9C-C56D です
 C:\Users\Eiichiro Ito\working のディレクトリ
 2021/06/22  12:15
          .
 2021/06/22  12:15   <DIR>      ..
 2021/06/22  09:46   <DIR>      .ipynb_checkpoints
 2021/06/22  10:49   <DIR>      images
 2021/06/22  09:39   <DIR>      Maix_Toolbox
 2021/06/22  12:08    8,596,944 model.h5
 2021/06/22  12:15    1,964,232 model.kmodel
 2021/06/22  12:09    7,575,316 model.tflite
 2021/06/22  09:44   <DIR>      transfer_learning_sipeed
 2021/06/22  12:10       17,293 Untitled.ipynb
                4 個のファイル          18,153,785 バイト
                6 個のディレクトリ  73,775,235,072 バイトの空き領域

ここまでエラーなしで到達できれば完了となる。