Posted at

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円程度)。


手順

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


  1. CH340 USB-シリアル変換ドライバのインストール(1度だけで良い)

  2. SiPEED M1 dock(以下M1 dock)のSipeed M1(以下M1)のfirmware更新

  3. M1 dockにmicroPythonコードを転送し実行


準備するモノ


ハード

M1Wは日本の技適が通っていないのでM1がおすすめかもしれません。



カメラはすでに取り付けたので割愛


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

付属品のM1 dockの中にtype<->microusb変換が入っています。


ソフトウェア

手順の中でも説明します。


手順


組み立てと本体の接続

1. M1 dockにカメラとLCDを接続する

カメラとLCDのフラットケーブルは横からの力に弱いので扱いは注意すること。

2. PCと接続する

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


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

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

1. CH340のドライバをダウンロードする

メーカーのページよりドライバをダウンロードする。

http://www.wch.cn/downloads/CH341SER_EXE.html

2. ドライバをインストールする

ダウンロードしたドライバを実行しインストールする。

3. デバイスマネージャーで接続を確認

ドライバのインストール、接続ができていればデバイスマネージャーのポートにCH340(COM ポート番号)が表示される。


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

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

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

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

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

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

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

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上のタブの一つに張り付ける。

3. M1 dockと接続する

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

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

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

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

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

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


メモ


  • 処理中はM1が熱くなる、ヒートシンクや空冷が必要になるかもしれない。

  • カメラはQVGAなので画質が悪い。。。

  • カメラのフラットケーブルが短い


用語集

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


  • SiPEED

深センの企業。SiPEED。クラウドファンディングで「Sipeed MAIX : The World First RISC-V 64 AI Module」としてAI、IoTのモジュール・開発キットの提案・作成を募集し成功

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)

↓左上にESP8235、左下にK210、左下にフラッシュメモリ(Windbond)

性能

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



特徴

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のページ)

  2. K210 DATA SHEET(メーカーの公開ドキュメント)

  3. K210 DATA SHEET(githubのドキュメント)

  4. MaixPy DOC(SiPEEDの公式ドキュメント)

  5. Sipeed M1 dock suit (Dan Dock) を買ってからサンプルの顔検出プログラムを動かすまで

  6. Sipeed M1でTiny YOLOv2の20クラス検出器デモを動かすまで

  7. Sipeed M1 dockを動かしてみた