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

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

M5StickVで物体検出を試してみる②(オリジナルデータセットにてモデル作成)

前回、M5StickVで物体検出(アライグマ検出)を動かしましたが、 オリジナルのデータで物体検出モデルを作成してみました。 shintarof.hatenablog.com

検出対象は家に眠っていた懐かしのおもちゃビーダマンにしました。 余談ですが、ビーダマンって海外でもB-damanとして知られているそうです。海外にもビー玉ってあるのかな?

以下、ビーダマンの検出モデルの作成手順です。
ちなみに下記1.2.の作業は環境はMacOS(Catalina 10.15.3)を使いました。

1.データセットの準備

撮影したデータセットを格納するディレクトリを以下のように作成しました。

$mkdir dataset
$cd dataset/
$mkdir images
$mkdir annotations
$mkdir val_images
$mkdir val_annotations

あとはスマホでビーダマンの写真を撮りまくって、学習用データimagesに51枚、テスト用データval_imagesに11枚振り分けました。分け方は適当です。

f:id:shintarof:20200525002529p:plain
学習用データ(images)
f:id:shintarof:20200525002512p:plain
検証用データ(val_images)

2.アノテーション作業

下記記事を参考にさせて頂きlabelImgでアノテーションをしました。 raspberrypi.mongonta.com

labelImgは以下手順でインストール&実行しました。

$git clone https://github.com/tzutalin/labelImg
$cd labelImg/
$pip install pyqt5 lxml
$make qt5py3
$python labelImg.py

作業する前に以下をチェックしました。

View
|_Auto Save Mode
|_Single Class Mode
|_Display Labels

あとはひたすら画像の中のビーダマンをCreate RectBoxで選択する作業です。

f:id:shintarof:20200525010943p:plain
画像の中のビーダマンをCreate RectBoxで選択する作業

ちなみにショートカットキーを駆使すればかなり効率よく作れます。 以下の1.2.3を無心で繰り返しました。

  1. Create RectBoxを開始 [w]
  2. クリックでビーダマンを選択
  3. 次の画像へ移動 [d]
    (前の画像に戻る時は[a])

3.学習

LabelImgで作成したアノテーションデータをzipで固めます。

$cd ../
$zip -r dataset.zip dataset/

google colabで以下を入力してデータセットのアップロード&学習を開始します。

#ソースの取得
!git clone https://github.com/AIWintermuteAI/aXeleRate.git
%cd aXeleRate
!!pip install -r requirements.txt
#データセットのアップロード(アップロードするファイルの選択ボタンが出てきます)
from google.colab import files
uploaded = files.upload()

#ここでcolabのコードをいったん区切ること。アップロード対象のファイルが選ばれていないまま以下を実行するとコケる
!unzip dataset.zip
#設定ファイルの作成
jsontext="""
{
    "model" : {
        "type":                 "Detector",
        "architecture":         "MobileNet7_5",
        "input_size":           [224,224],
        "anchors":              [0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828],
        "labels":               ["b-daman"],
        "coord_scale" :         1.0,
        "class_scale" :         1.0,
        "object_scale" :        5.0,
        "no_object_scale" :     1.0
    },
    "weights" : {
        "full":                 "",
        "backend":              "imagenet"
    },
    "train" : {
        "actual_epoch":         50,
        "train_image_folder":   "/content/aXeleRate/dataset/images",
        "train_annot_folder":   "/content/aXeleRate/dataset/annotations",
        "train_times":          2,
        "valid_image_folder":   "/content/aXeleRate/dataset/val_images",
        "valid_annot_folder":   "/content/aXeleRate/dataset/val_annotations",
        "valid_times":          2,
        "valid_metric":         "mAP",
        "batch_size":           4,
        "learning_rate":        1e-4,
        "saved_folder":         "b-daman",
        "first_trainable_layer": "",
        "augumentation":                true,
        "is_only_detect" :      false
    },
    "converter" : {
        "type":                 ["k210"]
    }
}
"""
with open("/content/aXeleRate/configs/b-daman-colab.json","w") as f:
  f.write(jsontext)
#axelerateのインストール
!python setup.py install
#学習実施
!python ./axelerate/train.py -c ./configs/b-daman-colab.json
#モデルのダウンロード
#from google.colab import files
#files.download('./projects/raccoon_detector/2020-05-23_16-56-41/YOLO_best_mAP.kmodel')

ダウンロードしたkmodelを前回と同じ手順でkfpkg形式に変換してM5StickVに書き込みます。

4.M5StickVにて実行

こんな感じで検出できました。 f:id:shintarof:20200525010121j:plain

背景が変わっても検出できてます。

今回は一つの物体のみの検出でしたが、複数の物体を検出したい時は/content/aXeleRate/configs/b-daman-colab.jsonを設定すればできそうです。
→20200527追記 特に何もしなくても複数検出してくれました。 f:id:shintarof:20200527192339p:plain