Raspberry Pi Pico と ILI9341 ディスプレイを使い、EMNIST データセットに基づく文字認識を行うデモです。pico-jxglib ライブラリを利用し、TensorFlow Lite for Microcontrollers を用いています。
このデモは、選択したモデルに応じて、数字(0-9)だけでなく、大文字(A-Z)や一部の小文字(a, b, d, e, f, g, h, n, q, r, t)も認識できます。
GitHub リポジトリ: https://github.com/ypsitau/pico-Recognizer-ILI9341.git
デモ動画
YouTube でデモ動画を視聴できます:
必要なもの
本プロジェクトをビルドするには以下の部品が必要です:
- Raspberry Pi Pico または Pico W, Pico 2, Pico 2 W
- ILI9341 ディスプレイモジュール
- ブレッドボードとジャンパワイヤ
- Micro USB ケーブル
配線
Raspberry Pi Pico と ILI9341 ディスプレイの接続は以下の通りです:
| Raspberry Pi Pico | ILI9341 Display |
|---|---|
| GPIO2 (SPI0 SCK) | T_CLK |
| GPIO3 (SPI0 TX) | T_DIN |
| GPIO4 (SPI0 RX) | T_DO |
| GPIO8 | T_CS |
| GPIO9 | T_IRQ |
| GPIO10 | RESET |
| GPIO11 | DC |
| GPIO12 | CS |
| GPIO13 | LED |
| GPIO14 (SPI1 SCK) | SCK |
| GPIO15 (SPI1 TX) | SDI (MOSI) |
GPIO0 および GPIO1 は認識する TFLite モデルの選択に使います。各モデルは EMNIST データセットの異なるサブセットで学習されています。GPIO0, GPIO1 を GND へ接続することで、下記のようにモデルを選択できます:
| GPIO1 | GPIO0 | 学習データセット | 認識可能な文字 |
|---|---|---|---|
| NC | NC | EMNIST Balanced | 0-9, A-Z, a, b, d, e, f, g, h, n, q, r, t |
| NC | GND | EMNIST MNIST | 0-9 |
| GND | NC | EMNIST Letters | A-Z |
| GND | GND | EMNIST ByMerge | 0-9, A-Z, a, b, d, e, f, g, h, n, q, r, t |
インストール
ビルド済みバイナリを Pico ボードに書き込むには、以下の手順で行います:
-
Pico ボードの BOOTSEL ボタンを押しながら USB で PC に接続し、接続後にボタンを離します。
-
Pico ボードがリムーバブルドライブ(
D:など)として認識されるので、下記のいずれかの UF2 ファイルをコピーします:Pico Board UF2 ファイル Pico / Pico W pico-Recognizer-ILI9341.uf2 Pico 2 / Pico 2 W pico2-Recognizer-ILI9341.uf2
ビルド方法
ソースコードからビルドする場合は、以下の手順で行います:
-
ターミナルで次のコマンドを実行します:
git clone https://github.com/ypsitau/pico-Recognizer-ILI9341.git cd pico-Recognizer-ILI9341 git submodule update --init --recursive -
プロジェクトフォルダで
code .を実行して Visual Studio Code を開き、F7キーでビルドします。buildフォルダ内にpico-Recognizer-ILI9341.uf2が生成されます。
学習と TensorFlow Lite モデルの埋め込み
Google Colab 上でモデルを学習し、TensorFlow Lite 形式でエクスポートする手順はこちらのノートブックで解説しています。ノートブック内のスクリプトを実行すると、以下の tflite ファイルが生成・ダウンロードされます:
Recognizer-emnist-mnist-binary.tfliteRecognizer-emnist-letters-binary.tfliteRecognizer-emnist-balanced-binary.tfliteRecognizer-emnist-bymerge-binary.tflite
pico-jxglib に定義されている EmbedTfLiteModel マクロを使うと、手作業で C 配列に変換することなく、生成したモデルファイルを Pico アプリケーションへ埋め込めます。以下のようにソースコードへ記述してください:
EmbedTfLiteModel("Recognizer-emnist-mnist-binary.tflite", modelData_emnist_mnist, modelDataSize_emnist_mnist);
EmbedTfLiteModel("Recognizer-emnist-letters-binary.tflite", modelData_emnist_letters, modelDataSize_emnist_letters);
EmbedTfLiteModel("Recognizer-emnist-balanced-binary.tflite", modelData_emnist_balanced, modelDataSize_emnist_balanced);
EmbedTfLiteModel("Recognizer-emnist-bymerge-binary.tflite", modelData_emnist_bymerge, modelDataSize_emnist_bymerge);
埋め込んだモデルの利用例は pico-Recognizer-ILI9341.cpp のソースコードを参照してください。
追記
この記事は Zenn と Qiita にクロスポストしています。
