忘れそうな内容をメモしています

忘れっぽいのでメモ帳がわりに色々書いてます

MobileNetで転移学習した画像分類モデルをM5StickVで動かしてみた

前回はmnistとfashin-mnistのcnnモデルをM5StickVで動かしてみました。

shintarof.hatenablog.com

その後色々とモデルを作って遊んでいましたが、簡単な分類問題だとmnistのサンプルコードのCNNモデルでも良さそうですが、複雑な画像を分類しようとするとモデルを工夫する必要があることがわかりました。

ただ、このモデルですがイチから精度の良い分類モデルを作るのは初心者には結構大変そうです。

色々調べたところ、大量の画像にて学習済みのモデルを活用する「転移学習」という手法があるようです。 超ざっくりしたイメージとしてはテニスのプロ選手(≒学習済みモデル)に卓球(≒別の問題)をやってもらうみたいな感じですかね。うん。

www.youtube.com

その転移学習に使われるモデルは色々あるようですが、その中でも軽量かつ精度の良いモデルとしてエッジデバイスではMobilenetがよく使われているそうです。

そこで、以下記事を参考にフルーツの画像分類モデルをMobileNetを転移学習させて作成しM5StickVで動かしてみました。ちなみにMobileNetはv1,v2,v3とバージョンがあるようですが、以下の記事ではv1を使っています。 radiumray.github.io

データセットは以下の30種類のフルーツ画像のデータセットを使いました。
また、プログラムはgoogle colab上で動作させました。
Downloads/FIDS30 - Visual Cognitive Systems Laboratory

こんな感じでフルーツの画像の中から、かろうじてイチゴをイチゴと分類してくれました。

f:id:shintarof:20200516024452g:plain
「フルーツ」でググって出てきた画像で試してみた

但し、分類結果のスコアがかなり低いのであまりうまく分類できていないようです。また、イチゴとオレンジは得意なようですがリンゴやバナナなどはうまく検出されませんでした。この辺はデータセットに含まれている画像の問題ですかね。

最後にハマったところをメモしておきます。

  • M5StickVに作成したモデルを書き込む際に.kfpkg形式で書き込むとプログラム実行時に固まる
    →.kmodelをmicroSDカードにコピーしmicroSDから読み込ませることで動くようになった。なぜ?

  • 分類するクラス数を変えたい
    →記事のコードだと2クラス分類になっているので「训练代码」のpreds=Dense(2,activation='softmax')(x)の2を分類したいクラス数に変更すればOK

  • データとラベルの対応がわからない
    →「训练代码」の中にprint(train_generator.class_indices)を追加すれば以下のように対応するラベルが表示されます。

{'acerolas': 0, 'apples': 1, 'apricots': 2, 'avocados': 3, 'bananas': 4, 'blackberries': 5, 'blueberries': 6, 'cantaloupes': 7, 'cherries': 8, 'coconuts': 9, 'figs': 10, 'grapefruits': 11, 'grapes': 12, 'guava': 13, 'kiwifruit': 14, 'lemons': 15, 'limes': 16, 'mangos': 17, 'olives': 18, 'oranges': 19, 'passionfruit': 20, 'peaches': 21, 'pears': 22, 'pineapples': 23, 'plums': 24, 'pomegranates': 25, 'raspberries': 26, 'strawberries': 27, 'tomatoes': 28, 'watermelons': 29}