本記事で紹介するプログラムは以下の GitHub リポジトリで公開しています
前回の記事 では、Jetson Orin Nano Super の初期設定方法を紹介しました。
今回の記事では、Jetson の GPU を本格的に活用してみようという試みです。
具体的には、監視カメラの映像を RTSP で取得し、YOLOv8 でリアルタイムに人体を検知、さらに顔にモザイクをかけた上で Youtube ライブ配信する、というシステム構築を目指しました。
結論から言うと、この挑戦は失敗に終わりました。
理由はシンプルで、Jetson Orin Nano (Super) にはハードウェアエンコーダーが搭載されておらず、ソフトウェアエンコーダーでは処理負荷に耐えられず、ライブ映像がカクカクになってしまったためです。
とはいえ、YOLO や PyTorch の導入だけでもかなり大変だったので、同じように Jetson Orin Nano (Super) で苦労している方のために、導入手順と失敗の記録を残しておきます。
YOLO の導入
まずは物体検知モデルである YOLOv8 を導入します。
インストール
通常どおり pip でインストールします。
pip3 install ultralytics
PyTorch のアンインストール
YOLO をインストールすると、CUDA 非対応版の PyTorch が自動でインストールされてしまうため、これを削除します。
pip3 uninstall torch torchvision
PyTorch の導入
ここが一番の難所です。Jetson 環境で CUDA を使うためには、NVIDIA が提供する JetPack 対応版の PyTorch を入れる必要があります。
1. numpy のバージョンを固定
依存関係の問題を避けるため、numpy を 1.26.1 にダウングレードします。
pip3 install numpy==1.26.1
2. 依存パッケージのインストール
Jetson 環境用の必要な依存関係をすべて導入します。
sudo apt install -y nvidia-jetpack
sudo apt-get install -y python3-pip libopenblas-dev
sudo apt install -y autoconf bc build-essential gettext-base iputils-ping \
libbz2-dev libc++-dev libcgal-dev libffi-dev libfreetype6-dev libhdf5-dev \
libjpeg-dev liblzma-dev libncurses5-dev libncursesw5-dev libpng-dev \
libreadline-dev libssl-dev libsqlite3-dev libxml2-dev libxslt-dev locales \
moreutils openssl rsync scons python3-pip libopenblas-dev
sudo apt-get -y install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev \
libavcodec-dev libavformat-dev libswscale-dev
3. cuSPARSELt のインストール(PyTorch 24.06 以降対応)
CUDA 12 対応のビルド済みパッケージを NVIDIA から取得します。
※CUDA のバージョンは環境に合わせて変更してください。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/arm64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cusparselt-cuda-12
4. PyTorch のインストール
NVIDIA 公式の JetPack 対応版を使用します。
wget https://developer.download.nvidia.com/compute/redist/jp/v61/pytorch/torch-2.5.0a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl
pip3 install --no-cache ./torch-2.5.0a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl
TorchVision の導入
PyTorch とバージョンを合わせた TorchVision をソースからビルドします。
- リポジトリをクローン
git clone --branch release/0.16 https://github.com/pytorch/vision torchvision
- ビルド・インストール ※TorchVision のバージョンは PyTorch と合わせる必要があります。
cd torchvision
export BUILD_VERSION=0.20.0
python3 -m pip install --upgrade setuptools wheel
python3 -m pip install --no-cache-dir .
FFmpeg の導入
YOLO や映像処理を行う場合に必要な FFmpeg をインストールします。
sudo apt-get update
sudo apt install -y ffmpeg
挑戦:YOLOv8 とライブ配信(そして頓挫 😢)
ここまでの設定で、Jetson Orin Nano (Super) 上で YOLOv8 を CUDA を使って動かす環境が整いました。
いよいよ当初の目的に挑戦します。
当初の構想
- 監視カメラ(USB カメラや RTSP ストリーム)から映像を取得。
- YOLOv8n (nano モデル) を使い、リアルタイムで人物を検知。
- 検知した人物の顔領域にモザイク処理を施す。
- 処理後の映像を Youtube Live へストリーミング配信する。
発生した問題:映像のカクつき
Python スクリプト (OpenCV, YOLO) と FFmpeg を組み合わせて、なんとか Youtube Live への配信自体は成功しました。
しかし、Jetson Orin Nano (Super) の CPU パワーだけでは、YOLO の推論処理と映像のエンコード処理を同時に行うには負荷が高すぎました。 結果として、配信される映像はカクカク(フレームレートが極端に低い状態) となり、実用には耐えませんでした。
この問題に対して、ソフトウェアエンコーダー(libx264)を使用したプログラムを実装しました。
実行方法:
python face-mosaic-yolo-jetson-x264.py "rtsp://camera_url" "youtube_stream_key"
オプション例:
# カスタム設定で実行
python face-mosaic-yolo-jetson-x264.py "rtsp://camera_url" "youtube_stream_key" \
--width 1280 --height 720 --fps 30 --model yolov8n.pt
ハードウェアエンコードの模索
このカクつき問題は、CPU が担当しているエンコード処理を Jetson のハードウェア(GPU や専用チップ)に任せる「ハードウェアエンコード (H264)」で解決できるはずです。
1. FFmpeg での試行
まず、導入した FFmpeg でハードウェアエンコードを試みましたが、Jetson (NVIDIA) のハードウェアエンコーダ(NVENC)を利用する設定(h264_nvencなど)は利用できませんでした。
このアプローチでは、FFmpeg と Jetson のハードウェアエンコーダー(h264_nvmpi)を使用したプログラムを実装しました。
実行方法:
python face-mosaic-yolo-jetson-ffmpeg.py "rtsp://camera_url" "youtube_stream_key"
オプション例:
# カスタム設定で実行
python face-mosaic-yolo-jetson-ffmpeg.py "rtsp://camera_url" "youtube_stream_key" \
--width 1920 --height 1080 --fps 30 --model yolov8s.pt
2. Gstreamer での試行
次に、Jetson 環境でハードウェアアクセラレーションを利用する標準的な方法である Gstreamer を使うことにしました。
Gstreamer であれば、NVIDIA 提供のプラグイン(nvv4l2h264encなど)が使えるはずだと考えました。
このアプローチでは、GStreamer と Jetson のハードウェアエンコーダー(nvv4l2h264enc)を使用したプログラムを実装しました。
実行方法:
python face-mosaic-yolo-jetson-gst.py "rtsp://camera_url" "youtube_stream_key"
オプション例:
# カスタムビットレートで実行
python face-mosaic-yolo-jetson-gst.py "rtsp://camera_url" "youtube_stream_key" \
--width 1280 --height 720 --fps 30 --bitrate 3000 --model yolov8n.pt
しかし、ターミナルで以下のコマンドを実行し、プラグインの存在を確認しようとしましたが...
gst-inspect-1.0 nvv4l2h264enc
返ってきたのは、無情なメッセージでした。
No such element or plugin 'nvv4l2h264enc'
結論:Orin Nano (Super) はエンコーダ非搭載
nvv4l2h264enc が見つからない理由を調査したところ、NVIDIA の公式フォーラムで衝撃の事実が判明しました。
Jetson Orin Nano Encoding - NVIDIA Forums
このスレッドによると、 「Jetson Orin Nano (Super) は、ハードウェアのビデオエンコーダ (NVENC) を搭載していない」 とのことです。(デコーダ (NVDEC) は搭載しています)
つまり、Jetson Orin NX や AGX Orin とは異なり、Orin Nano ではハードウェアエンコードを利用した高速な映像配信が不可能だったのです。
YOLO の推論と CPU エンコードの両立は困難であり、当初の「YOLO で顔モザイクをかけつつ Youtube Live 配信する」という構想は、ここで頓挫することとなりました。
Jetson Orin Nano を選定する際は、エンコーダの有無にご注意ください。