mos4423 が 2025年01月31日23時40分08秒 に編集
コメント無し
タグの変更
カメラ
本文の変更
## はじめに Spresenseカメラボードと画像認識を用いて、ハンドサインで反応するロボットを制作しました。 以前からハンドジェスチャーでのロボット制御に興味があり、SpresenseはエッジAIとカメラボードを搭載しているため今回挑戦してみました。 ## 作成の流れ まずカメラボードやSDカード、NNCや推論モデル周辺の確認に取り掛かりました。 ここで苦労した事は、カメラデータのリアルタイム推論に関して詳しく解説した資料があまり無く、またその中でも推論結果の表示に外部ディスプレイを必要とする場合が多く、シリアルモニタへの出力といった例をあまり発見出来なかった点です。 のでこちら(※1)を参考に、カメラデータのリアルタイム推論結果をシリアルモニタに出力するプログラムを作成しました。 苦労した点としては、カメラが何を写しているのかが全くわからず、手探りでモデルの推論結果が正しくなる写り方を見つける必要があった点かなと思います。 次にkaggle(※2)からハンドジェスチャの学習に必要なデータを集め、グーやチョキ、パー等を用いて学習しました。 がしかし過学習か或いはデータ量が少なかったのか、あまり良い曲線を描いてくれず。いざ推論してみてもそれらしい反応が得られず、悩むことになります。 色々条件を変えていくうちに、距離と色合いをデータセットのそれと合わせると正確な推論をする為、2値化や撮影環境、NNBモデルに問題がありそうと推測。 今回はSpresense側で固定閾値2値化を実装し、更に環境(手の影を作らない、手を逆光で黒色に認識)に依存させる方向で動くことにしました。 上記の通り閾値が必要なのですが、流石に手探りでは時間がかかる為、点字を用いてカメラデータをシリアルモニタに映し、テストを繰り返して特定しました。
@[youtube](https://www.youtube.com/watch?v=qy665_uIPKo)
こんな感じですね。
@[youtube](https://www.youtube.com/watch?v=qy665_uIPKo)
また、先の環境セットアップには白背景を映したディスプレイモニタを使用しました。 これにより何とか手の推論が成功、最後にこれらを秋月で見繕ったRCカーと合わせて、モータの出力に分岐させて、完成です。 ## 環境情報・使用部品 ##### 環境情報 |環境|バージョン | |:---:|:---:| |使用PC|MSI Prestige 13 Evo| |OS環境|Windows11| | Arduino IDE | 2.3.4 | |Spresenseボード|v3.2.0| ##### 使用部品 | 製品名 | 型番 | |:---:|:---:| | Spresenseメインボード | CXD5602PWBMAIN1 | | Spresense拡張ボード | CXD5602PWBEXT1 | |Spresenseカメラボード|CXD5602PWBCAM1| |ラジコンカー|FT-DC-002| |モータドライバ|AE-TB6612-BO| |microSDHC|KLMEA032G| |電池ボックス|BH-321-1B| |バッテリスナップ|BS-ER-150| |ブレッドボード|BB-801| |オスオスジャンパ|BBJ-20| |USBケーブル Aオス-マイクロBオス|2A L0.3m| ## 設計図 ##### ラジコンカー キットを使い組み立てました  ##### モータとモータドライバ、拡張ボードを接続する回路図  ##### 完成図   ## 動作 @[youtube](https://www.youtube.com/watch?v=ohtsb-yElXs) パーだと時計回りに、チョキだと反時計回りに、グーで止まります。 ## ソースコード ソースコードは全てGitHubに記載しました。 nnbfilesの中身である.nnbファイルは画像認識用のモデルです。SDカードに入れて、Spresense拡張ボードに挿して使用します。 .nnbファイルはMNIST用とハンドジェスチャ用があります。 mnist_imageにはMNISTのリアルタイム推論でテストできる画像を用意しました。 https://github.com/PetaCiel/spr2024_mos4423 |概要|名前 | |:---:|:---:| |カメラリアルタイム推論(MNIST)|[Cam_and_Dnnrt_MNIST_Guess](https://github.com/PetaCiel/spr2024_mos4423/blob/main/spr2024_mos4423/arduino_projects/Cam_and_Dnnrt_MNIST_Guess/Cam_and_Dnnrt_MNIST_Guess.ino)| |カメラ閾値2値化点字シリアルモニタ|[Camera_Capture_SerialPlot_forBraille](https://github.com/PetaCiel/spr2024_mos4423/blob/main/spr2024_mos4423/arduino_projects/Camera_Capture_SerialPlot_forBraille/Camera_Capture_SerialPlot_forBraille.ino)| |カメラ閾値2値化用2値推論(ハンドジェスチャ)|[Cam_and_Dnnrt_Hand_Gestures_Guess](https://github.com/PetaCiel/spr2024_mos4423/blob/main/spr2024_mos4423/arduino_projects/Cam_and_Dnnrt_Hand_Gestures_Guess/Cam_and_Dnnrt_Hand_Gestures_Guess.ino)| |カメラ閾値2値化用2値推論(ハンドジェスチャ)->モータ出力|[RCCar_hand_Gestures_Controll](https://github.com/PetaCiel/spr2024_mos4423/tree/main/spr2024_mos4423/arduino_projects/RCCar_hand_Gestures_Controll)| ## 反省点・今後の展望 反省点としては、ハンドジェスチャの情報を思うように入手出来なかった点です。 物理面では、カメラがテーブルに近すぎるため手を無理やりカメラの画角にねじ込む必要があり、 ソフトウェア面では、2値化して環境も整えないと推論が上手く行えない点です。 そのため、物理面での改善点としては、カメラそのものの向きと固定の仕方等の設計や調節が、 ソフトウェア面での改善点としては、より高度な画像認識を実装する必要があるように感じました。 ## 参考文献 > (※1) [SPRESENSE で小型AIカメラを作ってみた!](https://makers-with-myson.blog.ss-blog.jp/2020-02-18) > (※2) [Hand Gesture Recognition Dataset](https://www.kaggle.com/datasets/aryarishabh/hand-gesture-recognition-dataset/data)