5.34. まとめ¶
image モジュールはカメラが公開する最大の API であり、この章ではその概要を扱いました。画像がメモリ上でどう表現されるか、カメラが個々のピクセルをどう読み書きするか、撮影したフレームにどう描画するか、それらを算術的・幾何学的にどう変換するか、しきい値で分類してフィルタリングするか、そこから測定値や検出結果をどう抽出するか、印刷されたシンボルをどうデコードするか、ある画像を別の画像とどう比較するか、そして結果をカメラへどう出し入れするかです。
このツールキットが幅広いのは意図的なものです。小型の組み込みカメラ上で動く古典的なコンピュータビジョンのパイプラインは、機械学習モデルがある場合でも、その作業のほとんどを何かがモデルに届く 前に 行います。しきい値処理が入力を整え、フィルタがノイズを除去し、領域が探索範囲を絞り込み、ブロブや線の検出器が候補を局所化し、類似度スコアリングが候補が興味深いかどうかを判断し、I/O 層が結果を次のステージを動かすものへ引き渡します。この章の各ページはそれらの操作の 1 つを扱いました。任意のアプリケーションに対する適切なパイプラインは、問題が要求する順序でそれらを構成した連なりです。
5.34.1. パイプラインのパターン¶
ほとんどの自明でないカメラアプリケーションは同じ概略に従います。センサーからフレームを キャプチャ します。それを 前処理 します。フォーマットを変換し、ヒストグラムを平坦化し、ノイズをぼかして除去します。関心のある領域や特徴を 局所化 します。ブロブ検出、線検出、テンプレートマッチング、コードのデコードです。見つかったものを 分析 します。幾何学的な測定、類似度スコアリング、統計です。分析に基づいて何をするかを 決定 します。GPIO をトリガーする、ペイロードを報告する、キャプチャしてログに記録する、フレームを ML モデルに引き渡すなどです。決定やキャプチャした成果物を 出力 します。保存、エンコード、送信、IDE プレビュー用にフレームへの描き戻しです。
この章のどの 1 ページも、あらゆるステップを扱ったわけではありません。この章は、パイプラインが構成する 構成要素 を扱いました。どの構成要素をどの順序で使うかを選ぶのは、アプリケーションスクリプトの仕事です。
5.34.2. この章が導く先¶
image モジュールは画像を 画像として 扱います。ピクセル、領域、描画、検出です。キャプチャしたデータに対する作業の多くは、その枠組みに収まりません。任意の数値配列に対する統計の計算、生のセンサーデータに対するベクトル化された算術の実行、image モジュールのメソッドが背後にないカスタムの行列変換の適用、特定のテンソルレイアウトを必要とする機械学習モデルのためのデータ準備、これらはすべて画像処理ライブラリではなく数値配列ライブラリの仕事です。
次の章はまさにそれを扱います。カメラ上の MicroPython に同梱されている ulab.numpy モジュールは NumPy のサブセットであり、2 つの橋がそれを image モジュールに接続します。to_ndarray() はフレームのピクセルを数値処理のために ndarray にコピーし、Image コンストラクタは ndarray を受け取って結果から新しい画像を構築し、表示、保存、または image ライブラリへの再投入に備えます。この 2 つのモジュールは互いを補い合います。それぞれが相手の行わないことを行い、両者を合わせて組み込みビジョンアプリケーションが必要とする数値処理と画像処理の作業をカバーします。