Sipeed M1w dock suit: RISC-VのエッジAI+IoT開発ボードで顔認識を試してみた

Sipeed M1w dock suitという開発ボードを紹介します。デュアルコアRISC-VのCPUを搭載し、液晶やカメラの他、オンチップのNNアクセラレータを搭載しておりAI向け用途を志向しているようです。サンプルとして提供されているTinyYolo2での顔認識を動かすまでを紹介します。
2019.04.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Sipeed M1w dock suit という開発用ボードを買ってみました。デュアルコアのRISC-Vプロセッサを搭載し、液晶やカメラを搭載しています。なんと、オンチップのNNアクセラレータを搭載しておりAI向け用途を志向しているようです。サンプルとして提供されているTinyYolo2での顔認識を動かすまでを紹介します。

概要

RISC-Vとは

RISC-V(リスクファイブ)とは最近よく耳にするCPUのアーキテクチャです。命令セット等の仕様やライセンスがオープンになっており、研究開発がさかんに行われています。CPUの教科書で有名なヘネパタ本「コンピュータアーキテクチャ:定量的アプローチ」「Computer Architecture: A Quantitative Approach」最新の第6版では、解説に使用される命令セットがRISC-Vに刷新されています。

Sipeed MAiX Dock

最近になってようやくRISC-Vを採用したチップやボードが安価に入手可能になってきました。Sipeed社MAiX DOCKはそのうちの一つです。

このボードでは、RISC-Vをデュアルコアで搭載したK210というプロセッサを使用しています。最大の特徴は、KPU(Knowldge Processing Unit)という、NNアクセラレータを持っていることで、CNNなどのアルゴリズムを高速に実行することができるとのことです。

K210のチップベンダーkendryte社のサイトに掲げられている特徴を引用します。

  • Performance
    • CPU: RISC-V Dual Core 64bit, with FPU
    • Image Recognition:QVGA@60fps/VGA@30fps
    • Audio: Microphone array (8 mics)
  • Security
    • Advanced encryption standard (AES) hardware accelerator
    • One time programmable (OTP) ROM
    • SHA256
  • Power Consumption
    • Power consumption of typical application scenarios < 1W
    • Power consumption of chip < 300mW
  • Expansibility
    • OS: FreeRTOS
    • NN Model: TinyYOLOv2 (after pruned)
    • DNN Framework: TensorFlow/Keras/Darknet
    • PeripheralsFPIOA/UART/GPIO/SPI/I²C/I²S/WDT/TIMER/RTC, etc.

Sipeed Dan DockにはWiFi無しとWiFi有りのモデルがありますが、購入したのはWiFi有りの、Sipeed M1w dock suitです。

https://www.seeedstudio.com/Sipeed-M1w-dock-suit-M1w-dock-2-4-inch-LCD-OV2640-K210-Dev-Board-1st-RV64-AI-board-for-Edge-Computing-p-3207.html

購入はSeeedStudioから。価格は$19.9で送料と合わせて総額$27。発送は安価なSeeed Carrierで、3/23に注文、4/10に受け取りました。

WiFi搭載ではあるのですが、残念ながら無線設計認証は付いていないので日本国内ではWiFi機能が使えません。写真のようにパッチアンテナが付属していますが、コネクタを接続せずに使うことにします。

実装モジュールのピン配置図を見ると、プロセッサの他に、Flash ROMやWiFiチップが見えます。WiFiはロゴから判断するとESP32が有名なEspressifのチップが使われているようです。

準備

組み立て

ボードの他にカメラや液晶が付属しています。使用する前にこれらを組み立てる必要があります。扱ったことが無いと多少不安があるコネクタかもしれません。フレキシブル基板の先端をコネクタに差し込みます。電極が基板側となる方向です。しっかり差し込んだら、コネクタの黒いレバーを倒してロックしたらOKです。これをカメラと液晶の2箇所行います。

ドライバインストール

USBでMac(PC)と接続しますが、シリアルとして動作させるため、ドライバのインストールが必要です。CH340というチップを使用しているとのことです。これもArduino互換ボード等で使われているのを見かけますね。

macOSの場合は下記からドライバをダウンロードします。High Sierra(10.13)まで対応しているようです。

https://kig.re/2014/12/31/how-to-use-arduino-nano-mini-pro-with-CH340G-on-mac-osx-yosemite.html

ZIPを展開し、インストーラをダブルクリック、指示に従ってインストールします。

インストール後は再起動が必要でした。

動かしてみる

電源接続

ボードとPCをUSBで接続することで電源がオンになります。ボード側のコネクタはUSB-Cです。USB-AとUSB-Cタイプのケーブルを使用しました。

