Raspberry Pi Pico 2 W(以下Pico2W)とHM01B0カメラモジュールを使った画像識別で「熊かも!」を作ろうと言う試みは、何とか識別出来るところまで来ました。
タイトル画像はProcessingで画像と識別結果を表示したものです。160x120の画像を96x96にリサイズしているので横方向に縮んでいます。画像認識ではないので、熊かそうでないかの2クラス識別です。画像を囲んでいる赤枠は画像認識のバウンディングボックスではありません。
Web上で見つけた熊画像と草地の画像を使ってEdge Impulse(以下EI)で学習させたモデルと、HM01B0カメラモジュールから画像を取得するプログラムを統合して実現しています。Pico2WのプログラムはPico SDK(C/C++)でClaudeさんに作ってもらいました。
EIのモデルに入力する画像データの型を合わせるのに苦労したようで、何度もチャットを繰り返し、昨日やっと識別出来るようになりました。
学習させた画像をスマホに表示してカメラに向けるとBear (1)またはNot Bear (0)と表示します。しばらくの間様々な画像を見せて楽しんだ後に次のステップに進みたいと思います。
次のステップではProcessingを使わずに単独で機能し、Bear (1)と判定した時に画像(160x120)をSDカードに保存して追加学習に使えるようにしたいと思います。またWiFiを使って撮影時刻を記録出来るようにしたいと考えています。
ただ、熊を頻繁に撮影出来る場所に設置したり様子を見に行ったりするのは怖いので、何か手軽に試せる課題も探してみます。
ご意見、ご提案などありましたら教えて下さい。
EIにアップロードして学習させた対象物を変えれば容易に「○○かも!」が出来るはずなので夢が広がります。
Claudeさんにmain.cppの役割を聞いたところ以下の回答でした。
// ============================================
// main.cppの処理フロー
// ============================================
// ステップ1: カメラから4bitデータ取得
arducam_capture_frame(&config);
// → image_buf[324*244] に 4bitデータ格納
// ステップ2: 96x96リサイズ + 4bit→8bit変換
prepare_model_input(image_buf, model_input_uint8);
// → model_input_uint8[96*96] に 8bitデータ格納
// → 値は 0, 17, 34, ..., 255 (17刻み)
// ステップ3: Edge Impulseの推論実行
run_classifier(&signal, &result, false);
// ↓
// run_classifierの内部で get_signal_data() が呼ばれる
// ↓
// get_signal_data() がグレースケールをRGB形式に変換
// gray=68 → rgb=0x00444444 → float(4473924.0)
// ↓
// extract_image_features_quantized() が処理
// float(4473924.0) → uint32_t(0x00444444) → R=G=B=68
// → ITU-R 601-2 グレースケール計算 → 68
// → INT8量子化: 68-128 = -60
// ↓
// MobileNetで特徴抽出
// ↓
// 最終分類
// ステップ4: 結果取得
// result.classification[0].value, result.classification[1].value
進展がありましたら続報します。
今後とも宜しくお願いいたします。