久しぶりに M5StickV と V-Training で画像分類用の機械学習モデルを準備する（途中まで）【2021年4月】

1年半くらい前に入手して、その後には知り合いに声をかけて都内某所でもくもく会を開いたり、などということをやっていた M5StickV に関する話。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/M5StickV%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A?src=hash&amp;ref_src=twsrc%5Etfw">#M5StickVもくもく会</a> の現時点で試したことの中の１つ、<br>V-Training を使って、自前で撮影した画像から学習モデルを作り、身近にある物3つを画像認識させるもの。<br><br>うまく、<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> と、<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> Gray と、M5StickC の3つを見分けてくれました！<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/OQApLvApef">pic.twitter.com/OQApLvApef</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1170597751169486848?ref_src=twsrc%5Etfw">September 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その時に、M5StickV で撮影した写真を元に機械学習モデルを作ってくれる Webサービスを使って、独自のモデルを使った画像分類を試したりしていました。それを、久しぶりに試してみつつ、その過程をメモとして残したのがこの記事です。

## M5StickV とは
この記事で登場する M5StickV は、M5Stack社から出ているカメラ付きの小型デバイスです。
自分は、スイッチサイエンスさんのオンラインショップで、今は販売していないマイク非搭載のバージョンを購入しました（現在、マイク搭載バージョンのみが販売されているようです）。
　●M5StickV（マイク搭載版） - スイッチサイエンス
　　https://www.switch-science.com/catalog/6651/

少し補足をすると、上記のページでこのように説明されています。
> Kendryte K210を搭載したAIカメラです。高性能なニューラルネットワークプロセッサ（KPU）とデュアルコア 64 bit RISC-V CPUを使用しており、低コストかつ高いエネルギー効率で高性能な画像処理を行うことができます。
>
> 本製品は他のK210開発ボードと比較して、スピーカー、マイク、LCDスクリーン、ジャイロスコープ、リチウム電池など多くの機能を備えています。また、GROVE互換のコネクタによる拡張も可能です。

ちなみに、M5Stack社の M5StickV に関する公式ドキュメントの URL はこちらです。
　https://docs.m5stack.com/en/core/m5stickv

## V-Training とは
冒頭に名前を出していた「V-Training」は、画像をアップロードするとオンラインで機械学習モデルを作成してくれるサービスです。M5Stack社の公式ドキュメントの URL はこちらになります。
　https://docs.m5stack.com/en/related_documents/v-training
また、V-Training のアクセス先は以下の URL です。
　http://v-training.m5stack.com/

公式ドキュメントの冒頭の部分では、以下のように説明が書かれています。
> At present, V-Training provides two model training modes "Classification" (recognize objects and return their corresponding classification) "Detection (using Yolov3 algorithm, recognize the object is located in the image and draw a wireframe)", the user can according to their own use The scenes can be freely selected and used, and the model training methods of these two modes will be introduced below.

上記の説明を読むと、いわゆる「画像分類」と「物体検出」に使う機械学習モデルが出力できるようです。

今回は、それら 2つのうち「画像分類」のほうをためします。

