HomeMadeGarbage Loading

オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー

ホーム
電子工作
Raspberry Pi
IOT
音楽
Home > IoT > オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー
すき 2
うんこ 3

さて前回アライグマの画像データサンプル を用いてMaixduino用の画像認識モデルを製作する手順を学び紹介させていただきました。

ここでは金魚の画像を元に認識モデルを生成して我が家の金魚ちゃんのMaxduinoのカメラでのリアルタイム認識を目指します。

手順としましては前回のアライグマの画像を金魚にしてラベリングし同様に学習しただけですが、改めて順にご説明させていただきます。
 

 

金魚画像の準備

我が家のカワイイ金魚(和金)の認識を目指して認識用モデルを作るべく学習用の画像を準備します。赤い和金の画像をGoogleで40個、自分で撮影したものを173個の計213画像 用意しました。

画像のラベリング(アノテーション)

画像の学習には教師データが必要となります。今回は金魚しか認識しませんのでクラスをgoldfishとして画像の一つ一つにどこに金魚がいるかをラベル付けする必要があります。深層学習などではラベル付けをアノテーション作業というようです。

アノテーションはアライグマの画像データサンプル にならってPascal VOC形式(xml)で行います。

ここではアノテーション作業に非常に有用なソフト LabelImg を使用しました。

Virtual Box上のUbuntuにLabelImgをインストールしました。Python3とGUIソフトのQt5を使用します。

LabelImgの使い方

LabelImgを起動し”Open Dir”で画像が保存先を指定し、”Change Save Dir”でアノテーションデータ保存先を指定します。Use default labelにチェックを入れてモデルのクラス名(goldfish)を記載しておくと便利です。

 

“Create\nRectBox”をクリックして画像をドラッグして金魚の場所を指定します。

 

“Save”で以下のようなPascal VOC形式のアノテーションデータが生成されます。

これをすべての画像に対して実施します。かなり大変ですね。。。。今回は金魚だけ認識するので1クラスで十分ですがいろんなものを識別するモデルを生成するには膨大なデータと手間が必要となりますね。

AIは人間の仕事を奪うといいますが、逆に増やしてはいやしないか。。。とすら思いました。

 

 

学習

アライグマの時同様に以下の学習用プロジェクトデータに画像とアノテーションデータをコピーして学習します。
 https://github.com/AIWintermuteAI/Yolo-digit-detector

configsフォルダに学習設定jsonファイルを作成します。

正直この辺の値や正確な意味はよくわかってないです。。。随時理解したら追記したいと思います。

actual_epoch:全体の学習回数
train_image_folder:学習する画像のパス
train_annot_folder:学習画像データのアノテーションデータのパス
train_times:学習サイクル
valid_image_folder、valid_annot_folder:検証用のデータのパス
 ここをカラにすると学習用のデータからランダムに2割のデータを検証用
 として学習されます。
valid_times:検証回数
batch_size:?
learning_rate:?
saved_folder:?
first_trainable_layer:?
jitter:?
is_only_detect:?

どうしたら効率よく良いモデルができるのかこの辺の設定が要だと思うのですが、じっくり勉強します。

学習開始-モデル生成

以下で設定した条件での学習がスタートします。深層学習ライブラリ Keras + TensorFlowで学習しているようです。

python train.py -c configs/goldfish.json 

学習が終了すると、model.tfliteというモデルファイルが生成されます。

学習モデルの変換

生成されたモデルmodel.tflite をMaixduinoでも利用できる.kmodelファイルに変換します。

変換にはSipeed社の提供するMaix Toolboxを使用します。以下をDLします。
 https://github.com/sipeed/Maix_Toolbox

DLし展開したら、まず以下を実施して環境を構築します。

bash get_nncase.sh 

実行後に生成されるimagesフォルダには入力サイズである224 x 224の画像をいくつか入れておきます。これをしないと変換時にエラーがでます。
 https://bbs.sipeed.com/t/topic/569/7

先ほど生成したモデル model.tflite をMaix Toolboxに入れて以下実施で変換開始します。

./tflite2kmodel.sh model.tflite 

以上でK210用のmodel.kmodelファイルが生成されました。

ファーム、モデル書き込み

kflash_guiでファームと.kmodelファイルをMaixduinoに書き込みます。

ファームは maixpy_v0.4.0_13_ga40842f.bin を書き込みました。学習モデルmodel.kmodelはアドレス0x600000に書き込みました。

Micropythonコード

コードはYolo-digit-detector/micropython_code/racoon_detector.py を使用します。MaixPy IDEで書き込みました。

また画面方向調整のためコードに以下の挿入・変更施しました。

 
 

動作

40画像

Googleで和金を検索して40個の画像を取得してモデル生成しました。

静止画の金魚は認識できましたが水槽の動く金魚の認識はできませんでした。

95画像

水槽の金魚の写真を55枚追加しました。

水槽の金魚も何となく認識できるようになってきました。

175画像

更に水槽の金魚の写真を追加

いい感じいい感じ♪

213画像

更に更に水槽の金魚の写真を追加

完ぺきではないけど大分いいですね。オリジナルの金魚認識モデル生成ができました!

この金魚認識でなのをするかはまた違うお話。
是非またいらしてください。この道へ

246画像(2019/10/16追記)

もう少し我が家の金魚ちゃんたちの写真を増やして、さらに学習時の検証回数”valid_times”を1から3に増やしました。

ほぼ完ぺきに認識しだした。。。やったー!

参考

追記

2020/1/16

Yolo-digit-detectorやMaix Toolboxに更新があるとのことでここで紹介した手法だと現在(2020年1月)エラーがでるようです。
紅樹タカオさん が解決してくれていますので是非ご参照ください。

M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。

次の記事

Sipeed Maixduino を Arduino IDE で味見 ーエッジAI活用への道 4ー

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください