Jetson Xavierを使ってみる その6(YOLO、CUDAのバージョン切り替え、GPUでの処理)
はじめに
今回はJetson XavierでYOLOを用いた物体検出を試してみました。
Jetson XavierはGPUの性能が高いので、GPUを利用して実行できるように環境を構築しました。OSが古かったり、アーキテクチャが普段使っているPCとは異なるので、ややこしい部分もありました。
▼以前の記事はこちら
環境を構築する
CUDAのバージョン切り替え
この後PythonでYOLOを実行するので、先にPythonの仮想環境を作成し、有効化しておきました。
python -m venv pyenv
cd pyenv/
source bin/activate▼Pythonの仮想環境の作成については、以下の記事をご覧ください。
PythonとCUDAのバージョンを確認しました。
▼Python 3.8、CUDA 11.4がインストールされていました。

PyTorchの過去のバージョンにはCUDA 11.4が見当たらず、11.8ならあったので、CUDA 11.8をインストールして、PyTorchをインストールします。
▼PyTorchの過去のバージョンに関するページはこちら
https://pytorch.org/get-started/previous-versions
▼CUDAのバージョン切り替えについては、過去にWSL2の環境で試していたことがあります。
▼CUDA 11.8のダウンロードページはこちら

アーキテクチャはJetson Xavierなので、aarch64-jetsonになります。表示されたコマンドを実行し、CUDA 11.8をインストールしました。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/arm64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-11-8環境変数を設定し、バージョンが切り替わるか確認しました。
export PATH=/usr/local/cuda-11.8/bin:$PATH▼CUDA 11.8になりました。

環境変数の設定コマンドは、.bashrcにも追記しておきました。
パッケージのインストール
ここまではWSL2で試していたときと同じような感じだったのですが、Pythonのパッケージのインストールなどで手こずりました。
まずPyTorchのページに書かれていたインストールコマンドはtorchのバージョンが合わなくてほとんどインストールできず、途中まで進んでもPython 3.9以上が必要と表示されました。
▼以下のようなエラーが続いていました。

結局Geminiに聞いて、以下のコマンドでPyTorchを一旦インストールできたのですが、PythonのコードでCUDAが有効にはなりませんでした。後でもう一度インストールしました。
pip install "typing-extensions<4.13.0"
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118次にYOLOを利用するためのUltralyticsのパッケージをインストールしようとしたのですが、これも新しいものはインストールできませんでした。
▼以下のようなエラーが起きていました。

古いバージョンのUltralyticsならインストールすることができました。
pip install "ultralytics<8.1.0"他のパッケージも古いバージョンでインストールし直しました。
pip install "typing-extensions<4.13.0"
pip install "numpy<2.0.0"
pip install https://developer.download.nvidia.com/compute/redist/jp/v51/pytorch/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whltorchvisionはアーキテクチャの問題もあってビルドする必要があるようだったのですが、一気にビルドしようとするとJetson Xavierが完全にフリーズしてしまいました。ビルドに必要なパッケージを以下のコマンドでインストールし、スワップメモリを設定してから、少しずつビルドするようにするとインストールできました。
sudo apt-get update
sudo apt-get install -y libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-devスワップメモリは以下のコマンドで設定しました。
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h▼スワップメモリが追加されました。

以下のコマンドでtorchvisionのビルドを行いました。
pip install --upgrade setuptools pip wheel
git clone --branch v0.16.1 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.16.1
export FORCE_CUDA=1
export MAX_JOBS=1
python3 setup.py install以下のコマンドで、PythonでCUDAが利用できるようになっているか確認してみました。
cd ..
python3 -c "import torch; import torchvision; print('CUDA Available:', torch.cuda.is_available()); print('Torchvision Version:', torchvision.__version__)"▼利用可能になっていました。

物体検出を試してみる
環境構築後に、実際にGPUを利用して物体検出できるか試してみました。
▼以前も試していた、Unreal Engineでスクリーンショットした画像を対象に検出を試しました。

画像をダウンロードして、Pythonのコードを作成しました。
curl -O https://404background.com/wp-content/uploads/2024/10/unreal-768x413.jpg
sudo nano yolo_test.py以下のコードを保存しました。yolov8n.ptでの検出です。
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.predict(source="unreal-768x413.jpg", save=True, device='cuda:0')コードを実行してみました。
python3 yolo_test.py▼問題なく実行できているようでした。

▼GPUを利用して実行されていない場合、cpuで代わりに実行したというエラーが表示されていました。

▼何回か実行したのですが、処理時間は大体250ミリ秒ぐらいのようでした。

リモートデスクトップ接続でJetson Xavierにアクセスして、検出結果を確認しました。
▼リモートデスクトップ接続については、以下の記事で設定しました。
▼以下のように検出結果の画像が表示されました。

以前の検出結果とは異なり、バウンディングボックスの色も1色だけでした。この辺りは古いUltralyticsのパッケージを利用していることが影響しているのかもしれません。
yolov8s.ptでも試してみました。
▼処理時間はyolov8n.ptと同じような感じでした。

▼特に違いは無さそうでした。

なおyolo11s.ptも試してみたのですが、Ultralyticsのバージョンが古いせいなのか、モデルがダウンロードされませんでした。私は過去論文でよく使われているということもあってYOLOv8をよく使うので、モデルのバージョンについては十分かなと思っています。
最後に
Jetson XavierのOS自体が古い影響で、環境構築には度々苦戦しています。アーキテクチャの問題があるので、AIに聞くときはJetson Xavierであることを伝えるようにしています。
GPUで実行できることは確認できたので、カメラ映像に対するリアルタイム検出などを試したいなと思っています。
▼ROSを利用してカメラ映像を送信できることは確認済みです。研究でも画像処理用とロボット制御用のPCに分けて処理を行っています。

