14
Help us understand the problem. What are the problem?

posted at

updated at

Google Colaboratoryの機械学習でM5UnitVに動物フィギュアを認識させる

はじめに

(2021/1/19 追記)

IMG_3368D.jpeg

V-Trainingの機械学習サービスが使用できない・・・

  • M5Stack社が運用してくれている機械学習モデル作成サービスのV-Trainingが現在使用できない状態。
  • UnitVに学習データ作成用ファームを書き込み撮影した画像を学習させ、任意の物体を検出できるようにするまでの手順が以下のV-Trainingページに記載されている。
  • https://docs.m5stack.com/#/en/related_documents/v-training
  • 自分もこれに沿って作業を進め6種類の物体データを用意し、指定された形式のZipファイルにしてV-Trainingにアップロードする所までやってみた。

スクリーンショット 2020-12-29 11.57.12.png

スクリーンショット 2020-12-29 11.50.34.png

が、以下のエラーが解消されず、学習モデルが作成できない状況が続いている。。。

  • [不具合①]:誰かが先にアップロードしたファイルの処理に失敗するとTaskが削除されずにスタックする。
  • その状態で別の人がファイルをアップロードしても、ずっとTask順番が回ってこない。。。
  • 何日かするとサーバ管理者の人が気付き、Taskをキャンセルしてくれると解消する。
  • [不具合②]:解消された状態を狙ってファイルをアップロードしても、以下のエラーがメールで返され失敗する。
CONTENT: Unexpected Error Found During Triaining, 
A target array with shape (128, 6) was passed for an output of shape (None, 7) while using as loss categorical_crossentropy.
This loss expects targets to have the same shape as the output.
  • 内容から想像すると、(スクリプトが間違っていて)アップロードしたディレクトリ(Class)の数以上のClassを検証しようとしてエラーになっている感じ。
  • クラス数を変更しても常に「ディレクトリ数 + 1」でエラーになるので、中の人にスクリプトを修正してもらう必要がありそう。
  • (もし上手くいってる方が居たら教えて下さい。)
  • という事で、Communityへの問い合わせ中

Google ColaboratoryのNotebookの方法を試してみる

以下、手順を示します。
開発環境(MaixPy等)のインストールについては先行する記事の内容でインストール済みとします。

学習データの作成

  • 学習データの作成はM5UnitV, M5StickV用のスクリプトを使う。
  • M5StackのV-Trainingのサイトから学習データ収集用のファームを入手し、MaixPyで実行する。

スクリーンショット 2021-01-17 22.52.17.png

  • こんな感じで、パシャパシャと学習データを撮影する。
  • 今回は、アニマルシリーズと言うことで、自宅に飾ってあるシュライヒの動物フィギュアを使う。
  • 象、キリン、シマウマ、牛、ホシガメ(ホシガメはガチャガチャでゲットしたやつ)。
  • M5UnitVの右側のAボタンで撮影、左側のBボタンで次のClassに切替え。
  • 1つのClassあたり、色々向きを変えて50枚ほど撮影する。

IMG_3366.jpeg

  • 撮影状況については以下のように、MaixPyのシリアルターミナルに撮影中のClass番号、撮影枚数が出力される。

スクリーンショット 2021-01-17 16.14.49.png

IMG_3362.jpeg

IMG_3363.jpeg

アップロード用のdataset.zipの作成と配置

  • 認識させたいものが全部撮影できたら、SDカードのtrainフォルダのみをzip形式で圧縮し、dataset.zipというファイル名にする。
  • vaild(validのタイポ)フォルダも作られるが、今回V-Trainingを使わないため使用しない。

スクリーンショット 2021-01-17 23.02.33.png

  • 次にdataset.zipを任意のアプリからURL指定でダウンロードできる場所にアップしておく。
  • 自分は、NoteBookで記載されていたお勧めのやり方に合わせ、自身のDropBoxにアップロードした。
  • https://www.dropbox.com/s/8e04e5k395jaap4/dataset.zip?dl=1
  • (しばらくファイルは残しておきますが、そのうち忘れて消すかもしれません。)

Google Colaboratory上で学習モデルの作成

  • 先ほど自分のGoogle Driveにコピーした「Creating an Image Classification Model for M5StickV by Transfer Learningのコピー」 をGoogle Colaboratoryで開く。
  • JupyterLabo環境がブラウザ内で立ち上がるので、上から順に「コードエリア」にカーソルを合わせてShift + Enterで実行する。
  • JupyterLaboについては、自分JetsonNano&JetPackで使っていたが、Google Colaboratory使えばいきなりクラウド上に環境が持てちゃう。
  • こうやって共有もできちゃう。素晴らしいね、これ。

スクリーンショット 2021-01-17 23.15.49.png

独自の学習データを指定

  • 上から順次実行して行き、ここまで来たらdateset_url:の部分に先ほど学習データをアップロードしたURLを貼り付ける。
  • 今回使用するNoteBookにおいて個別に編集する箇所は、ここだけで良いはず。

スクリーンショット 2021-01-17 23.23.43.png

  • 後は、順に実行していくだけ。
  • 途中、学習結果が表示される。

スクリーンショット 2021-01-19 21.29.44.png

スクリーンショット 2021-01-17 16.07.29.png

  • 学習モデルの評価。
  • 良く分かってないけど、きれいに予測出来てるって事かしら?(逆にこんなに綺麗に区別できちゃうものなの??)

スクリーンショット 2021-01-17 16.07.46.png

