M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。
2020/1にUnitVを入手し、色々調べながら物体認識を行っていました。学習モデルの作成はM5StackのV-trainingを利用するのが一番手順は楽なのですが、レスポンスが悪い時があります。そんな時に自分のPCでも作業をできないかと思いネットを調べていたら、K210 物体認識モデルの生成 ーエッジAI活用への道 2ールの生成 ーエッジAI活用への道 2ー(HomeMadeGarbage)のブログ記事が見つかりました。こちらの記事はMaixduino向けですが、M5StickVもUnitVも同じK210なので参考にしてモデルの作成環境を構築してみました。
各ツールのGitHubも更新されており、上手く行かない部分もあったので自分の備忘録として残しておきます。(この記事は2020/01/16時点の情報で作成しました。)
M5Stack関連の目次へ戻る
環境
Windows10Pro(64bit)の環境にVMWareでUbuntu18.04.3(64bit)の環境を作成し作業を行いました。
必要なソフトのインストール
事前準備
初心者向けなので知っている方は先へ進んでください。gitとテキストエディタ(例ではvim)が必要です。sudo rebootは再起動です。
作業フォルダをworkで作成していますが何でも構いません。
sudo apt update
sudo apt upgrade -y
sudo reboot
sudo apt install -y git vim
mkdir work
cd work
Miniconda
生成環境はMinicondaを利用します。インストール用のshを実行します。
cd ~/work
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash ./Miniconda3-latest-Linux-x86_64.sh
インストール時の操作
- ライセンスの確認:<enter>
- ライセンスを読む:<space>を押すとスクロール
- ライセンスの同意:yes<enter>
- インストール先:<enter>
デフォルトは「/home/<ユーザ名>/miniconda3」です。 - インストーラーの初期化:yes<enter>
「Thank you for installing Miniconda3!」と表示されたらインストール完了なのでターミナルをいったん閉じて再度ターミナルを開きます。
開きなおすと下記のように(base)というのがプロンプトの前に増えています。
Yolo-digit-detector
GitHubからCloneして過去のコミットに戻す。
※作業ディレクトリwork配下で作業しています。(workでなくても大丈夫です。)
2020/1/16に確認したところ、最新だとエラーが出て実行できないのでClone後、コミットを戻すためにcheckoutします。(詳しくないのでエラーの解消まではできませんでした。。。)
cd ~/work
git clone https://github.com/AIWintermuteAI/Yolo-digit-detector
cd Yolo-digit-detector
git checkout e07b3080633a9a73253d36a0c9e47ece2a92f167
yolo環境へ移行
下記のようにcondaコマンドを実行します。
conda create -n yolo python=3.6
Proceed ([y]/n)? は「y<enter>」
conda activate yolo
するとプロンプトの(base)が(yolo)に変わります。
依存モジュールのインストール
下記のようにコマンドを実行します。
pip install -r requirements.txt
pip install -e .
深層学習
データをGitHubからClone
アライグマのデータをGitHubからCloneします。
cd ~/work
git clone https://github.com/datitran/raccoon_dataset
jsonファイルの書き換え
もう一度、Yolo-digit-detectorのディレクトリに移動しファイルを書き換えます。
cd ~/work/Yolo-digit-detector
vim configs/raccoon.json
●ファイルの内容(フォルダを自分の環境に合わせます。)
- train_image_folder
- train_annot_folder
- valid_image_folder
- valid_annot_folder
{
"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": ["raccoon"],
"coord_scale" : 1.0,
"class_scale" : 1.0,
"object_scale" : 5.0,
"no_object_scale" : 1.0
},
"pretrained" : {
"full": ""
},
"train" : {
"actual_epoch": 20,
"train_image_folder": "/home/mongonta/work/raccoon_dataset/images",
"train_annot_folder": "/home/mongonta/work/raccoon_dataset/annotations",
"train_times": 2,
"valid_image_folder": "/home/mongonta/work/raccoon_dataset/images_valid",
"valid_annot_folder": "/home/mongonta/work/raccoon_dataset/annotations_valid",
"valid_times": 2,
"batch_size": 4,
"learning_rate": 1e-4,
"saved_folder": "raccoon",
"first_trainable_layer": "",
"jitter": true,
"is_only_detect" : false
}
}
深層学習の実行
下記のコマンドを実行すると深層学習が実行されます。実行には時間がかかります。
python train.py -c configs/raccoon.json
深層学習の終了
正常に終了するとカレントディレクトリに下記の2つのファイルが作成されます。
- model.h5
- model.tflite
学習モデルの変換
K210で実行できるようにモデルデータを変換します。ツールは Maix Toolboxを使用します。ただ、スクリプトにバグがあるらしく正常に解凍されないので下記のようにします。
GitHubからツールをCloneして変換用の環境を作成
cd ~/work
git clone https://github.com/sipeed/Maix_Toolbox
cd Maix_Toolbox
bash get_nncase.sh
cd ncc
tar xvf ncc-linux-x86_64.tar.xz
cd ..
ファイルのコピー
変換元のtfliteファイルと学習用のイメージファイルをコピーします。
cp ~/work/Yolo-digit-detector/model.tflite .
cp ~/work/raccoon_dataset/images/* ./images/
変換コマンドの実行
下記のコマンドを実行すると、カレントディレクトリにmodel.kmodelというファイルが作成されます。
./tflite2kmodel.sh model.tflite
M5StickVで動作確認
microSDに作成したkmodelファイルをコピーして、~/work/Yolo-digit-detector/micropython_code/racoon_detector.pyを参考にboot.pyを新規作成します。
※ 12行目のtask = kpu.loadで作成したmodel.kmodelファイルを指定しています。
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.run(1)
classes = ["racoon"]
task = kpu.load("/sd/model.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)
自分でオリジナルデータを作成する。
こちらは、参考にさせていただいたブログに詳しく紹介されています。作成したkmodelファイルをmicroSDに置いてboot.pyで読み込めばいいので自分で認識したい物のモデルを作ってみましょう。
オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー(HomeMadeGarbage)
終わりに
M5StickVやUnitV、SipeedのMaixシリーズなど、購入しやすいエッジAI端末が増えてきました。AIのツールは進歩が速く、ドキュメントも英語のことが多いですが、エッジAIを活用して楽しいものを作ってみましょう。(*’ω’*)
M5StickVやUnitVの購入方法は下記の記事を見てください。
M5Stack、M5StickC、M5StickV、M5Atom、M5Paper、M5CoreInkなどM5Stack製品の買い方