はじめに
Seeed studioからK210というKPU(AIアクセラレータ付き)のマイコンボード「Sipeed M1 dock suit」が発売されているので、試してみました。
マイコンボード自体の詳しい説明は公式ドキュメントもありますので省きますが、主に下記のような特徴を持つK210と呼ばれるモジュールにブレークアウトボードをくっつけた基板に、OV2640カメラと2.4インチLCDをセットにしたキットがSipeed M1 dock suitです。
- RISC-V×2で構成されるCPU
- CNNアクセラレータであるKPU
- ハードウェアFFTに対応したAPU
- そのほかGPIO、SPI、I2CなどのIOを持つ
今回はSeeed studioの公式サイトから直輸入で購入しましたが、注文から到着までおよそ2週間でした。ChinaPost経由でボコボコの箱が届きましたが、中身は無事でした笑
技適マークの関係でWiFi無しモデルを選択しましたが、WiFi付きモデルも存在します。
一つ18.9ドルととてもお安いです。
Tiny-yoloを10fps以上の速度で動かせる(後述)モジュールとしては、消費電力や価格の面でコストパフォーマンスが非常に良いのではないでしょうか。TPUやNCSなどのUSBアクセラレータタイプのモジュールと比較しても、シングルボードですべて完結するので楽ちんです。
購入時送料の関係からマイクアレイやステレオカメラ、一回り小さな開発キットを購入しましたので、別の機会に記事を書きたいと思います。
ちなみに単体のマイクを買ってあとから気づきましたが、M1 dockにはマイクが内蔵されていました。
- Sipeed 6+1 Microphone Array for Dock/Go/Bit
- Sipeed I2S Microphone for MAIX Dev. Boards
- Sipeed MAIX Binocular Camera for Dock/Go/Bit
- Sipeed MAix BiT Kit for RISC-V AI+IoT
※こちらの記事を参考にさせていただき、試しています。
https://qiita.com/Ke_N_551/items/55c6442a53ffc0072363
ハードウェアセットアップ
パッケージは下の写真のような物品で構成されています。M5stackの箱によく似た感じ。
ハードウェアのセットアップは、LCDとカメラのフレキケーブルを接続すればおしまい。簡単ですね。フレキケーブルを接続する面に、シリコンマイクやTFカード(microSDカード)スロットが見えます。
同時に購入したMAIX BiT kitと比較すると、モジュール部分がシールドで覆われたものか否か等微妙に構成が異なるようです。
ちなみにケースはThingiverseより拝借しました。が、精度の問題か微妙にはまらないので、そのうち作り直そうと思っています。
ファームウェアの準備
公式の手順に従います。この記事では、Ubuntu16.04で試した内容を記載しています。
USBシリアル接続環境の準備
M1 dockではCH340をUSBシリアル用チップとして使っていますので、ドライバをインストールしておきます。ドライバのインストールがうまくいっていれば、USB接続時に/dev/ttyUSB*で認識されるはずです。参考までに、lsusbの結果を張り付けておきます。
$ lsusb
Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
うまく接続されていれば、青い画面が表示されるはずです。
ファームウェアの焼きこみ
ファームウェア焼きこみ用のツールが用意されていますので、そちらを使えるようにします。
Python3およびpyserialの環境構築を忘れずに。
$ git clone https://github.com/sipeed/kflash.py
続いて、焼きこみ用のファームウェアとサンプルで利用するモデルをダウンロードしておきます。2019年5月11日現在で最新の、v0.3.1の中から
- maixpy_v0.3.1_full.bin
- face_model_at_0x300000.kfpkg
の二つをダウンロードしました。続けて2つのファイルをフラッシュしてあげると、MicroPythonプログラム側からモデルを読み込めるようになります。
下記のように、それぞれ「Rebooting...」まで行けば書き込み完了です。
$ sudo python3 kflash.py -p /dev/ttyUSB0 -b 2000000 -B dan maixpy_v0.3.1_full.bin
[INFO] COM Port Selected Manually: /dev/ttyUSB0
[INFO] Default baudrate is 115200 , later it may be changed to the value you set.
[INFO] Trying to Enter the ISP Mode...
.
[INFO] Greeting Message Detected, Start Downloading ISP
[INFO] CH340 mode
Downloading ISP: |=============================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000
[INFO] Wait For 0.1 second for ISP to Boot
[INFO] Boot to Flashmode Successfully
[INFO] Selected Baudrate: 2000000
[INFO] Baudrate changed, greeting with ISP again ...
[INFO] Boot to Flashmode Successfully
[INFO] Selected Flash: On-Board
[INFO] Initialization flash Successfully
Programming BIN: |=============================================| 100.0% 67kiB/s
[INFO] Rebooting...
$ sudo python3 kflash.py -p /dev/ttyUSB0 -b 2000000 -B dan face_model_at_0x300000.kfpkg
[INFO] COM Port Selected Manually: /dev/ttyUSB0
[INFO] Default baudrate is 115200 , later it may be changed to the value you set.
[INFO] Trying to Enter the ISP Mode...
.
[INFO] Greeting Message Detected, Start Downloading ISP
[INFO] CH340 mode
Downloading ISP: |=============================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000
[INFO] Wait For 0.1 second for ISP to Boot
[INFO] Boot to Flashmode Successfully
[INFO] Selected Baudrate: 2000000
[INFO] Baudrate changed, greeting with ISP again ...
[INFO] Boot to Flashmode Successfully
[INFO] Selected Flash: On-Board
[INFO] Initialization flash Successfully
[INFO] Extracting KFPKG ...
[INFO] Writing facedetect.kmodel into 0x00300000
Programming BIN: |=============================================| 100.0% 71kiB/s
[INFO] Rebooting...
サンプルプログラムの実行
シリアル接続すると、MAIXPYというMicroPythonのカスタマイズが動作します。
正しく起動していれば、下記のようにプロンプトが表示されるはずです。うまく表示されない場合は、RSTボタンやCtrl+C入力を試してみると良いでしょう。
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:416000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
heap0=0x801c97b8
[MaixPy] sd_init | SD_CMD0 is FF
__ __ _____ __ __ _____ __ __
| \/ | /\ |_ _| \ \ / / | __ \ \ \ / /
| \ / | / \ | | \ V / | |__) | \ \_/ /
| |\/| | / /\ \ | | > < | ___/ \ /
| | | | / ____ \ _| |_ / . \ | | | |
|_| |_| /_/ \_\ |_____| /_/ \_\ |_| |_|
Official Site : https://www.sipeed.com
Wiki : https://maixpy.sipeed.com
MicroPython v0.3.1 on 2019-04-27; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>>
基本的にはPythonと同様にプログラミングできるのですが、利用できるモジュールは下記の通り確認ができます。
>>> help('modules')
KPU fpioa_manager os uhashlib
Maix gc pye_mp uheapq
__main__ hashlib random uio
_boot heapq re ujson
_thread image sensor uos
_webrepl json socket urandom
array lcd struct ure
audio lvgl sys usocket
binascii lvgl_helper time ustruct
board machine touchscreen utime
builtins math ubinascii utimeq
cmath math ucollections uzlib
collections micropython ucryptolib video
cpufreq nes uctypes websocket
errno network uerrno zlib
Plus any modules on the filesystem
プログラムを実行する方法はいくつもありますが、今回はプロンプトから直接コードを入力して実行する方法をとりました。
プロンプト上でCtrl+Eを押すと、コピペモードになりますので、下記のコードを貼り付けて実行しました。コピペ後、Ctrl+Dを押すと即座にプログラムが実行されます。
import sensor
import image
import lcd
import KPU as kpu
import utime
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
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)
prev_time = utime.ticks_us()
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())
now_time = utime.ticks_us()
print("FPS:" + str(1000000/utime.ticks_diff(now_time, prev_time)) + " Detections:" + str(len(code)))
prev_time = now_time
a = lcd.display(img)
a = kpu.deinit(task)
基本的にはサンプルプログラムをそのまま動かしているのですが、フレームレートを測定するためのコード(7,25,26行目)と画面反転を正すためのコード(11行目)を入れています。
ちなみに、print文の動作が緩慢なので23行目をコメントアウトしています。
余談ですが、OpenMVのポーティングであるimageモジュールやカメラを扱うためのsensorモジュールなど、K210ボード用のライブラリがありますので、ドキュメントを一読されると色々できて楽しいと思います。(NES game emulatorとかライブラリ化されてる…笑)
さて、実際に実行すると下記のようにプロンプト表示がされます。
安定して11FPSを超えていることがわかります。
FPS:11.60375497510995 Detections:6
FPS:11.60564034120583 Detections:6
FPS:11.60725685698699 Detections:6
FPS:11.59864063931707 Detections:6
FPS:11.86718249353239 Detections:5
FPS:11.60510160266453 Detections:5
FPS:11.59272440616269 Detections:5
認識対象は、Googleで「顔」と画像検索させた結果です笑
推論実行時の消費電力は0.24Aでしたので、5V動作で1.2W程度と非常に優秀です。
Ctrl+Cを押すと、プログラムが終了してプロンプトに戻ってきます。
今後
そのうち、下記を試してみたいと思います。
- 他の学習済みモデルの変換と実行
- GPIOの利用
- ステレオカメラモジュールの利用
それでは!