Grad-CAMによる学習状況の可視化(2021/1/19 追記)

  • 2019年作成時のコードには、Grad-CAMという学習モデルの推論内容をヒートマップみたいな感じで可視化する手順が含まれている。
  • 日本一詳しくGrad-CAMとGuided Grad-CAMのソースコードを解説してみる(Keras実装)
  • 検出結果が芳しくない場合にどこが良くてどこが良くないかがわかる。
  • が、この1年でパッケージ構成が変更されたらしく、この部分はimportエラーになってしまう。
  • ちょっと調べたり、いじったりしてみたが、自分では解消できなかった。。。
  • 今の自分の実力では依存関係を説き解せるほど分かってないので、ここはパスする。
  • モデル作成には支障はないため一旦スキップし、時間が出来たらリトライする。

スクリーンショット 2021-01-17 16.08.10.png

スクリーンショット 2021-01-19 23.43.38.png

学習モデルのダウンロード

  • 最後まで実行して行くと、最終的にK210向けのモデルに変換した結果のzipファイルがダウンロードできる。

スクリーンショット 2021-01-17 16.11.14.png

DLしたファイルを解凍。

  • 解凍すると、以下の3ファイルが得られる。
  • boot.py:M5UnitVの実行コード。
  • labels.txt:認識結果に対応づけるラベル
  • model.kmodel:K210用にコンバートされた学習モデル

スクリーンショット 2021-01-17 16.16.31.png

boot.pyの書き替え

  • Maix Toolbox提供のbooy.pyのままだと、ちょいちょいValueError: object not in sequenceで停止する。
  • 原因は、未検出時にpmaxに//./////という未定義値?が取得されるため、その後の配列アクセスでExceptionが発生するため。
  • 検出できている場合、検出結果plistには0から1の間の値が入ってくるが、失敗する//./////, //./////, //./////, ... という値が取得されちゃうみたい。
  • これ、先ほどグラフ表示されてた各クラスに関するConfusion Matrixの値だな、きっと。
  • なので値が0〜1の範囲にない場合は、配列アクセスしない様に回避コードを追記した所、うまく回避できた。
  • M5UnitVなのでlcdのコードは消してあります。M5StickVで使う場合は元のコードを参照してください。
  • UnitVはlcdが無いため、検出した物体ラベルをシリアルコンソールと、キャプチャ画像上に表示するようにした。
boot.py
# Original: https://iotdiary.blogspot.com/2019/07/maixpy-go-mobilenet-transfer-learning.html
# Slightly modified for M5UnitV
import sensor
import image
import KPU as kpu
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)
f = open('labels.txt', 'r')
labels = f.readlines()
f.close()
print(labels)
task = kpu.load("/sd/model.kmodel")
while(True):
    img = sensor.snapshot()
    
    # モデル入力用の画像サイズに変換
    img2 = img.resize(224, 224)
    # K210のRGB565 データを推論処理用のメモリブロック ​​RGB888 にコピー
    img2.pix_to_ai()
    # モデルの実行
    fmap = kpu.forward(task, img2)
    
    plist = fmap[:]
#    print("plist:" + str(plist) )
    pmax = max(plist)
#    print("pmax:" + str(pmax) )
#   Avoiding Exception for index of undef result.
    if pmax >=0 and pmax <=1:
        max_index = plist.index(pmax)
        img.draw_string(2, 10, "%s " % (labels[max_index].strip()), 20)
        print("DETECT:" + labels[max_index].strip())
    else:
        print("NOT DETECT")
a = kpu.deinit(task)

labels.txtの書き換え

  • labels.txtの中身はディレクトリ名になってる。これは検出したClassに対応するラベル名になっている。
  • こちらのファイルは、順番を変えずに任意の文字列に書き換えることが可能。
  • 自分の場合、01, 02,, だと分からなかったので、Elephant, Giraph,,,に書き換えた。

いよいよ、M5UnitVで物体検出

  • 先ほどDLしたzipファイルの中身3ファイルをSDカードに入れて、M5UnitVを起動。
  • 検出した物体ラベルをシリアルコンソールと、キャプチャ画像上(かなり見にくい)で確認する事ができる。

お〜!ゾウさん、認識できた!

スクリーンショット 2021-01-17 17.11.47.png

キリンも認識できる。

スクリーンショット 2021-01-17 17.14.45.png

 ホシガメはなぜか正しく認識できない。。。。

スクリーンショット 2021-01-17 17.16.18.png

う〜ん。
今の自分の実力ではなぜ認識できないのか、さっぱり分からない・・・・。

と思ったら、
つい最近(2021/1/8)に発売された「からあげ先生のとにかく楽しいAI自作教室」に学習結果のグラフの見方が詳しく書かれてるじゃないですか!
過学習とか未学習とか、何となく用語の意味は知ってるけど、実際にこうやって手元で起こってる事象ベースで考えると理解が深まるじゃん。

って、↓ これか!!!!?

validation_acc

スクリーンショット 2021-01-19 21.31.21.png

ほうほう、「なぜホシガメが認識できないのか?」良い課題じゃないですか。
よく読み込んで解決してみよう。

まとめ

  • M5UnitVで物体認識ができた。
  • 学習モデル作成については、V-Training以外の方法でK210の学習モデルを作成することができた。
  • 初めてGoogle Colaboratoryにも触れる事ができ、その便利さが理解でき、とても勉強になった。
  • 各実行ステップで何やってるのか、後でゆっくり理解してみようと思う。
  • あとM5UnitV、楽しい。
  • こんな2000円くらいのボードで機械学習を使って遊べるってのが良い。
  • M5UnitVとM5Stackとを組み合わせた車体を使って物体の追尾は出来ているので、次は機械学習させたものを認識&追尾させるのをやってみたい。(Yoloで認識する必要がある気がする)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
14
Help us understand the problem. What are the problem?