#M5StickV でお顔認証する手順


#概要
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/M5StickV?src=hash&amp;ref_src=twsrc%5Etfw">#M5StickV</a> でお顔認識 <a href="https://t.co/Mi488TYHq4">pic.twitter.com/Mi488TYHq4</a></p>&mdash; nnn (@nnn112358) <a href="https://twitter.com/nnn112358/status/1204518670040387584?ref_src=twsrc%5Etfw">December 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

sipeed からMaix用の顔認識モデルが公開されました。なんと、クラウドに繋ぐことなしにコンパクトなマイコンだけで、お顔を認識することができます。
M5StickVでお顔を試してみました。

ソースコードはこちらです。
https://gist.github.com/anoken/7fc193959d64f139a135e859461789aa

#仕組み

お顔認証の仕組みは以下のような流れになっていると推測します。
（あくまでソースコードからの予想）
1.yolov2のニューラルネットワークで顔部分を領域特定。
2.顔周辺エリアを切り取って、128x128にリサイズ。
3.顔周辺から、ニューラルネットワークで目・鼻・口を特定する
4.正面顔に幾何学変換
5.mobilenetv1 のニューラルネットワークで転移学習により、お顔を認識。




#Maixのシリアル番号の取得
Sipeedのサイトから、key genをダウンロードします。
http://blog.sipeed.com/p/1338.html#more-1338


KFlashでM5StickVに書き込みます。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/5004de33-f8d4-1480-15cf-208287a0e911.jpeg)

MaixPy IDEのコンソールで、起動すると、シリアルコードが表示されます。
コピーして保存しておきます。
シリアルコードはMaixボード個体毎に生成されるものです。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/26429e15-26e4-a4c9-2100-0dafc14ee03c.png)


# Sipeedの学習モデルの入手

maixhubから、Sipeedの学習モデルを入手します。
https://www.maixhub.com/

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/e4fb4a35-b42b-fd61-8628-11215a0b13a3.jpeg)

ダウンロードにはシリアルコードが求められるので、Maixボードから取得したものを入力します。
![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/93f081b6-c4c8-ee59-81b5-d405e981cfb8.jpeg)


以下の3つのK210用のニューラルネットワークのモデルが入っています。
![クリップボード06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/7837432b-c6b7-51cb-41fb-625d8ef00422.jpeg)

# M5StickVへの書き込み

M5StickVのファームウェアとニューラルネットワークのモデルをkflashで書き込みして、
ソースコードを実行すると、お顔の認識が動かせる状態になり、、、、

ソースコードはこちらです。
https://gist.github.com/anoken/7fc193959d64f139a135e859461789aa

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/fb98bdf2-dbd0-25e7-ab94-1ca6a1c4d332.jpeg)

**これだけでは動きません！！**	

#M5StickVのメモリ最適化

お顔認証は、3つのニューラルネットワークのモデルを読み込む必要があり、Maixボードのシステムヒープメモリに3MB以上の空きサイズが必要です。空きサイズは、kpu.memtest()コマンドで確認することができます。

![EKsm0BDUcAEHP3N.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/72b8867f-bcad-f54d-e5f6-8a37da08f922.jpeg)

M5StickVのMaixPy最新版(19/12/11時点 ver0.4.0.92)では、システムヒープメモリの空きが2.5MBしかありませんので、モデルを読み込むことができません。
SipeedのMaixボードであれば、minimum版のバイナリが提供されているのですが、M5Stickvはカメラや電源ICがMaixボードとは異なるので、minimum版のバイナリでは色々と不都合があります。

![クリップボード01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/e4d77b5f-9cd4-c71a-b605-f73589e90067.jpeg)

そこで、M5StickVのファイムウェアをカスタマイズし、メモリ最適化をします。

##環境
以下の作業はUbuntu(Linux)が必要です。
Ubuntu18.04 (5.0.0-36-generic)

##ファームウェアのコンパイル

### Maixpyのダウンロード
Maixpyのファームウェアをソースコードからビルドします

```
$ git clone https://github.com/sipeed/MaixPy.git
$ git submodule update --recursive --init
```

### Pythonのインストール
Miniconda をインストールして、 Python の環境を作ります。 
Miniconda のインストーラは、 Miniconda のウェブサイトからダウンロードして取得し
ます。

Miniconda : https://docs.conda.io/en/latest/miniconda.html

```
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```

conda を起動します。

```
$ conda create -n ml python=3.6
$ conda activate ml
```

pyserialをpipでインストールします。

```
$ pip3 install -r requirements.txt
```


### kendryte-toolchainのインストール

kendryteのtoolchainを、/opt/kendryte-toolchain/にインストールします。

```
$ wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz
$ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt
$ ls /opt/kendryte-toolchain/bin
```
https://github.com/kendryte/kendryte-gnu-toolchain/releases

### MaixPyのFirmwareのライブラリを減らす

MaixPyのFirmwareのライブラリを減らすことでシステムヒープメモリの容量をあけることができます。

```
$ cd MaixPy
$ cd projects/maixpy_m5stickv/ 
```

```
$ python3 project.py menuconfig
```

Conponent Configrationを選びます。
![Screenshot from 2019-12-08 15-04-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/294a01c3-a7bc-baa5-d698-b49fa8ff5023.png)

MicroPython Configrationを選びます。
![Screenshot from 2019-12-08 15-04-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/6c643b76-5d70-56a4-062b-bf869ef6f981.png)

Module Configrationを選びます。
![Screenshot from 2019-12-08 15-04-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/91e588ed-9a95-a444-d3d6-279a0102047d.png)

使わないライブラリをOFFにします。
![Screenshot from 2019-12-08 15-05-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/b49d7c61-6324-3acf-18b4-bf0b81943686.png)

今回は、MaixPy IDE Supportを残して他をOFFにしました。
![Screenshot from 2019-12-08 15-05-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/ce583596-6dcf-7084-1bb4-e3b914ae62e3.png)

MaixPyをビルドします。maixpy.binというファイルが生成されれば完了です。

```
python3 project.py build
```

生成されたMaixPyバイナリと学習モデルをKfashで書き込んでみましょう。
今度こそ、動かすことができました。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/a857ceb6-f600-e1a5-4e61-7db19800f4cb.jpeg)



#参考サイト

SIPEED BLOG
http://blog.sipeed.com/p/1338.html

SIPEED maixhub
https://www.maixhub.com/

お顔の画像はぱくたそ様を使いました。
https://www.pakutaso.com/