## 画像を準備する
### 前提条件
それでは、上記の [V-Training の公式ドキュメント](https://docs.m5stack.com/en/related_documents/v-training)を見つつ、画像分類の機械学習モデルを出力するための、元になる画像データセットを用意していきます。

なお、ここからの手順を試していった際に使った環境は、以下の通りです。
　・OS： Mac
　・デバイス： M5StickV（マイク非搭載バージョン）

### M5StickV にファームウェアを書き込む
 [V-Training の公式ドキュメント](https://docs.m5stack.com/en/related_documents/v-training)の最初の項目は「Burner Firmware」になっています。
その際に利用できるものが 2つあり、Windows用のみがある「EasyLoader」と、Windows/Mac/Linux の各OS向けに提供されている「Kflash_GUI」です。自分は Mac なので、Kflash_GUI のほうを使います。

まずは、ファームウェアをダウンロードしてください。「Kflash_GUI」と書かれた項目の下に「click to download firmware」というリンクがあるので、これをクリックします。記事執筆時点では「M5StickV_Firmware_v5.1.2.kfpkg」というファイルがダウンロードできました。

そして、今度は Kflash_GUI をダウンロードします。Windows/Mac/Linux のそれぞれに対応したダウンロード用リンクがあるので、Mac用のリンクをクリックしました。記事執筆時点では「kflash_gui_v1.5.2_macOS.dmg」というファイルがダウンロードできました。dmgファイル内のアプリを、アプリケーションフォルダにコピーして起動しようとすると、以下のような表示が出ました。
![起動できない.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/160a6996-521d-a57d-aa02-2eb62b570143.jpeg)

以下のページにある「Controlキーを押しながらアプリを開く」操作で実行します。
　●開発元が未確認のMacアプリケーションを開く - Apple サポート
　　https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac
そうすると、アプリが一瞬起動したように見えたものの、すぐに終了されてしまいました。

ふと「過去にも似たようなことが起こって、対処をしたような...」と思ってググったら、こちらの非公式の情報がありました。
　●M5StickV トラブルシューティング
　　https://iothonpo.com/m5stickv-troubleshooting/#kflash_gui%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84

ターミナルで openコマンドを使い `open /Applications/kflash_gui.app` を実行すれば良いようです。今度こそ、無事にアプリを起動できました。
![kflash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/41767444-9fa8-cf13-f283-5978924c1e89.jpeg)

その後は、PC に M5StickV を接続した状態で「Port」を M5StickV を接続した USB のものに変更します。また、アプリの一番上にある「Select File」の部分で「Open File」と書かれたボタンを押し、先ほどダウンロードしたファームウェアのファイルを選択します。
あとは、アプリの下部の「Download」と書かれたボタンを押してください。そして、以下の表示が出てくるまで、待ちましょう。
![ダウンロード成功.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5dca5733-35fe-f58f-9de4-a44da2e04a26.jpeg)

PC上で上記の内容が表示された後、M5StickV の画面は以下のような内容が表示されました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">久しぶりに。<a href="https://twitter.com/hashtag/M5StickV?src=hash&amp;ref_src=twsrc%5Etfw">#M5StickV</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/lv0ALMqkBs">pic.twitter.com/lv0ALMqkBs</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1386698792116752393?ref_src=twsrc%5Etfw">April 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 画像分類用の写真を撮る
ここまでできたら、次は公式ドキュメントの「Classification mode」の「For M5StickV」という項目の下を見ていきます。
「Click here download boot-M5StickV」というリンクをクリックして ZIPファイルをダウンロードします。記事執筆時点では「VTraining-Client-VerA02B01.zip」というファイルがダウンロードできました。
この ZIPファイルを解凍すると「boot.py」・「kacha.wav」・「startup.jpg」の 3つのファイルがありました。これらは、公式ドキュメントの図で示されているとおり、マイクロSDカードにコピーして使います。
![マイクロSDカードへのコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2962891a-b4e8-1b3a-e2ea-51e710e3acdb.jpeg)

ZIPファイルを解凍して得られた 3つのファイルをマイクロSDカードにコピーし、そのマイクロSDカードを M5StickV に指して起動します。そうすると、先ほどと異なる起動画面になりました。
<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ファームウェアのアップデート後、V-Training で画像分類を行う手順を進めているところ。<a href="https://twitter.com/hashtag/M5StickV?src=hash&amp;ref_src=twsrc%5Etfw">#M5StickV</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/EGFE5cHIbW">pic.twitter.com/EGFE5cHIbW</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1386703762379575297?ref_src=twsrc%5Etfw">April 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の起動画面が表示された後は、M5StickV 画面にはカメラのプレビューと、長細い情報表示部分が表示されます。
情報表示部分の右側には、画像分類を行うクラスに関して最大で 10 まで作ることができるクラスのうち、ｌ現在選択されたクラスが表示されます（例えば「Class:01/10」など）。これは、マイクロSDカードを挿した側とは反対側にあるボタンを押すと、1 から 10 まで順番に変化していきます。
また、情報表示部分の左側には、現在選択されているクラスの撮影済みの画像枚数が表示されます。1枚も撮影していない状態だと「Training:001/35」と表示されます。撮影に関しては、M5StickV の画面がついている面にあるボタンを押すことで行えます。35 という数字は、1クラスあたりで最低限、撮影する必要がある枚数を示しています。

撮影枚数について、公式ドキュメントでは以下の記載があり、1クラスあたり 35枚を超えて 40枚・50枚といった枚数になるのは問題なさそうです。
> Note: In order to ensure the accuracy of recognition, the number of materials taken by each class must exceed 35, otherwise it will not be passed during cloud training. The more the number of materials, the better the recognition training effect, and the recognition rate Higher

撮影時の注意点として、以下のようなことも書かれています。
![撮影時の注意.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/17eef3c2-f8be-064e-0211-1dd6404814cd.jpeg)
おおまかに言うと「照明の条件は実際に画像分類を行う時の同じように合わせて、かつ、画面いっぱいに対象物のみをうつす（余計なものはうつりこまないようにする）」という内容です。

それでは、ここから撮影を行っていきます。最大で 10 のクラスを準備できますが、今回は 3つだけにしました。
![クラスの振り分け.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f8ba0239-07a6-9263-d5ec-85458436e1cc.jpeg)

撮影後にマイクロSDカードの中身を見てみると、ファイル・フォルダは以下のような構成になっていました。
![撮影後のカード内の構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c6f9afe0-99bf-8c90-d397-452437cad613.jpeg)
さらに、クラス1 の中身を見てみると「1.jpg から 30.jpg までと 36.jpg」が「train/1」の中に、「31.jpg から 35.jpg」までの 5枚が「vaild/1」の中に入っていました。各クラス用にとった写真は、30 から 35 が vaild に、それ以外の残りが train へ振り分けられるようです。
![画像の振り分け.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6afb874a-1217-9c7f-572c-d3484b95f547.jpeg)
なお、画像の解像度を確認してみると「320ｘ240」でした。

## 画像をアップロードする
それでは、撮影した画像を [V-Training](http://v-training.m5stack.com/) でアップロードします。
アップロードするためには、 vaild と train のフォルダを、まとめて 1つの ZIPファイルにする必要があるようです。そして、その ZIPファイルを [V-Training のページ](http://v-training.m5stack.com/)でアップロードします。

以下の V-Training のページで、機械学習モデルが出来上がったお知らせを受け取る宛先となるメールアドレスを入力し、先ほど準備した ZIPファイルをアップロードします。
![V-Trainingのページ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5b3fce2f-3368-ba1b-4c16-af01301c1ce0.jpeg)
アップロードが完了した後、以下のような表示がされているのを確認できました。
![V-Trainingでアップロード完了後の画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/881a03f2-c7a4-16d5-b7f4-a6716b252aa9.jpeg)

あとは完了の報告メールを待つのみ、と思っていたのですが...

## 失敗のお知らせ
メールボックスを確認したところ、アップロード後に失敗したというメールが届いていました。

以下の内容を見てみると「似すぎている画像を削除した」という感じでしょうか。これが8行くらい書かれていたので、おそらくは最低限必要な画像枚数を下回ってしまったと思われます（1クラスあたり 36〜38枚だったため）。
![失敗の連絡.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/faa0de63-0a05-07d5-cc7e-9042349f8a5e.jpeg)

## おわりに
画像を準備して、あとは待つだけ、と思っていたら思わぬ結果が...
続きは、また別途やっていければと思います。

## 【追記】 続きの記事を書きました
今回うまくいかなかった部分に対応しようとした過程を、別の記事として書きました。ただし、機械学習モデル等は出力できたものの、意図通りのクラスに分類されていない状態となっています（さらに検証をして、もう 1つの記事を書くことになりそうな予感）。

●久しぶりに M5StickV と V-Training で画像分類用の機械学習モデルを準備して利用する（その2）【2021年4月】 - Qiita
　https://qiita.com/youtoy/items/a2ad693fc8143e93aaf4