toshiki

2ドルのマイコンで画像認識を2倍速にした話

· Hacker News #130

約2ドルのESP32-S3の128bit SIMD命令でFASTコーナー検出を書き直し、5.1→11.2MP/sに。QVGA1枚が約6msで処理できる。

  • #esp32
  • #simd
  • #computer-vision
  • #embedded
  • #assembly

#なぜ今日これを選んだか

Rust+ハードウェアの目標(#130)と、可動域アプリで扱っている画像処理がちょうど重なる記事だからです。高価なGPUではなく、約2ドルのマイコンで画像の特徴点を毎秒30枚取れるところまで速くしています。「性能は道具の値段ではなく、中身の理解で決まる」ことがよく分かる一本です。

#要点

  • ESP32-S3(最大240MHz・デュアルコア・128bit SIMD・Wi-Fi/BLE付きで約2ドル)で、FASTコーナー検出をXtensaアセンブリで書き直した
  • 1命令で8bitの画素16個をまとめて処理し、周囲4方向の画素で「明らかに角ではない点」を先に捨てる。処理量は5.1→11.2MP/s(約2.2倍)、QVGA(320×240)1枚が約6ms
  • 命令セットが貧弱なのが難所。符号付き比較しかないので画素を XOR 0x80 でずらす、ずれた番地は読めないので隣り合う2ブロックから切り出す、といった回避策を積み上げている

#自分にとっての示唆

可動域アプリの「揺れ対策」も、この記事の「先に安い判定でふるい落とす」と同じ考え方で整理できます。全部の点を重く計算する前に、明らかに使えない点を捨てる。もう一つは、制約がある環境でこそ低レイヤーの理解が効くということです。Rustはこの層(組込み・SIMD)を安全に書ける言語なので、#130の「Rust+ハードウェア」は遠回りではありません。明日からは、可動域アプリの30分の中で「どの処理が一番重いか」を1回だけ測ってみます。速くするのは、その数字を見てからです。