Tried deep neural network 20-classes object detection demo on US$ 19 Sipeed M1 board.
先日ちらっと御紹介した Sipeed M1 dock(別名1: MAIX Dock, 別名2: Dan Dock。発売までの経緯なのか、たくさんの別称がある)を試してみました。日本国内でも既に多くの方が御報告なさっているので、既にネットで記事を見られた方も多いかも知れません。
Sipeed M1 は、Kendryte 社という新興の半導体 SoC メーカーが発売した、ニューラルネットワークの高速化エンジン付き、RISC-V 64ビットデュアルコアマイコン SoC チップ K210 搭載の、カメラ & 液晶パネル付きボードです。マイコンチップだけでも驚きなのに、カメラと LCD が付いて US$ 19 とは、どういう収益構造なのか…(以下略)です。
K210 チップの諸元を引用させて頂きます。tl; dr;
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
- Peripherals FPIOA/UART/GPIO/SPI/I²C/I²S/WDT/TIMER/RTC, etc.
ここには書かれていない情報を補足しますと、
- CPU クロックは標準で 400MHz。700MHz までオーバークロック可能(らしい)
- KPU(ニューラルネットワークエンジン)は標準で 400MHz。750MHz までオーバークロック可能(らしい)
- KPU は 16ビットの固定小数点換算で 230GMAC/s 程度の処理量を実現(400MHz 動作時)
- KPU のデータバッファ用に 2MB、その他のメモリ 6MB、計 8MB の SRAM をチップ内部に搭載
- ブート用、および暗号化関連のために ROM を搭載(ユーザー用の Flash メモリではない)
以下のダイアグラムも参考になります。(出典: https://bbs.sipeed.com/t/topic/691)
個人的な印象を述べますと(長いって!)、
- KPU 用の内部メモリを比較的潤沢に持っているので、画像処理を無理なくこなせそう
- ニューラルネットワークエンジンは固定小数点での動作だが、学習用というよりも推論用と考えれば十分な性能で、かつ消費電力が小さい(1W 以下?)
たとえば NVIDIA Jetson Nano は、GPU を搭載しているため推論だけでなく学習用途としても優秀ですが、単純な推論用途としては消費電力が大きいのがやや難点です。こちらの K210 KPU は固定小数点に最適化されているので学習用には力不足かも知れませんが、推論専用に割り切れば十分なのではないかという気がします。
さて。実際に動かすうえでは、こちらかの方の記事が非常に参考になります。
- Sipeed M1でTiny YOLOv2の20クラス検出器デモを動かすまで
私が利用したのは Sipeed M1 というボードですが、搭載の USB-UART ブリッジ CH340 のドライバとしては、こちら(Mac OS X 10.11.6 (El Capitan) 用)を利用させて頂きました。
上記ドライバをインストール後、再起動したら USB を認識するようになりました。
El Capitan では、kflash_gui が動作しなかった(Mac OS X が古い)ので、kflash をコマンドラインで使用しました。こんな感じです。
$ kflash -p /dev/tty.wchusbserial144420 -B dan maixpy_20class.bin $ kflash -p /dev/tty.wchusbserial144420 -B dan 20class.kfpkg
撮像センサか LCD かの向き(オリエンテーション)が変なので、sensor.set_vflip(0) とかしましたが、これはもうちょっと調整が必要そうです。(左右が逆になる)
無事に、ネコや小鳥やバスの画像識別ができるようになりました。判定の速度はちゃんと測定してませんが、非常に高速です。Google でオカメインコの画像を探してカメラを向けたら、無事に “bird” と認識されました。左右判定してしまうのは乞う御容赦。
今後、もう少し詳細に評価してみたいと思います。今日はここまで。