清水さんに顔認識して欲しいのでMAiXDUiNOを動かしてみた（Win環境）

この記事はIoTLT Advent Calendar 13日目です。

今回は清水さんに顔認識して欲しいと思い、噂のMAiXDUiNOを導入したのでその辺りを書きます。

#清水さんとは？
![shimizusan_stand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/46fec70e-1e1c-9e0d-a62a-9c13f846bb2c.png)

清水さんは御任夢彦（みとうゆめひこ）さんが生んだキャラクターで、IoT開発に利用したいという申し出に対し、ご厚意により利用フリーにしていただいております。

IoTLT Vol.56で[初登場](https://speakerdeck.com/moriken0307/iotfalseseidebi-nu-gadekinaifalsedeiotfalseli-debi-nu-wotukututemita)し、対話をしたり、撫でると照れたりといったコミュニケーション型のインタラクションの開発で活躍してます。

この度、***誰でもご利用OK***との確認が取れましたので開発にご活用ください。


***<<[Downloadはこちら](https://github.com/morikentech/shimizu)>>***


みなさんにご活用いただけばいただくほど、コンテンツが増えるかもしれません。
＊あくまで作者のご厚意ですので、モラルと節度をもった利用をお願いします。
#MAiXDUiNO
[MAiXDUiNO](https://www.seeedstudio.com/Sipeed-Maixduino-Kit-for-RISC-V-AI-IoT-p-4047.html)とはcannan社製のAIチップKendryte K210搭載のMaixシリーズのAI開発ボードです。K210といえば最近はM5StickVにも搭載されておりお手軽に画像認識ができると人気があります。
Arduino IDEやK210用のMicroPython環境であるMaixPyでの開発が可能となっています。

ちなみに、このMAiXDUiNOの開発者はM5STACKの開発者と師匠を同じくした兄弟弟子とのことです。いうなれば、亀仙流における悟空とクリリンみたいなものですね。

とにもかくにも、これさえあれば清水さんに顔を覚えてもらえる！
と思ったのでまずは動かしてみます。

(･.･)oO(MAiXDUiNOのスペルは"i"だけ小文字って覚えると覚えやすい)
![maixduino_f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/1d0e0a05-0206-d208-6cbb-7377d33851dd.jpeg)
![maixduino_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/b2cbf557-4754-efec-6e47-687a8d23235b.jpeg)

#ファームウェア書き込み

##ファームのダウンロード
こちらから最新のファームをダウンロードしてください。
*2019.12.13現在***v0.4.0**が最新。バージョンが合わないと簡単にエラーを起こします。

https://github.com/sipeed/MaixPy/releases

必要なファイルは***"maixpy_v0.4.0_50_gcafae9d.bin"***です。

こちらから顔認識モデルをダウンロードしてください。
2019.12.13現在v0.3.2が最新。v0.4.0のところにはないのでv0.3.2のところから持ってきます。
https://github.com/sipeed/MaixPy/releases/tag/v0.3.2

必要なファイルは***face_model_at_0x300000.kfpkg***です。

##書き込み用ツールのK-Flashを準備する
ファームの書き込みには専用のツールを使います。
これにはいくつかありますが、私は1のK-Flash v0.4.1でうまく書き込めました。
私の環境ではK-Flash guiは起動でハマってしまいました。

***1.K-Flash v0.4.1***　←私がつかったやつ
https://kendryte.com/downloads/

***2.K-Flash gui***　←別のやつ
https://github.com/sipeed/kflash_gui/releases
![2019-12-13 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/1b5fe0f5-f74c-f516-e886-2a12dbe4c7da.png)

可愛いアイコンのK-Flash v0.4.1を開くと小さいウィンドウが出てくるので入力していきます。

***Device***
USB-TypeCで接続すると、ポートが2つでてきます。一方がアタリで他方がハズレです。
ポートが若い方がアタリという噂があります。
ハズレを選んだ場合、書き込みがうまくいかずエラーがでるだけなのでTry & Errorで力押ししましょう。

***Baude rate***
ボーレートも力押しで！速い方から試せば効率的にTry & Errorができます。
私の場合は1500000で行けました。

***Chip***
In-Chipにします。

***Firmware***
先ほどダウンロードしたファームを選択します。

***Open terminal after flash***
どっちでもいいですが、terminal開いてもやることないのでチェックを外した方が煩わしくないです。

＊同じ条件でも繰り返すと書き込めたりします。

#MaixPy IDEの導入
最新のMaixPyをダウンロードします。

>2019.12.13現在、最新はv0.2.4ですが、***v0.2.4のディレクトリはひっかけ***なので注意してください。
>本物は***一番上の"_"ディレクトリ***に隠されています。


その中から自分のPC用のインストーラをダウンロードしてインストールします。
＊解凍できない場合はいろいろな解凍ソフトを試してみてください。私は愛用のLhaplusで開けませんでした。
![2019-12-13 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/bb2d3ac6-121e-dc6c-226e-fa5ff958365a.png)

#Wifi繋げて顔認識
顔認識やWifi接続に関してはsipeedのgithubにサンプルコードがあります。
これらを合体して下記のコードを作ります。

***顔認識のサンプルコード***
https://github.com/sipeed/MaixPy_scripts/blob/master/machine_vision/demo_find_face.py

***wifi接続のサンプルコード***
https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_esp32_network.py

WIFI_SSIDとWIFI_PASSWDに自分の環境のID/PASSを入れます。

```
import sensor
import image
import lcd
import KPU as kpu
import network
from Maix import GPIO
from fpioa_manager import fm, board_info

WIFI_SSID = "*****"
WIFI_PASSWD = "*****"

# IO map for ESP32 on Maixduino
fm.register(25,fm.fpioa.GPIOHS10)#cs
fm.register(8,fm.fpioa.GPIOHS11)#rst
fm.register(9,fm.fpioa.GPIOHS12)#rdy
fm.register(28,fm.fpioa.GPIOHS13)#mosi
fm.register(26,fm.fpioa.GPIOHS14)#miso
fm.register(27,fm.fpioa.GPIOHS15)#sclk

nic = network.ESP32_SPI(cs=fm.fpioa.GPIOHS10,rst=fm.fpioa.GPIOHS11,rdy=fm.fpioa.GPIOHS12, mosi=fm.fpioa.GPIOHS13,miso=fm.fpioa.GPIOHS14,sclk=fm.fpioa.GPIOHS15)

# Wifi connection
nic.connect(WIFI_SSID, WIFI_PASSWD)
print(nic.ifconfig())
print(nic.isconnected())

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
task = kpu.load(0x300000) # you need put model(face.kfpkg) in flash at address 0x300000
# task = kpu.load("/sd/face.kmodel")
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print(i)
            a = img.draw_rectangle(i.rect())
    a = lcd.display(img)
a = kpu.deinit(task)
```

#動作テスト
MaixPyの左下にある緑色の鎖マークを押してMAiXDUiNOと接続します。
＊このとき、ファームやMaixPyのバージョンが一部古いなどの相性が悪いとポート接続が一生終わりません。

![2019-12-13 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/10ca2a2d-c0e5-17d2-1fec-93df2a9a22f5.png)

鎖マークが赤くなって下の再生マークが緑になったら再生マークで実行します。

![2019-12-13 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/25d1a1c3-6054-58da-1019-8fddba4b876c.png)

![2019-12-13 (11)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/bcfab1a7-0c61-37ac-901f-e5a8eccb8490.jpeg)

顔を認識しました。

#MAiXDUiNO単体で動かす方法
マイコンさんにはMaixPy IDEからの再生ボタンではなく、モバイルバッテリーなど電源いれるだけで動いて欲しいです。
どう書き込めばいいのかよくわからなかったのですが、MicroSDから動かせそうなのでやってみました。

結論からいうと、***boot.py***とリネームしてMicroSDに書き込んでおけば、boot.pyを実行します。

Pythonだとmain.pyに書くらしいのですが、PicroPythonでマイコン動かすときはboot.pyに書いてみたら動きました。これが正しいのかわかりませんが、動いたので今日のところはよしとします。

#まとめ
- MAiXDUiNOで顔認識とWifi接続までできた
- ツールやファームのバージョンに気を付けないとすぐに行き詰まる
- MAiXDUiNOは環境作るの不安定だけど、安定後はサクサクできた
- Noodl使うところまでいけなかったけど、ここまできたらMQTTでいけそう
- 清水さんが公開されました

#所感
深圳の風を感じたいと思ってMAiXDUiNOを使ってみたところ、同じところで躓いてる人が少なくて悲しみでした。でも同じレベルの人の助けになれたらと思います。
公式フォーラム神。
顔認識を動かしてみて、人間のコミュニケーションが高度なセンシングで成り立ってることを肌で実感しました。今後はコミュニケーションに関わる技術を中心に深堀りできたらと思います。

今年はIoTLTのおかげでIoT, LT, アウトプットデビューができました！
みなさまのおかげで充実した年になりました、ありがとうございます。
来年もいろいろと挑戦します。

満月の夜に感謝をこめて