K210 物体認識モデルの生成 ーエッジAI活用への道 2ー
ハイエンドな金魚水槽システムの実現を目指して前回より始まりました エッジAI活用への道。今回は金魚の認識を目指して、まずはオリジナルの物体認識モデルの生成方法について調べました。
目次
Maixduinoによる物体認識
前回はMaixduinoで顔認証まで試しましたが、20種ほどの物体を認識できるサンプルコードもありました。
https://bbs.sipeed.com/t/topic/683
tiny-yolo v2というディープラーニングアルゴリズムを用いているようで 鳥、人、車など20種類の物体を認識できるモデルとK210用コードが公開されてございます。
金魚を認識したいので学習なるものを学習しないといけなさそう。#エッジAI活用への道 #Maixduino pic.twitter.com/NqZG1oPCSL
— HomeMadeGarbage (@H0meMadeGarbage) September 28, 2019
残念ながら魚は認識できません。認識モデル作成が必須ですね。
認識モデルの生成調査
ところで認識モデルってどうやってつくるの?サンプルコード動かすだけでもヒーヒー言ってるのに。。。
ネット検索してもK210向けの生成方法が一連の流れで記載されているものは見つけられず、エラーで動かないなどの記事が目立ちました。
そんなときグッドタイミングである記事が投稿されました。
🦝 Object detection with the Kendryte K210 and raccoons! https://t.co/GVKVCIVqKh pic.twitter.com/Y31uIp0qvW
— Hackster.io (@Hacksterio) September 28, 2019
https://www.hackster.io/dmitrywat/object-detection-with-sipeed-maix-boards-kendryte-k210-421d55
アライグマの画像(200枚)を用いて学習しK210向けの認識モデルを生成しておりました。まさにやりたいこと!セレンディピティね!
ここではこの記事に従いアライグマ認識モデルの生成手順について説明いたします。かなり格闘しました。。。尚、深層学習に関する詳しい内容は全く理解しておりません。あしからず。
アライグマ認識モデルの生成
公開されている記事やソースを用いてアライグマ認識モデルの生成します。また学習により生成されたモデルをK210用に変換してMaxduinoに書き込んで実動作検証も致しました。
Ubuntuの導入
Win10でもモデル生成はできるようですが、モデル変換ツールがLinux向けでしたのでVirtual BoxでUbuntuを導入しました。
以下の記事のとおりにVirtualBox 5.2.32とUbuntu 18.04.01をインストールしました。
学習環境の構築
環境構築にはMinicondaというAnacondaの最小版インストーラを用いました。以下で各OS インストールできます。
https://docs.conda.io/en/latest/miniconda.html
随時必要なものをインストールします。
プロジェクトデータを以下よりDLして所定の場所に展開します。
https://github.com/AIWintermuteAI/Yolo-digit-detector
展開したYolo-digit-detectorフォルダに移動して以下を実施
conda create -n yolo python=3.6
conda activate yolo
必要なパッケージをインストールするためにパッケージ一覧のテキスト requirements.txt をフォルダ内に作成します。
1 2 3 4 5 6 7 8 9 10 11 |
tensorflow==1.14.0 keras==2.3.0 imgaug==0.2.6 opencv-python Pillow requests tqdm sklearn pytest-cov codecov matplotlib |
そして、以下実施で各パッケージがインストールされます。
pip install -r requirements.txt
pip install -e .
以上で学習環境が整いました。
深層学習
アライグマの画像を準備しいよいよ学習しモデルを生成します。
以下の画像データフォルダをDLしてYolo-digit-detectorフォルダに展開します。
https://github.com/datitran/raccoon_dataset
Yolo-digit-detector/configs/raccoon.jsonの “train_image_folder”と”train_annot_folder”のパスは実際の自身の環境のパスに修正します。
以下の実施で学習がスタートします。
python train.py -c configs/raccoon.json
Kerasという深層学習ライブラリをしようしているらしいです。画像入力サイズは224 x 224。その他の設定などはよく理解できておりません。。。
学習モデルの変換
学習が終わるとmodel.h5と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で書き込みました。
また画面方向調整のためコードに以下の挿入・変更施しました。
1 2 3 4 |
lcd.direction(lcd.YX_RLDU) sensor.set_vflip(0) sensor.set_hmirror(0) |
動作
完璧な動作ではないですがアライグマを認識できました!!!
アライグマ画像200枚でモデル自作してK210用に変換。
やっと私にもできたー!
よっしゃ!金魚画像あつめるぞー!#エッジAI活用への道 #Maixduino☟素晴らしき元ネタはコチラhttps://t.co/YoO5lxUiAG pic.twitter.com/Dc9vb0wlhc
— HomeMadeGarbage (@H0meMadeGarbage) September 30, 2019
あとは金魚画像をあつめてモデル生成できるかですね! 😀
地雷たくさんありそうですが。。。
参考
- Object Detection with Sipeed MaiX Boards (Kendryte K210)
- SVHN yolo-v2 digit detector
- M5StickVではじめる軽量モデルの実世界への応用
追記
2020/1/16
Yolo-digit-detectorやMaix Toolboxに更新があるとのことでここで紹介した手法だと現在(2020年1月)エラーがでるようです。
紅樹タカオさん が解決してくれていますので是非ご参照ください。