執筆者: Alex Orsholits
エッジAIコンピューティングの領域において、推論性能は電力消費、発熱、そしてデバイスの全体的なフットプリントによって制約されます。これらの課題に対処するには、効率を最適化しつつ高性能計算を維持するという繊細なバランスを見つける必要があり、専用ハードウェアがここで輝きます。共処理ソリューションの出現により、限られた計算リソースを効果的に活用する自動運転タスク用の高度に統合されたプラットフォームが徐々に現実のものとなっています。
これらの考慮事項に応えて、塚田研究室は、AIビジョンのオフロード用にARMベースのRK3588シングルボードコンピュータ(SBC)と併用してHailo-8 AIコプロセッサの展開を探究し始めました。全体のプラットフォームは、ハードウェアアクセラレーテッドビデオ処理を活用して、15W未満の全システム負荷で複数のビジョンモデルの同時リアルタイム推論を可能にします。
このガイドでは、このプラットフォームの全体的なパフォーマンスを最大限に引き出すための情報を提供することを目指します。
1. 環境のインストール
RK3588プラットフォームの初期OSインストールプロセスを簡素化するために、公式のメーカーイメージを使用するのではなく、Ubuntu 22.04の以下のコミュニティ管理イメージの利用が推奨されます。これには、デフォルトのイメージに通常含まれていない、すべてのビデオおよびグラフィックスハードウェアアクセラレーションパッケージが事前にインストールされています。
Unified Ubuntu 22.04 for RK3588 SBCs
SDカードへのフラッシングおよびオンボードeMMCへのインストールについては、Githubページをご確認ください。
Hailo環境の準備
Hailoソフトウェアのインストールを行う前に、システムには最低限Dynamic Kernel Module Supportパッケージのインストールが必要です。このパッケージがないと、Hailo-8 PCIeドライバーがUbuntuシステム全体をブリックし、完全な再インストールが必要になります。
sudo apt install dkms
安全を期すために、以下のように全パッケージのインストールを実行することが可能です:
sudo apt update && sudo apt install adduser apport apt-transport-https apt-utils apt atop base-files base-passwd bash-completion bash bc bcache-tools binfmt-support bison bluez bsdutils btrfs-progs build-essential byobu ca-certificates chromium-browser cloud-guest-utils cloud-initramfs-copymods cloud-initramfs-dyn-netconf cmake console-setup-linux console-setup coreutils cpio cron curl dash dbus-x11 dbus debconf-i18n debconf debianutils debootstrap device-tree-compiler diffutils dirmngr distro-info-data distro-info dkms dmidecode dmsetup dosfstools dpkg dvb-tools e2fsprogs eject ethtool exfat-fuse fake-hwclock fakeroot fdisk ffmpeg findutils flex fonts-ubuntu-console fwupd g++-9 gcc-12-base gcc-9 gcc gdisk gir1.2-glib-2.0 gir1.2-gtk-3.0 git-lfs git gnupg gpgv grep gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-libav gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-qt5 gstreamer1.0-rockchip1 gstreamer1.0-tools gstreamer1.0-x gzip hostname htop hwinfo i2c-tools ifupdown init-system-helpers init initramfs-tools iotop iproute2 iputils-ping ir-keytable isc-dhcp-client isc-dhcp-common iso-codes kbd keyboard-configuration kmod less libacl1 libapparmor1 libapt-pkg6.0 libargon2-1 libatm1 libattr1 libaudit-common libaudit1 libblkid1 libbpf0 libbsd0 libbz2-1.0 libc-bin libc6-dev libc6 libcairo2-dev libcanberra-pulse libcap-ng0 libcap2-bin libcap2 libcom-err2 libcrypt1 libcryptsetup12 libdb5.3 libdbus-1-3 libdebconfclient0 libdevmapper1.02.1 libdns-export1110 libdvbv5-0 libdvbv5-dev libdvbv5-doc libegl-mesa0 libegl1-mesa-dev libelf-dev libelf1 libestr0 libexpat1 libext2fs2 libfastjson4 libffi8 libfribidi0 libgbm-dev libgcc-s1 libgcrypt20 libgirepository-1.0-1 libgirepository1.0-dev libgl1-mesa-dev libgles2-mesa-dev libglib2.0-0 libglib2.0-data libglx-mesa0 libgmp10 libgnutls30 libgpg-error0 libgssapi-krb5-2 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libhogweed6 libicu70 libidn2-0 libip4tc2 libisc-export1105 libjson-c5 libk5crypto3 libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 liblocale-gettext-perl liblz4-1 liblzma5 libmd0 libmnl0 libmount1 libmpdec3 libncurses6 libncursesw6 libnetplan0 libnettle8 libnewt0.52 libnsl2 libnss-systemd libp11-kit0 libpam-cap libpam-modules-bin libpam-modules libpam-runtime libpam-systemd libpam0g libpcre2-8-0 libpcre3 libpopt0 libprocps8 libpython3-stdlib libpython3.10-minimal libpython3.10-stdlib libreadline8 librga-dev librga2 librist-dev librist4 librockchip-mpp-dev librockchip-mpp1 librockchip-vpu0 libseccomp2 libselinux1 libsemanage-common libsemanage2 libsepol2 libslang2 libsmartcols1 libsqlite3-0 libss2 libssl-dev libssl3 libstdc++6 libsystemd0 libtasn1-6 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libtinfo6 libtirpc-common libtirpc3 libudev1 libunistring2 libuuid1 libv4l-0 libv4l-dev libv4l-rkmpp libv4l2rds0 libv4lconvert0 libwidevinecdm libxml2 libxtables12 libxxhash0 libyaml-0-2 libzmq3-dev libzstd1 linux-rockchip-5.10 lm-sensors locales login logrotate logsave lsb-base lsb-release lshw lsof lvm2 lxd-agent-loader make mali-g610-firmware malirun man-db manpages mawk mdadm media-types mesa-common-dev mesa-utils mesa-vulkan-drivers mmc-utils motd-news-config mount mpv mtd-utils mtools multipath-tools nano ncurses-base ncurses-bin net-tools netbase netcat-openbsd netplan.io networkd-dispatcher ntfs-3g open-iscsi open-vm-tools openssh-client openssh-server openssl p7zip-full parted passwd patch pavucontrol pciutils perl-base pigz pollinate procps pulseaudio python-apt-common python-gi-dev python-is-python3 python2 python3-apt python3-dbus python3-dev python3-gi-cairo python3-gi python3-minimal python3-netifaces python3-pip python3-pkg-resources python3-setuptools python3-virtualenv python3-yaml python3.10-minimal python3.10 python3 qemu-efi qemu-system-arm qemu-user-static qt6-qpa-plugins qt6-wayland qtwayland5 qv4l2 readline-common rfkill rist-tools rockchip-firmware rockchip-mpp-demos rockchip-multimedia-config rsync rsyslog screen sed sensible-utils shared-mime-info snapd software-properties-common sosreport sudo systemd-sysv systemd-timesyncd systemd sysvinit-utils tar tmux tzdata u-boot-rock-5b u-boot-tools ubuntu-advantage-tools ubuntu-desktop ubuntu-drivers-common ubuntu-keyring ubuntu-minimal ucf udev unattended-upgrades update-notifier-common usb-modeswitch-data usb-modeswitch usbutils usrmerge util-linux uuid-runtime v4l-utils vim-common vim-tiny vim virtualenv wget whiptail wireless-regdb wireless-tools wpasupplicant x11-utils xcb xdg-user-dirs xfsprogs xkb-data xterm xxd xz-utils zip zlib1g
これにより、Hailoソフトウェアのコンパイルに必要なすべての依存関係がインストールされます。
2. HailoRT PCIeドライバーおよび制御ソフトウェアTappasのインストール
Hailoは必要なソフトウェアと依存関係を全て含むDockerコンテナを提供していますが、これではビデオデータ処理のためのハードウェアアクセラレーションの利点を活用することができません。したがって、全てをソースからビルドする必要があります。ワークフローは以下の通りです:
- HailoRT PCIeドライバーパッケージをインストールします(ソースからパッケージをコンパイルすると、未知の理由でいくつかの必要なファイルがインストールされません)
- HailoRT制御ソフトウェアをソースからコンパイルしてインストール
- 対応するHailoRT PCIeドライバーをソースからコンパイルしてインストール
- 対応するTappasソフトウェアをソースからコンパイルしてインストール
- GStreamerのためのRockchip特有の2Dエンジンアクセラレーションをソースからコンパイルしてインストール
Hailoソフトウェアリリースはバージョン固有であり、特定のバージョンのPCIeドライバーが特定のバージョンの制御ソフトウェアとのみ動作し、これはTappasにも適用されることに注意してください。
HailoRT PCIeドライバーパッケージのインストール(2023年12月 v4.16.0)
まず、自己コンパイルドライバーが機能するために必要なファイルが含まれるように、PCIeドライバーをインストールする必要があります。最新のドライバーをダウンロードするには、Hailo Developer Zoneにアクセスする必要があります:https://hailo.ai/developer-zone/software-downloads/
インストールするには、単に次のコマンドを実行します:
sudo dpkg -i hailort-pcie-driver_4.16.0_all.deb
DKMSを使用してドライバーをインストールするかどうかを尋ねられます。Y(es)と答えてください。
Do you wish to use DKMS? [Y/n]:
インストール後、再起動します:
sudo reboot now
ソースからHailoRT制御ソフトウェアをコンパイルしてインストール
まず、現在プリコンパイルリリースよりも一つバージョンが上のHailoRT制御ソフトウェアから始めます。
HailoRT control software (GitHub)
gitを使用してソースコードをダウンロードしてください。
git clone https://github.com/hailo-ai/hailort.git && cd hailort
このガイドをいつ(またはもし)フォローするかによって、ブランチは最新のソースリリースに更新される可能性が高いです。互換性を確保するために、特定のバージョンブランチをコンパイル用に選択する必要があります。これを実現するために、次のコマンドを使用して特定のブランチをチェックアウトできます(プロジェクトフォルダ内で):
(このガイドではv4.16.1を使用します)
git checkout master-vx.xx.x
すべてが設定されたら、次のコマンドで制御ソフトウェアをコンパイルできます:
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release && sudo cmake --build build --config release --target install
すべての依存関係が適切にインストールされていれば、このコマンドはソフトウェアの設定、ビルド、最終的にはインストールを行います。次のコマンドを実
hailortcli -v
ソースから対応するHailoRT PCIeドライバーをコンパイルしてインストール
ソースから制御ソフトウェアをインストールしたので、次にPCIeドライバーを制御ソフトウェアと同じバージョンにアップグレードする必要があります。
HailoRT PCIe driver (GitHub)
gitを使用してソースコードをダウンロードしてください。
git clone https://github.com/hailo-ai/hailort-drivers.git && cd hailort-drivers
HailoRT制御ソフトウェアと同様に、バージョン固有のブランチがあります。したがって、対応するバージョン番号を持つために同じブランチをチェックアウトする必要があります:
(このガイドではv4.16.1を使用します)
git checkout master-vx.xx.x
ドライバーをコンパイルするには、pcieフォルダ内でmake
を実行する必要があります。以下のように実行してください:
cd linux/pcie
make all
sudo make install_dkms
sudo modprobe hailo_pci
次に、GitHubプロジェクトのルートフォルダに戻る必要があります (cd ../..
)
そして、ドライバーバージョンに対応するコプロセッサのバイナリファームウェアblobをダウンロードします。以下のスクリプトを実行してください:
./download_firmware.sh
そして、ダウンロードしたblobとudevルールを移動します:
sudo mv hailo8_fw.hailo8_fw.4.16.1.bin /lib/firmware/hailo/hailo8_fw.bin
sudo cp ./linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/
最後に再起動します。
再起動後、hailoRT制御ソフトウェアと対応するPCIeドライバーがインストールされているはずです。これで、コプロセッサと通信できるようになるはずです。以下のコマンドを実行して、この事実を確認してください:
hailortcli fw-control identify
これにより、インストールされたコプロセッサのシリアル番号などが返されるはずです。
ソースから対応するTappasソフトウェアをコンパイルしてインストール
Tappasは、AI推論のための様々なGStreamerベースのパイプラインを提供するとともに、PythonやC++に接続する、または処理されたビデオフレームを生成する自分たちのパイプラインを実装するためのガイドを提供します。
Tappas (GitHub)
gitを使用してソースコードをダウンロードしてください。
git clone https://github.com/hailo-ai/tappas.git && cd tappas
HailoRTパッケージやドライバーとは異なり、Tappasは異なるバージョン番号スキーマを使用します。互換性のあるHailoRTバージョンは、GitHubのreadmeにのみ簡潔に記載されています。再び、互換性を目的として特定のブランチを選択することが重要です!
(このガイドではv3.27.1を使用します)
git checkout vx.xx.x
開始する前に、TappasをARM64プラットフォームでコンパイルできるようにするために、HailoRT GitHubプロジェクトからいくつかの追加ファイルが必要です。Tappasリポジトリをクローンして特定のブランチを設定した後、以下のようにHailoRTファイルをクローンする必要があります:
mkdir hailort && git clone https://github.com/hailo-ai/hailort.git hailort/sources
Tappasをコンパイルする前に、OpenCV 4.5.2、GStreamer、PyGobjectなど、いくつかの依存関係をインストールする必要があります。
OpenCV 4.5.2
まず、Tappasが必要とする特定のOpenCVバージョンをダウンロードして解凍し、設定する必要があります:
wget https://github.com/opencv/opencv/archive/4.5.2.zip
unzip 4.5.2.zip && cd opencv-4.5.2
mkdir build && cd build
cmake -DOPENCV_GENERATE_PKGCONFIG=ON -DBUILD_LIST=core,imgproc,imgcodecs,calib3d,features2d,flann -DCMAKE_BUILD_TYPE=RELEASE -DWITH_PROTOBUF=OFF -DWITH_QUIRC=OFF -DWITH_WEBP=OFF -DWITH_OPENJPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_GTK=OFF -DOPENCV_DNN_OPENCL=OFF -DBUILD_opencv_python2=OFF -DINSTALL_C_EXAMPLES=ON -DINSTALL_PYTHON_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=/usr/local ..
コンパイルしてインストール:
make -j8
sudo make install
sudo ldconfig
GStreamer
もしまだ環境準備ステップから全てのパッケージをインストールしていない場合は、ここで行ってください:
sudo apt install -y libcairo2-dev libgirepository1.0-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio gcc-9 g++-9 python-gi-dev
PyGobject
もしまだ環境準備ステップから全てのパッケージをインストールしていない場合は、ここで行ってください:
sudo apt install -y python3-gi python3-gi-cairo gir1.2-gtk-3.0
Tappas
Tappasのgitのルートディレクトリに戻り、インストールスクリプトを実行してください。これにより、コンパイレーションが(うまくいけば)自動的に処理されるはずです。現在、Rockchip RK3588プラットフォーム向けの特定のビルドターゲットがありますので、必要であれば、このフラグを使ってインストールスクリプトを実行できます。唯一の違いは、プラットフォームでテストされたrockchip専用のAI推論パイプラインの例のみをダウンロードすることです。これは、利用可能な例の総数とは大きく異なります。
./install.sh --skip-hailort --target-platform rockchip
これで、Tappasがインストールされたはずです!
GStreamer用のRockchip専用2Dエンジンアクセラレーションをコンパイルしてインストール
ほとんどのRockchip SoCには、ビデオおよびイメージフレームのハードウェアアクセラレーテッドなクロッピングとスケーリングを可能にする2Dエンジンが含まれています。RK3588プラットフォーム上でリアルタイムのマルチストリームAI推論を有効にするためには、パフォーマンスを最大化するためにこれらの機能を使用できるようにする必要があります。多くのビジョンAIモデルは、YoloV5m @ 640×640のような特定の入力解像度を必要とします。このことから:
At present, some platforms such as RK3588, RGA function is abnormal, so it is not recommended to use it.
実際に、GStreamerの一般機能として2Dエンジンを有効にしようとすると、特定のパイプラインがクラッシュし、コプロセッサがハードロックアップする可能性がほぼ99%あります。すべての状況で安定したパイプラインを作成できるようにするために、ハードウェアアクセラレーテッドなrgaconvert
と組み合わせて、ハードウェアアクセラレーションされていないvideoconvert
を使用できるようにする、独自のGStreamerプラグインをコンパイルします。
gstreamer-rgaconvertプラグインソース
gitを使用してソースコードをダウンロードしてください。
git clone https://github.com/higithubhi/gstreamer-rgaconvert.git && cd gstreamer-rgaconvert
meson
がインストールされていることを確認してください:
sudo apt install meson
ビルドフォルダを設定してコンパイル:
mkdir build && meson setup build
cd build && ninja
コンパイルされたプラグインファイルをGStreamerフォルダにコピー:
sudo cp plugins/libgstrgaconvert.so /usr/lib/$(uname -m)-linux-gnu/gstreamer-1.0/
sudo cp -r plugins/libgstrgaconvert.so.p /usr/lib/$(uname -m)-linux-gnu/gstreamer-1.0/libgstrgaconvert.so.p
最後に、以下のコマンドを実行してGStreamerによってプラグインが検出されることを確認してください:
gst-inspect-1.0 rgaconvert
次の出力が得られるはずです:
これで、AI推論のために必要なものがすべてインストールされました!
例のGStreamerパイプラインの実行
Tappasは、以下のパスの下に検出、ナンバープレート認識、マルチストリーム検出、タイリングのための例のパイプラインを提供しています:
<tappas folder>/apps/h8/gstreamer/rockchip/
ここでは、yoloベースの単一ネットワークパイプライン(yolov3, yolov4, yolov5, nanodet)であるdetectionの例を使用して、簡単な要約を提供します。
このdetectionフォルダ内には、ユーザーが設定可能な設定に基づいてGStreamer bash文字列を効果的に生成するdetection.shスクリプトが含まれています。どの設定を変更できるかは、./detection.sh ––helpを実行することで確認できます。
非常に便利なパラメータは--print-gst-launch
変数で、これによりパイプライン全体を実行せずに印刷できます。それを行ってから、ハードウェアアクセラレーションを含めるように変更しましょう!
gst-launch-1.0 filesrc location=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/detection.mp4 name=src_0 ! decodebin ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! videoscale qos=false n-threads=2 ! video/x-raw, pixel-aspect-ratio=1/1 ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailonet hef-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/yolov5m_wo_spp_60p.hef batch-size=1 nms-score-threshold=0.3 nms-iou-threshold=0.45 output-format-type=HAILO_FORMAT_TYPE_FLOAT32 ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailofilter function-name=yolov5 so-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/libs/post_processes//libyolo_hailortpp_post.so config-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/configs/yolov5.json qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailooverlay qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! fpsdisplaysink video-sink=xvimagesink text-overlay=false name=hailo_display sync=false
このパイプラインが何をしているか見てみましょう(キューは省略):
入力ビデオファイルはfilesrcを介してパイプラインに供給され、decodebinでデコードされます。yolov5モデルの要件を満たすために、ビデオソースはvideoscaleを介して640×640モデル解像度に合わせてリサイズおよびクロップされます。これは、NV12からF32へのカラースペース変換をvideoconvertプラグインを介して受けた後、Hailo推論パイプラインに送られます。このdetectionパイプラインの場合、Hailoシステムは3つのGStreamerプラグインで構成されています: hailonet, hailofilter, および hailooverlay。
Hailo GStreamerプラグインの全リストについては、こちらのTappas GitHubリポジトリのドキュメンテーションを参照してください。https://github.com/hailo-ai/tappas/blob/master/docs/TAPPAS_architecture.rst
hailonet
の使用は自明です。これはAIモデルを読み込むためのプラグインです。hailofilter
は、他のソフトウェアがAI推論データにアクセスするための接点を表しています。コンパイルされたC++ファイルまたはpythonスクリプトを読み込むことができ、オブジェクト検出情報を扱うためのインターフェースを提供することが目的です。最後に、hailooverlay
はhailofilter
と連携して、バウンディングボックスを介してビデオに検出をオーバーレイします。これは、再びNV12に戻る別のカラースペース変換の後、640×640のxvimagesink
で出力されます。
このパイプラインはすでにRK3588のハードウェアデコーディング機能を利用しており、3840×2160@25fpsまでの単一ビデオソースに完全に対応しています。それでも、より良いことができます。
///////////////////////////////////////////////////////////////////
// Note: the act of printing the fps causes a processing slow-down
///////////////////////////////////////////////////////////////////
//640x640 input NORGACONVERT
GstPipeline:pipeline0/GstFPSDisplaySink:hailo_display: last-message = rendered: 718, dropped: 0, current: 71.65, average: 70.90 //fps
//3840x2160 input NORGACONVERT
GstPipeline:pipeline0/GstFPSDisplaySink:hailo_display: last-message = rendered: 517, dropped: 0, current: 26.48, average: 24.84
/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// Now with 2D hardware acceleration /////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
//640x640 input WITHRGACONVERT
GstPipeline:pipeline0/GstFPSDisplaySink:hailo_display: last-message = rendered: 651, dropped: 0, current: 218.23, average: 216.01
//3840x2160 input WITHRGACONVERT
GstPipeline:pipeline0/GstFPSDisplaySink:hailo_display: last-message = rendered: 521, dropped: 0, current: 98.66, average: 103.00
ハードウェアアクセラレーテッドなfilesrcパイプライン
まず、すべての入力ファイルがハードウェアデコーダーでデコードされるように明示的に確認しましょう。これを実現するために、decodebin
をparsebin
とmppvideodec
の2つのプラグインに置き換える必要があります。これにより、パイプラインの開始部分が以下のように変わります:
gst-launch-1.0 filesrc location=<file> name=src_0 ! parsebin ! mppvideodec ! [...]
次に、videoscale
とvideoconvert
をrgaconvert
を利用するサブパイプラインに置き換えましょう。まず、ビデオを640×360に縮小し、黒いバーを追加して640×640のビデオを作成し、最後に適切な形式へのカラースペースを変換します。rgaconvert
が失敗またはクラッシュしないようにするために、パイプラインをより詳細に記述する必要があります。したがって、リスケーリングの目標を明示的に含める必要があります。例えば、ビデオを640×360に縮小する場合、rgaconvert
パイプラインは以下のようになります:
[...] ! rgaconvert qos=false ! video/x-raw,format=RGB,width=640,height=360 ! [...]
黒いバーを追加して640×640のフレームをrgaconvert
と互換性のあるものにするために、この特定の検出パイプラインでは、videobox
の使用が実現可能な解決策として提示されました。ビデオは明示的に定義された機能に基づいてクロップされ、2番目のrgaconvert
に渡されます。これは、後続のHailoサブパイプラインのために暗黙的にカラースペースをF32に変換します。
[...] ! videobox autocrop=true ! video/x-raw,format=RGB,width=640,height=640 ! rgaconvert ! hailonet [...]
rgaconvertの制限の一つは、シングルパイプライン内で数回しか使用できず、それを超えると不安定になりクラッシュしやすくなることのようです。そのため、パイプライン内の2番目のvideoconvertを3番目のrgaconvertに置き換えることは困難です。得られるパイプラインは以下の通りです:
gst-launch-1.0 -v filesrc location=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/detection.mp4 name=src_0 ! parsebin ! mppvideodec ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! rgaconvert qos=false ! video/x-raw,format=RGB,width=640,height=360 ! videobox autocrop=true ! video/x-raw,format=RGB,width=640,height=640 ! rgaconvert ! hailonet hef-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/yolov5m_wo_spp_60p.hef batch-size=1 nms-score-threshold=0.3 nms-iou-threshold=0.45 output-format-type=HAILO_FORMAT_TYPE_FLOAT32 ! hailofilter function-name=yolov5 so-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/libs/post_processes//libyolo_hailortpp_post.so config-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/rockchip/detection/resources/configs/yolov5.json qos=false ! hailooverlay qos=false ! queue leaky=no max-size-buffers=60 max-size-bytes=0 max-size-time=0 ! videoconvert n-threads=8 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! fpsdisplaysink video-sink=xvimagesink text-overlay=false name=hailo_display sync=false | grep -e hailo_display -e hailodevicestats
完全解像度出力を持つハードウェアアクセラレーテッドなfilesrcパイプライン
必要なモデル入力ビデオスケールでの推論パスを実行し、その推論を元の完全解像度のビデオに適用するために、hailo muxingプラグインを利用することもできます。ここでは、rgaconvertで加速された顔検出パイプラインの簡単な例を紹介します。
オリジナル:
gst-launch-1.0 -v filesrc location=~/Projects/tappas/apps/h8/gstreamer/resources/mp4/detection7.mp4 name=src_0 ! parsebin ! mppvideodec ! videoconvert n-threads=8 ! tee name=t hailomuxer name=mux t. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! mux. t. ! videoscale ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailonet hef-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/resources/hef/lightface_slim.hef ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailofilter function-name=lightface so-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/libs/post_processes/libface_detection_post.so config-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/general/face_detection/resources/configs/lightface.json qos=false ! mux. mux. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailooverlay ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! videoconvert ! fpsdisplaysink video-sink=xvimagesink name=hailo_display sync=false text-overlay=false
加速バージョン:
gst-launch-1.0 -v filesrc location=~/Projects/tappas/apps/h8/gstreamer/resources/mp4/detection7.mp4 name=src_0 ! parsebin ! mppvideodec format=NV12 ! tee name=t hailomuxer name=mux t. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! mux. t. ! rgaconvert ! video/x-raw,format=RGB,width=320,height=240 ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailonet hef-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/resources/hef/lightface_slim.hef ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailofilter function-name=lightface so-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/libs/post_processes/libface_detection_post.so config-path=/home/hailo/Projects/tappas/apps/h8/gstreamer/general/face_detection/resources/configs/lightface.json qos=false ! mux. mux. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! hailooverlay ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! rgaconvert ! video/x-raw,format=NV12,width=1920,height=1080 ! fpsdisplaysink video-sink=xvimagesink name=hailo_display sync=false text-overlay=false | grep hailo_display
ここで、ラスターグラフィックアクセラレータ(RGA)は、入力1080p h264ファイルの平均フレームレートを19.54fpsから162.24fpsに増加させます。
同様のハードウェアを展開しようとしている方々に、私たちのガイドが役立つことを願っています。近い将来に開発されるアプリケーションを見ることにわくわくしています!