Raspberry Pi[54] Pi5とAIキットで動画認識
前回は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