7.5. ROMFS¶
ROMFSはコンパイル時にカメラに組み込まれ、/rom/ にマウントされる読み取り専用ファイルシステムです。ファイルブロックはフラッシュに存在し、アドレス空間にマッピングされるため、そこにあるファイルを開くとRAMへのコピーなしにフラッシュから直接そのバイトが公開されます。モデル、ラベルファイル、Haarカスケードが典型的な内容です。
7.5.1. なぜモデルがここに置かれるのか¶
2つの理由があります。1つ目は既に述べたRAMのトレードオフです。/rom/ 上のモデルはフラッシュからその場で読み込まれ、テンサーアリーナ以上のRAMを消費しません。一方、/sdcard/ 上のモデルは読み込み時にRAMへコピーされ、アリーナに加えてファイルサイズ分を消費します。小型のカメラでは、その差がしばしば収まるか収まらないかの差になります。
2つ目はNPUです。N6のNPUとAE3のEthos-Uは、適切なアラインメントでメモリアドレス指定可能な領域に重みを置くことを期待します。それらのアクセラレータ向けにモデルをコンパイルするビルドツール(N6のNPU向けのSTEdgeAI、AE3のEthos-U向けのVela)は、結果をそのレイアウトでROMFSに配置します。/sdcard/ から読み込まれたモデルはヒープRAMに置かれますが、これはH7やRT1062が使用するCPUパスには問題ありません。しかし、より高速なカメラが中心に据えて設計されたフラッシュ直接アクセスのNPUパスを放棄することになります。
7.5.2. 通常のMicroPythonファイルシステム¶
実行時にROMFSは他のマウントされたMicroPythonファイルシステムと同様に振る舞います。os.listdir() は /rom/ を列挙し、builtins.open() はその中のファイルを開き、その下のパスはパスを受け付ける任意のAPIに渡せます。唯一の制限は、スクリプトがそこに書き込めないことです -- パーティションは実行時に読み取り専用です。
IDEはROMFSを編集できます。IDEはファイルブラウザでパーティションの内容を公開し、SDカードと同じ方法でそこにファイルを追加、削除、置換できます。意図された用途は、カスタムモデル、ラベルファイル、ヘルパースクリプト、あるいはアプリケーションがカメラと共に出荷する必要のあるその他のリソースを追加することです。IDEを通じて /rom/ に置かれたものはすべて、プリロードされたモデルが持つのと同じフラッシュ直接アクセスでNPUからアクセス可能なストレージを得ます。