正常に起動すると、液晶画面は真っ赤になり、グリーティングメッセージが表示されます。組み立てはうまくいっているようで一安心。

このままでは、ここから特に変化はありません。

ターミナルを開いて、screenコマンドを使ってシリアル接続します。デバイスは、USB接続時に認識されたものを指定します。速度は115200を指定します。

$ screen /dev/cu.wchusbserialfd120 115200

そうすると、デモが起動して、カメラの画像がリアルタイムに液晶に表示されます。フレームレートはそこそこ速いです。表示は、左右反転の鏡像になっており、鏡を見ているような感じです。

micropython

コンソールには、こんなメッセージが表示されています。

$ screen /dev/cu.wchusbserialfd120 115200
[MAIXPY]Pll0:freq:806000000
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:403000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
heap0=801c4e88
[MaixPy] sd_init | SD_CMD0 is FF

__ __ _____ __ __ _____ __ __
| \/ | /\ |_ _| \ \ / / | __ \ \ \ / /
| \ / | / \ | | \ V / | |__) | \ \_/ /
| |\/| | / /\ \ | | > < | ___/ \ / | | | | / ____ \ _| |_ / . \ | | | | |_| |_| /_/ \_\ |_____| /_/ \_\ |_| |_| Official Site : https://www.sipeed.com Wiki : https://maixpy.sipeed.com PIN 16 pulled down, enter test mode [MAIXPY]:find ov sensor [MaixPy] reset | sensor->slv_addr = 60
[MAIXPY]: exit sensor_reset

MaixPyというのは、このボード用にmicropythonをポーティングしたもののようです。コードはgithubで公開されています。

ここでCtrl-Cを入力すると、デモが停止して、プロンプトが表示されます。

Traceback (most recent call last):
File "_boot.py", line 74, in
File "/flash/boot.py", line 24, in
KeyboardInterrupt:
MicroPython v0.2.4 on 2019-03-21; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>>

>>>は、micropythonのプロンプトです。

表示されているようにhelp()と入力してみます。

>>> help()
Welcome to MicroPython on the Sipeed Maix!

For generic online docs please visit https://maixpy.sipeed.com

Official website : http://www.sipeed.com

Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>>

簡単なmicropythonの操作方法が表示されました。さらにhelp('modules’)と入力してみます。

>>> help('modules')
KPU fpioa_manager pye_mp uio
Maix gc random ujson
__main__ hashlib re uos
_boot heapq sensor urandom
_thread image socket ure
_webrepl json struct usocket
array lcd sys ustruct
audio lvgl time utime
binascii lvgl_helper touchscreen utimeq
board machine ubinascii uzlib
builtins math ucollections video
clock math ucryptolib websocket
cmath micropython uctypes zlib
collections nes uerrno
cpufreq network uhashlib
errno os uheapq
Plus any modules on the filesystem
>>>

MaixやKPUというモジュール名が見えています。

KPUをロードしてみます。KPU.と入力してTABを入力すると補間候補でyolo2の文字が見えますね。

>>> import KPU
>>> KPU.
__class__ __name__ deinit fmap
fmap_free forward init_yolo2 load
netinfo run_yolo2

TinyYolo2をためしてみる

せっかくなのでKPUでYoloを動かしてみたいですね。サンプルスクリプトが、こちらにあります。 https://github.com/sipeed/MaixPy_scripts/blob/898a941ffb7a9d90856dcb69d5b4f012babd0951/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)

REPLのプロンプト(>>>)の状態で、Ctrl-Eでペーストモードに入り、上記スクリプトを貼り付け、そしてCtrl-Dを入力すると即座に実行されます。

PC画面のストックフォトを写してみました。カメラ画像に対して顔認識を行い、認識した箇所が白枠で表示されています。ちゃんと顔認識をしているようです。フレームレートは7~10fpsくらいでしょうか。まぁまぁの速度が出ているようです。

まとめ

SipeedのM1 Dockボードを試してみました。KPUのサンプルとして提供されているTinyYolo2による顔認識を動かすことができました。

このボードには、カメラの他にも、マイクが搭載されていたり、スピーカ端子もあるので、オーディオ処理も可能なようです。サンプルもいろいろ含まれていますので、かなり遊べそうです。無線(WiFi)の認証が解決されるなら、ネットワークに接続されるエッジデバイスとして、さらに応用範囲は広がりそうです。今後が楽しみですね。

このボードを入手ならびに試すにあたって、こちらの先人のページを参考にしました。USB-Cアダプタを使った接続が原因でうまく動作しなかった旨の記載がありますが、私の場合は特に問題なく使えました。 * Sipeed M1 dock suit (Dan Dock) を買ってからサンプルの顔検出プログラムを動かすまで

参考