前回、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枚振り分けました。分け方は適当です。
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で選択する作業です。
ちなみにショートカットキーを駆使すればかなり効率よく作れます。 以下の1.2.3を無心で繰り返しました。
- Create RectBoxを開始 [w]
- クリックでビーダマンを選択
- 次の画像へ移動 [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にて実行
こんな感じで検出できました。
M5StickVでオリジナルのデータセットで物体検出をしてみました。 pic.twitter.com/oLrCwCHw0o
— うどんウエスト愛好会 (@udon__west) May 24, 2020
背景が変わっても検出できてます。
今回は一つの物体のみの検出でしたが、複数の物体を検出したい時は
→20200527追記 特に何もしなくても複数検出してくれました。
/content/aXeleRate/configs/b-daman-colab.json
を設定すればできそうです。