物体検出

English page

Arduino UNO Qにビデオカメラを接続して映像をキャプチャし、その中に含まれる物体を検出することができます。

配線

SBC mode

上記の画像の「Single Board Computer Mode」のように、PD対応のUSBハブを用意し、そこにUSBのACアダプタとArduino UNO Qを接続します。
また、Webカメラ(もしくはUSB接続のビデオキャプチャとビデオカメラ)をUSBハブに接続します。

Brickの追加

物体検出の機能を使う場合は、ファームウェアのプログラムに、物体検出のBrickを追加することが必要です。
Arduino App Labでファームウェアのプログラムを開いて、画面左上の「Bricks」のところにある「Add Brick」のボタンをクリックします。

Add brick

「Add App Brick」のダイアログボックスが開きます。
Brickのリストの中で「Video Object Detection」を選択し、「Add Brick」のボタンをクリックします。

Video Object Detection Brick

次に、「Configure」のダイアログボックスが開き、Brickの種類を選ぶ状態になります。
「General purpose object detection - YoloX」を選び、「Save」のボタンをクリックします。

Select brick type

「Save」のボタンをクリックすると、「Success」のダイアログボックスが表示されます。
右上の×のボタンをクリックして、ダイアログボックスを閉じます。

なお、Video Object DetectionのBrickを追加した後で、USBハブにカメラを接続していない状態でファームウェアのプログラムを起動しようとすると、「missing required device: no camera found」のエラーが発生します。
カメラを使わないプログラムを作りたい場合は、ファームウェアのプログラムから、Video Object DetectionのBrickを削除することが必要です。
ファームウェアのプログラムを開いて、画面左上のBrick一覧の個所で「Video Object Detection」のBrickを右クリックし、メニューの「Remove」を選ぶと、Brickを削除することができます。

Remove video object detection brick

複数の種類の物体を検出する場合の基本的なプログラムのパターン

物体検出では、同時に複数の種類の物体を検出することができます。
それらすべてを対象にして処理を行う場合の、基本的なプログラムのパターンは、以下のようになります。

複数種類の物体を検出する場合のプログラムの基本的なパターン

Arduino UNO Qに接続した後、カメラを初期化して変数に代入します。
次に、検出器を初期化します。その際に、先に初期化しておいたカメラの変数を、パラメータとして指定します。
「信頼度」のパラメータでは、0~1の値を指定します。検出された物体の信頼度が、このパラメータの値を超える場合のみ、検出と判断されます。
「画像表示」のチェックボックスをオンにすると、ポップアップウィンドウが開いて、カメラの映像が表示されます。
初期化された検出器は、変数に代入しておきます。

この後、「物体を検出したとき」のブロックを使って、物体を検出したときに実行したい処理を作ります。
このブロックには辞書型のデータが渡され、それを「引数」のパラメータで指定した変数で受け取ります。

物体を検出したとき

「物体を検出したとき」のブロックの中には、「検出結果○○の各物体について」のブロックを入れて、見つかった個々の物体を順に処理するブロックを入れます。
このブロックの「名前」のパラメータで、物体の名前(例:dog)を代入する変数を指定します。
「データ」のパラメータで、物体の情報を代入する変数を指定します。

検出結果について繰り返す

そして、この情報の変数に対して繰り返しを行うことで、見つかった個々の物体の情報を得ることができます。

個々の検出結果を順に繰り返す

この繰り返しの中では、見つかった物体の信頼度と座標を扱うことができます。

検出された物体の信頼度

検出された物体の座標

特定の種類の物体を検出する場合の基本的なプログラムのパターン

特定の種類の物体(例:dog)が検出された場合のみ、処理を行うこともできます。
その場合のプログラムのパターンは、以下のようになります。

特定の種類の物体を検出した場合の基本的なプログラムのパターン

検出器を初期化するまでの流れは、複数の種類の物体を検出する場合と同じです。
その次に、「○○を検出した時」のブロックを使って、物体を検出した時の処理を作ります。
「引数」のパラメータで、検出した物体の情報を代入する変数を指定します。

特定の物体が検出されたとき

そして、この情報の変数に対して繰り返しを行うことで、見つかった個々の物体の情報を得ることができます。

個々の検出結果を順に繰り返す

この繰り返しの中では、見つかった物体の信頼度と座標を扱うことができます。

検出された物体の信頼度

検出された物体の座標

事例

以下のプログラムは、物体を検出して、その名前と信頼度を表示する例です。

物体検出のプログラムの例

このプログラムはこちらからダウンロードすることができます。