複数のオブジェクトを認識できるkmodelファイルを作成する

 前の記事M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー(HomeMadeGarbage) を参考にして、オリジナルの認識モデルを作成することができます。ただし、2つ以上のオブジェクトを認識したい場合はもう少し手を加える必要があるので、忘れないように記事にしておきます。(2020/1現在の情報にて作成しました。)

 ※ 現在試行錯誤しながら作業しているので、間違ったやり方をしているかもしれません。後で内容を修正する場合もあります。その点はご了承ください。特に(★調査中)の項目は自信がありません。

 気づいた点ありましたらコメントやメールで教えていただけると助かります。m(_ _)m

 もくじ(Index)

M5Stack関連の目次へ戻る

環境について

使用した環境は下記の通りです。

  • Ubuntu 18.04.3(64bit) ※Windows10上のVMWareで実行
  • Miniconda 4.7.12

 ※作業フォルダを~/workで説明していますが任意です。

必要なものを準備する。

深層学習ソフトとモデル変換ソフト

 認識モデルを作成するのに必要なソフトのインストールは M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。を参照してください。

  • Miniconda
  • Yolo-digit-detector
  • Maix_Toolbox

学習用の画像データ

 jpgのデータをたくさん用意します。(私は100枚用意しました。)教師データの数が増えると認識率が上がりますが、事前準備が大変になり、深層学習の時間も長くなります。複数オブジェクトの場合は一緒に写っている画像も用意するといい感じがします。今回は「ついまる」をモデルにしてフォ郎(follow)、フォロ美(follome)の2つの認識モデルを作成します。

  • 画像形式はJPG
  • 背景は何でもいい。(というか、色々なものがあった方がいい?★調査中)
  • 色々な角度から撮影する。
  • ファイル名は英数字で任意(★調査中)
  • 一つのフォルダに入れておく。

アノテーションツール(labelImg)

あとは、アノテーション(annotation: 「あるデータに対してタグやメタデータと呼ばれる情報を付加すること」 )を行うためにlabelImgというソフトを利用します。(Linux版で説明します。)

インストールの手順

 下記のようにコマンドを実行して、GitHubからインストールします。

sudo apt install pyqt5-dev-tools
cd ~/work
git clone https://github.com/tzutalin/labelImg
cd labelImg
pip install -r requirements/requirements-linux-python3.txt
make qt5py3
python labelImg.py

※ makeが無いと言われた場合は「sudo apt install make」でmakeをインストールしてください。

起動

 pythonコマンドで実行します。

cd ~/work/labelImg
python labelImg.py

データの準備

datasetフォルダの作成

test_dataset(※datasetを入れるフォルダ。名前は任意)を作成してその配下に以下の4つフォルダを作成します。

  • images
  • annotations
  • images_validation
  • annotations_validation

images

 学習用の画像データを収納します。(JPG画像)

annotations

 imagesのメタデータを含んだXMLを収納します。(labelImgの保存先になります。)

images_validation,annotations_validation

 Validation(検証)用の画像データおよびメタデータのXMLを収納するフォルダです。Validationデータについては下記のQiita記事が分かりやすいです。

imagesとimages_validationの画像数(★調査中)

 まだ、どのくらい用意すればいいのか分かっていません。(爆)images_validationフォルダを作成しない場合はimagesの画像データから8(train):2(validation)の割合で利用されるようです。(Twitterで@nnn112358氏に教えていただきました。)

 

ラベリング(アノテーション)作業

 labelImgを起動して、用意した画像全部にラベリングを行います。

OpenDirとChangeSaveDirを設定する。

 データの準備で作成したフォルダでOpenDirはimages、ChangeSaveDirはannotationsを指定します。(Validationの時はOpenDir:images_validation,ChangeSaveDir:annotations_validation)

Create RectBoxをクリックして四角で囲う

ラベルを付ける

 例ではフォ郎(follow)と記入してラベルを付けています。この画像にはフォロ美も写っているので、Create RectBoxを押してfollomeのラベルも付けます。

作業を繰り返す

 用意した画像データに対して一つ一つ、全部ラベルを作成します。(Validation用のデータも)

labelImgの作業を楽にする設定

Auto Save

 メニューから「View」→「Auto Save Mode」のチェックを入れると、「Next Image」や「Prev Image」を押したときに自動的に保存されるようになります。

