Windows環境でSiPEED M1 dockが顔認識できるまでの手順

とある勉強会で発表ネタのメモとして作成したもの。少し整理してQiitaに投稿。

# Introduction

ものづくり界隈で話題（？）になっている「SiPEED M1 dock」と呼ばれるAI/IoTの開発キットがある。マイコンではやや荷が重い、計算量が多い多層のニューラルネットワークを専用に処理するアクセラレータがついたモジュールがあるのが特徴であり、各種I/O、LCD、カメラなどがまとめられた開発キットとなっている。この記事ではWindows環境で「SiPEED M1 dock」を使えるようにするための手順とどんなHWなのか調査を含め用語集としてまとめた。
IoTがより社会に浸透するためにはエッジ側にAI、機械学習の技術が必要と考えている者としては面白いHW。AI/IoT = AIoTとして、エッジで推論させるハードウェアが安く購入できるようになったことに驚き（3000円程度）。

![](https://i.imgur.com/QD9JPlx.png)

![](https://i.imgur.com/ClnOzJn.gif)

# 手順

大まかに下記の流れになる。

1. CH340 USB-シリアル変換ドライバのインストール（1度だけで良い）
2. SiPEED M1 dock(以下M1 dock)のSipeed M1(以下M1)のfirmware更新
3. M1 dockにmicroPythonコードを転送し実行

## 準備するモノ

### ハード

* M1 dock（別途入手。例えば下記のサイト）
    * https://www.seeedstudio.com/sipeed

M1Wは日本の技適が通っていないのでM1がおすすめかもしれません。
![](https://i.imgur.com/2JvS8ip.png)
カメラはすでに取り付けたので割愛
![](https://i.imgur.com/I0AdKgU.png)

* micro USBケーブル または TypeCケーブル

付属品のM1 dockの中にtype<->microusb変換が入っています。
    
### ソフトウェア
手順の中でも説明します。

* CH340 USB-シリアル変換ドライバ
    * 江蘇沁恒股分有限公司 CH340 http://www.wch.cn/products/CH340.html
    * http://www.wch.cn/downloads/CH341SER_EXE.html
* MaixPy
    * M1のファームウェア
    * https://github.com/sipeed/MaixPy/releases
* kflash
    * firmwareの書き込みツール
    * https://github.com/kendryte/kendryte-flash-windows/releases
* MaixPy IDE
    * OpenMVをベースとしたMaixPy用の統合開発環境
    * http://dl.sipeed.com/MAIX/MaixPy/ide/
        * 0.2.2が最新（2019/5/26）

## 手順

### 組み立てと本体の接続

**1. M1 dockにカメラとLCDを接続する**
カメラとLCDのフラットケーブルは横からの力に弱いので扱いは注意すること。

![](https://i.imgur.com/pkoGb2W.png)

**2. PCと接続する**
M1 dockのUSB TypeCコネクタとPCを接続する。写真は付属の変換ケーブルを介して接続。

![](https://i.imgur.com/bXV7AOX.png)

### CH340 USB-シリアル変換ドライバのインストール

USB-シリアル変換ドライバをインストールする。USB-シリアルの変換チップとしてFTDI社のFT232xが用いられることが多いが、中国ではコスト面でCH340というチップが用いられることが多いようである。

**1. CH340のドライバをダウンロードする**
メーカーのページよりドライバをダウンロードする。
http://www.wch.cn/downloads/CH341SER_EXE.html

**2. ドライバをインストールする**
ダウンロードしたドライバを実行しインストールする。
![](https://i.imgur.com/Uy3SsQZ.png)

**3. デバイスマネージャーで接続を確認**
ドライバのインストール、接続ができていればデバイスマネージャーのポートにCH340(COM ポート番号)が表示される。
![](https://i.imgur.com/ULLsYbd.png)

### M1のfirmware更新

**1. kflashの取得**

kflashはKENDRYTE社製のwindows環境での更新ツール。
githubのリリースに最新verがあるのでダウンロードする。

kflshaのダウンロード
https://github.com/kendryte/kendryte-flash-windows/releases

**2. firmware(MaixPy)のダウンロード**

MaixPyはM1(K210)のfirmwareになる。機能更新（MaixPy IDEのサポートなど）、バグフィックスがあるので適宜更新する。

MaixPyのgithubページのリリースからダウンロード
https://github.com/sipeed/MaixPy/releases
「**maixpy_v0.3.2_full.bin**」と「**face_model_at_0x300000.kfpkg**」をダウンロードしておく。

リリースページには複数のbinファイルがある。詳細は下記。現状はfullで良いが、モデルが大きい場合はminimumにするといった検討する。その場合、後述のMaixPy IDEは使用できなくなる。
https://maixpy.sipeed.com/en/get_started/upgrade_firmware.html
> maixpy_v###_full.bin: The full version of MaixPy firmware (MicroPython + OpenMV API + lvgl)
> maixpy_v###_no_lvgl.bin: MaixPy firmware without LVGL version. (LVGL is an embedded GUI framework, you need to use when writing the interface)
> maixpy_v###_minimum.bin: MaixPy firmware minimum set. Does not support MaixPy IDE, does not include LVGL nor OpenMV
> face_model_at_0x300000.kfpkg: Face model, placed in address 0x300000, can be downloaded multiple times from .bin without conflict
> elf.7z: elf file, ordinary users do not care, used for crash debugging

**3. kflashを起動してMaixPyのアップデート**

kflashを用いてM1 dockにMaixPyをアップロードする。

kflashを起動し下記の設定を確認
-Baud rate:2000000
-Chip:In-Chip

![](https://i.imgur.com/Nvhjgnb.png)

firmwareにダウンロードした「maixpy_v0.3.2_full.bin」のパスを設定する。

![](https://i.imgur.com/T3IGhSh.png)

電源断やケーブルの接触不良が起きない状態にしてからFlashボタンを押す。数十秒で書き込みが終わる。

**4. モデルのアップロード**

前から引き続きで、顔認識モデル（face_model_at_0x300000.kfpkg）をアップロードする。

![](https://i.imgur.com/z2OYTgX.png)

2回に分けて更新しているのは、フラッシュメモリのアドレスでMaixPyの領域とModelの領域を分割している（と思われる）。イメージとしては下記になる。

| Address  | 対象 |
| -------- | -------- |
| 0x000000~0x2FFFFF | ブートローダ,MaixPyなど |
| 0x300000~ | NNのモデル、顔認識など     |


### M1 dockにmicroPythonコードを転送し実行する

「MaixPy IDE」はOpenMV(https://openmv.io/)をベースとしたMaixPy用の統合開発環境。「MaixPy IDE」を用いてM1 dockに接続し、pythonのコードを実行する。なお、「MaixPy IDE」を使用しない場合はM1 dockにシリアル接続してコンソールでmicroPythonのコードを実行することになる。

**1. MaixPy IDEのインストール**

下記のサイトからMaix Py IDEのセットアップをダウンロード
http://dl.sipeed.com/MAIX/MaixPy/ide/

\* 2019/5/26段階でV0.2.2が最新
http://dl.sipeed.com/MAIX/MaixPy/ide/v0.2.2/

**2.  MaixPy IDEの起動**

インストール後、MaixPy IDEを起動する。MaixPy IDEで顔認識のデモコードを入力する。

* 顔認識のコード（MaixPy scripts）

https://github.com/sipeed/MaixPy_scripts/blob/master/machine_vision/demo_find_face.py

上記サイトのコードを下記に張り付ける。

``` python
import sensor
import image
import lcd
import KPU as kpu

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)
```

新規作成してもよいし、IDE上のタブの一つに張り付ける。

![](https://i.imgur.com/4AB4yDH.png)

**3. M1 dockと接続する**

左下にある緑色の「鎖」のマークのアイコンをクリックすると、IDRとM1 dockが接続される。

![](https://i.imgur.com/4AB4yDH.png)

下記のようなプログレスバーが表示される。

![](https://i.imgur.com/sgS5iI6.png)

**4. コードをM1 dock上で実行する**

接続が完了すると「鎖」マークが赤色になる。「▶」マークをクリックするとコードが実行される。

![](https://i.imgur.com/GXl1XA9.png)

M1 dockのLCDにはカメラで左右反転された状態で表示され、顔があれば白い枠で表示される。IDE上では、取得したカメラが画像が表示される。

![](https://i.imgur.com/YClx3c9.png)

終了には、IDE上の「赤×」をクリックして処理を終了して、「赤鎖」をクリックし接続を解除する。

### メモ
* 処理中はM1が熱くなる、ヒートシンクや空冷が必要になるかもしれない。
* カメラはQVGAなので画質が悪い。。。
* カメラのフラットケーブルが短い

## 用語集

主観だが新しいモノは企業の説明ページでも用語の揺らぎがあったり、使う側も推測で名称を使い間違った認識のまま一人走りすることがそこそこある。今回の製品について調べた範囲で整理し用語集としてまとめる。

* SiPEED

深センの企業。[SiPEED](https://www.sipeed.com/)。クラウドファンディングで「Sipeed MAIX : The World First RISC-V 64 AI Module」としてAI、IoTのモジュール・開発キットの提案・作成を募集し成功
[Sipeed MAIX : The World First RISC-V 64 AI Module](https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/)

* MAIX, MAiX

Sipeedが開発したAIを実行するためのモジュール、開発ボードのシリーズ総称のこと（？と推測）

下記のようなものがある
SiPEED M1/M1W（モジュール）
SiPEED M1 Dock(SiPEED M1/M1W、LCD、カメラがセットになっている開発キット)
SiPEED Bit（Dockをコンパクトにしたもの。I/Oやメモリ制限があると思われる）
SiPEED Maix Go（STマイクロのSTM32F103C8を追加したver？）

* Sipeed M1 (Lichee Dan), M1W

SiPEEDが開発した「K210を搭載し、電源回りやI/Oを整備し、MaixPyが動作できるようにしたMPU/モジュール」のこと。MaixPyでモジュール上のK210の各種機能を呼び出し実行する。

構成によりモデル名が異なる。
M1 = K210＋SRAM＋16MB Flashメモリ
M1W = K210＋RAM＋16MB Flashメモリ+WiFi(ESP8235)

![](https://i.imgur.com/zjWqKdW.png)

↓左上にESP8235、左下にK210、左下にフラッシュメモリ（Windbond）
![](https://i.imgur.com/RTjJmLs.jpg)

性能
RISC-V Dual-core 64bit with FPU(浮動小数点演算ユニット)
Microphone array(8 mics)
Hardware AES SHA256
hardware FPU and convolution accelerator
8MB(6MB+2MB) RAM
16MB external Flash
Max 800MHz CPU freq (see the dev board in detail)
FPIOA (Periphrals can map to any pins)
Peripherals: I2C, SPI, I2S, WDT, TIMER, RTC, UART, GPIO etc.

* K210

KENDRYTE(https://kendryte.com/)が開発したAIとIoT向けのMPUまたは高性能のMPU
![](https://i.imgur.com/y6sh5bH.png)
![](https://i.imgur.com/glmHOlH.png)

特徴
RISC-V Dual-core 64bit with FPU(浮動小数点演算ユニット)
APU/FFT Unit（音処理およびフーリエ変換のユニット）
Microphone array(8 mics)
Hardware AES SHA256

※感想
個人的にはFFTがハード実装されているのがよいと思っている。音は画像に比べて1sampleあたりの情報量が少なく（1D vs 2D）、高速にサンプリングしないと重要な特徴（指パッチンのような音）がつかめないため、機械学習としては扱いにくいデータと思っている。FFTがあるとSFFTしてCNNといったように処理方法が変わってくる。

* KPU

開発データシートを意訳（ https://github.com/kendryte/kendryte-doc-datasheet/blob/master/en/003.md ）すると、KPUは汎用ニューラルネットワークプロセッサである。畳み込み、バッチ正規化、活性化関数、プーリングの操作ができるとのこと。他メーカーはNPUといった記載をしているが区別をつけるためか別にしている模様。

仕様は下記の通り。抜粋。
ネットワークの各層の数、入力と出力の数に制限はなし。
畳み込みのサイズは1x1 or 3x3のみ。
活性化関数はなんでもよし。
リアルタイムで処理（>30fps）するには5.9MiBより少ないモデルである必要がある。
> * Supports the fixed-point model that the mainstream training framework trains according to specific restriction rules
> * There is no direct limit on the number of network layers, and each layer of convolutional neural network parameters can be configured separately, including the number of input and output channels, and the input and output line width and column height
> * Support for 1x1 and 3x3 convolution kernels
> * Support for any form of activation function
> * The maximum supported neural network parameter size for real-time work is 5MiB to 5.9MiB
> * The maximum supported network parameter size when working in non-real time is (flash size - software size)

* MaixPy

K210上で動作するようにmicroPythonをポーティングしたもの。

オープンソースで開発中
https://github.com/sipeed/MaixPy

MaixPyのサンプルスクリプトは下記
https://github.com/sipeed/MaixPy_scripts

* CANAAN CREATIVE

中国（？）のスーパーコンピュータ向けのチップを作成している企業

2013年スーパーコンピューター向けチップに創業。その後、bitcoinマイニング向けハードなどの作成を行う。2018年に人工知能のNNのチップを製造し今に至る。（https://canaan-creative.com/en/about.html）

ソフト、ハードのサービスを展開し、下記のTrademark（商標）で事業展開中。
KENDRYTE 嘉楠 嘉楠科技 勘智

* RISC-V

RISCの設計思想に基いた、オープン標準の命令セット・アーキテクチャ（wiki参照:https://ja.wikipedia.org/wiki/RISC-V）

* RISCとCISC

命令セットアーキテクチャを1命令セットで出来ることの多さ（＝1クロックで複雑なことができるか）で分類したもの。
CISC：Complex Instruction Set Computer：複雑命令セット
RISC：Reduce Instruction Set Computer：縮小命令セット
企業が独自に命令セットアーキテクチャを作り製品化。代表例。↓
RISC：Arm社のArmアーキテクチャ
CISC：Intel社x86/x64アーキテクチャ

## 参考資料

1. [Sipeed MAIX : The World First RISC-V 64 AI Module（indiegogoのページ）](https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/)
2. [K210 DATA SHEET（メーカーの公開ドキュメント）](https://kendryte.com/downloads/)
3. [K210 DATA SHEET（githubのドキュメント）](https://github.com/kendryte/kendryte-doc-datasheet)
4. [MaixPy DOC（SiPEEDの公式ドキュメント）](https://maixpy.sipeed.com/en/)
5. [Sipeed M1 dock suit (Dan Dock) を買ってからサンプルの顔検出プログラムを動かすまで](https://qiita.com/Ke_N_551/items/55c6442a53ffc0072363)
6. [Sipeed M1でTiny YOLOv2の20クラス検出器デモを動かすまで](https://qiita.com/k2kdisk/items/9d092ac94e88ba719049)
7. [Sipeed M1 dockを動かしてみた](https://qiita.com/kitata9/items/37f39b91e2b007ff8cd5)