Raspberry Pi[54] Pi5とAIキットで動画認識

Raspberry Pi[48] AI Kit

AI kit を買ったので少しづつ構築します。まだ、出たばかりで情報があまりないので、まずは本家に記載された Install からやってみます。以下は日本語訳です。 Raspberr…

前回はAIキットのインストールまで行いました。ここでは、YOLOを使用しての動画認識を目指します。

ウェブを探すといくつか出てきますが、どれも中途半端なので結局は本家通りにやるのが近道でした。

Hailo RPi5 Basic Pipelines にアクセスします。

レポジトリのクローンを作成

git clone https://github.com/hailo-ai/hailo-rpi5-examples.git

レポジトリのフォルダに移動します。

cd hailo-rpi5-examples

インストールします。

./install.sh

環境を作ります。

source setup_env.sh

必要なパッケージをインストールします。

pip install -r requirements.txt

既にインストールされているかもしれませんが、一応、以下をやります。

sudo apt install -y rapidjson-dev

必要なリソースをダウンロードします。

./download_resources.sh

サンプル動画で認識させてみます。

./compile_postprocess.sh

これでデモが動きます。この例では、YOLOv8sモデルをHailo-8L(13 TOPS)用、YOLOv8mモデルをHailo-8(26 TOPS)用としてデフォルトで使用し、物体検出を行います。また、HailoRT NMS後処理でコンパイルされたすべてのモデルをサポートしています。Hailoの非最大抑制(NMS)レイヤーはHEFファイルに統合されており、NMSでコンパイルされた任意の検出ネットワークが同じコードベースで動作するようになっています。

次にカメラで動かしてみます。

また、環境からセットします。

source setup_env.sh

使用できるカメラを調べます。

python basic_pipelines/get_usb_camera.py
USB cameras found on: /dev/video0, /dev/video2

Windows Hello カメラだと二つ認識

USB cameras found on: /dev/video0

UVC H.264 カメラだとこんな感じです。どちらも/dev/video0 で大丈夫なはず。

実際に動かしてみると、

python basic_pipelines/detection.py --input /dev/video0

H.264 カメラは

(venv_hailo_rpi5_examples) pi@piw:~/hailo-rpi5-examples $ python basic_pipelines/detection.py --input /dev/video0
Auto-detected Hailo architecture: hailo8l
v4l2src device=/dev/video0 name=source ! video/x-raw, width=640, height=480 !  queue name=source_scale_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! videoscale name=source_videoscale n-threads=2 ! queue name=source_convert_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! videoconvert n-threads=3 name=source_convert qos=false ! video/x-raw, format=RGB, pixel-aspect-ratio=1/1 !  queue name=inference_scale_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! videoscale name=inference_videoscale n-threads=2 qos=false ! queue name=inference_convert_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! video/x-raw, pixel-aspect-ratio=1/1 ! videoconvert name=inference_videoconvert n-threads=2 ! queue name=inference_hailonet_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! hailonet name=inference_hailonet hef-path=/home/pi/hailo-rpi5-examples/basic_pipelines/../resources/yolov8s_h8l.hef batch-size=2 nms-score-threshold=0.3 nms-iou-threshold=0.45 output-format-type=HAILO_FORMAT_TYPE_FLOAT32 force-writable=true ! queue name=inference_hailofilter_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! hailofilter name=inference_hailofilter so-path=/home/pi/hailo-rpi5-examples/basic_pipelines/../resources/libyolo_hailortpp_postprocess.so   qos=false  ! queue name=identity_callback_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! identity name=identity_callback  ! queue name=hailo_display_hailooverlay_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! hailooverlay name=hailo_display_hailooverlay ! queue name=hailo_display_videoconvert_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! videoconvert name=hailo_display_videoconvert n-threads=2 qos=false ! queue name=hailo_display_q leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0  ! fpsdisplaysink name=hailo_display video-sink=xvimagesink sync=false text-overlay=false signal-fps-measurements=true 
Showing FPS
Error: gst-stream-error-quark: Internal data stream error. (1), ../libs/gst/base/gstbasesrc.c(3132): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:source:
streaming stopped, reason not-negotiated (-4)

とエラーで止まります。Windows Helloカメラだと正常に動きました。

色々調べてみると、「H.264エンコードをサポートするカメラは、uvch264src のような専用のGStreamerエレメントを使用します。」なので、v4l2src で動かないカメラは少し手を加える必要がありそうです。ちなみにヘルプを出してみると、

(venv_hailo_rpi5_examples) pi@piw:~/hailo-rpi5-examples $ python basic_pipelines/detection.py --help
usage: detection.py [-h] [--input INPUT] [--use-frame] [--show-fps] [--arch {hailo8,hailo8l}] [--hef-path HEF_PATH] [--disable-sync] [--dump-dot] [--labels-json LABELS_JSON]

Hailo App Help

options:
  -h, --help            show this help message and exit
  --input INPUT, -i INPUT
                        Input source. Can be a file, USB or RPi camera (CSI camera module). For RPi camera use '-i rpi' (Still in Beta). Defaults to example video resources/detection0.mp4
  --use-frame, -u       Use frame from the callback function
  --show-fps, -f        Print FPS on sink
  --arch {hailo8,hailo8l}
                        Specify the Hailo architecture (hailo8 or hailo8l). Default is None , app will run check.
  --hef-path HEF_PATH   Path to HEF file
  --disable-sync        Disables display sink sync, will run as fast as possible. Relevant when using file source.
  --dump-dot            Dump the pipeline graph to a dot file pipeline.dot
  --labels-json LABELS_JSON
                        Path to costume labels JSON file