predefined_classes.txtの編集

 あらかじめオブジェクト名を登録しておくと楽です。labelImg/data/predefined_classes.txtを編集すると項目が増えます。

Yolo-digit-detectorで行う作業

ソースの修正(★調査中)

 先日の記事 M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。 ではcommitを戻したので、最新版では直っているらしい複数オブジェクトのバグにハマりました。ただ、私の環境だと最新版は動かなかったので、とりあえずの修正をfit.pyに行いました。実行結果を利用するので一回そのまま実行する必要があります。

実行結果を確認する。

 ターミナルを遡ってdetection_layer_XX(XXは数字)の記述を見つけます。

fit.pyを修正する

 確認した「detection_layer_XX」を元にYolo-digit-detector/yolo/backend/utils/fit.pyを修正します。下記の2か所です。

configsにjsonファイルを作成する。

 ~/work/Yolo-digit-detector/configs/test_dataset.jsonを作成します。(ファイル名は任意)

★パラメータはまだ良く分かっていません。最適なパラメータは自分自身で決める必要があります。学習回数や検証の回数を増やすとそれだけ時間がかかるようになります。

  • model:labels  アノテーションした際のラベルを記入します。[“follow”,”follome”]
  • train:
    • actual_epoch     全体の学習回数
    • train_image_folder  学習画像データのパス
    • train_annot_folder   学習アノテーションデータのパス
    • train_times      学習の回数
    • valid_image_folder   検証用の画像データのパス
    • valid_times      検証の回数
{
    "model" : {
        "architecture":         "MobileNet",
        "input_size":           224,
        "anchors":              [0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828],
        "labels":               ["follow","follome"],
        "coord_scale" : 		1.0,
        "class_scale" : 		1.0,
        "object_scale" : 		5.0,
        "no_object_scale" : 	1.0
    },
    "pretrained" : {
        "full":   				""
    },
    "train" : {
        "actual_epoch":         70,
        "train_image_folder":   "/home/mongonta/work/test_dataset/images",
        "train_annot_folder":   "/home/mongonta/work/test_dataset/annotations",
        "train_times":          4,
        "valid_image_folder":   "/home/mongonta/work/test_dataset/images_valid",
        "valid_annot_folder":   "/home/mongonta/work/test_dataset/annotations_valid",
        "valid_times":          2,
        "batch_size":           4,
        "learning_rate":        1e-4,
        "saved_folder":   		"tsuimaru",
        "first_trainable_layer": "",
        "jitter":				true,
        "is_only_detect": 		false
    }
}

学習の開始

 データが揃ったので学習の開始をします。その後のkmodelへの変換等はこちらのリンクを参照してください。

boot.py(M5StickV)

 出来上がったmodel.kmodelを適当な名前に変更(tuimaru.kmodel)し、microSDカードに置いて下記のようにclassesとtaskを書き換えます。

import sensor,image,lcd
import KPU as kpu

lcd.init()
lcd.rotation(2)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
#sensor.set_vflip(1)
#sensor.set_hmirror(1)
sensor.run(1)
classes = ["follow","follome"]
task = kpu.load("/sd/tsuimaru.kmodel")
anchor = (0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828)
a = kpu.init_yolo2(task, 0.3, 0.3, 5, anchor)
while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            a=img.draw_rectangle(i.rect(),color = (0, 255, 0))
            a = img.draw_string(i.x(),i.y(), classes[i.classid()], color=(255,0,0), scale=3)
        a = lcd.display(img)
    else:
        a = lcd.display(img)
a = kpu.deinit(task)

動作している様子

 boot.pyとtuimaru.kmodelをルートに置いたmicroSDをM5StickVにセットすると動作します。

終わりに

 M5StickVでモデルを作り始めて一週間も経ってないので、まだまだ理解不足ですが自分で複数のオブジェクトを作ってみた手順を紹介しました。これが3つ以上になるとまた不具合が起きる可能性もあるのでその辺りはご了承ください。

 思ったように認識できるようになると楽しいので、興味があったら是非挑戦してみてください。

 M5StickVやUnitVの購入方法は下記の記事を見てください。

M5Stack、M5StickC、M5StickVの正しい買い方

コメントを残す

メールアドレスが公開されることはありません。