Jetson Xavierを使ってみる その6(YOLO、CUDAのバージョン切り替え、GPUでの処理)

はじめに

 今回はJetson XavierでYOLOを用いた物体検出を試してみました。

 Jetson XavierはGPUの性能が高いので、GPUを利用して実行できるように環境を構築しました。OSが古かったり、アーキテクチャが普段使っているPCとは異なるので、ややこしい部分もありました。

▼以前の記事はこちら

Jetson Xavierを使ってみる その1(JetPack 5.1.5のセットアップ)

はじめに  最近TechSeeker Hackathon 2025というハッカソンに参加しているのですが、参加者特典でJetson Xavierを1万円で購入できました。今回はそのセットアップをして…

Ollamaを使ってみる その5(画像とテキストのマルチモーダル処理、llama3.2-vision)

はじめに  今回はOllamaでllama3.2-visionを利用して、画像とテキストのマルチモーダル処理を試してみました。  最近GPT4oの画像に対する推論も試したことがあるのです…

環境を構築する

CUDAのバージョン切り替え

 この後PythonでYOLOを実行するので、先にPythonの仮想環境を作成し、有効化しておきました。

python -m venv pyenv
cd pyenv/
source bin/activate

▼Pythonの仮想環境の作成については、以下の記事をご覧ください。

Pythonの仮想環境を作成する(venv、Windows)

はじめに  今回はPythonの仮想環境の作成についてまとめてみました。  Pythonを利用したNode-REDのノードを開発するときに仮想環境を詳しく調べていました。作成した仮…

 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のバージョンを切り替える(WSL2 Ubuntu 22.04)

はじめに  今回はWSL2 Ubuntu 22.04の環境で、CUDAのバージョンの切り替えについて試してみました。  以前3D Gaussian Splatting (3DGS) の環境を構築するために、元々…

▼CUDA 11.8のダウンロードページはこちら

https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux&target_arch=aarch64-jetson&Compilation=Native&Distribution=Ubuntu&target_version=20.04&target_type=deb_network

 アーキテクチャは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.whl

 torchvisionはアーキテクチャの問題もあってビルドする必要があるようだったのですが、一気にビルドしようとすると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でスクリーンショットした画像を対象に検出を試しました。

YOLOで物体検出 その4(GPUの設定、CUDA 12.6)

はじめに  今回はGPUを利用したYOLOの物体検出を試してみました。  Ultralyticsのドキュメントではオプションで切り替えることができるようでしたが、GPUだとエラーが出…

 画像をダウンロードして、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にアクセスして、検出結果を確認しました。

▼リモートデスクトップ接続については、以下の記事で設定しました。

Jetson Xavierを使ってみる その5(NoMachine、リモートデスクトップ接続)

はじめに  今回はNoMachineを利用して、PCからJetson Xavierへのリモートデスクトップ接続を試してみました。  これまでもリモートデスクトップ接続は色々試していたの…

▼以下のように検出結果の画像が表示されました。

 以前の検出結果とは異なり、バウンディングボックスの色も1色だけでした。この辺りは古いUltralyticsのパッケージを利用していることが影響しているのかもしれません。

 yolov8s.ptでも試してみました。

▼処理時間はyolov8n.ptと同じような感じでした。

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

 なおyolo11s.ptも試してみたのですが、Ultralyticsのバージョンが古いせいなのか、モデルがダウンロードされませんでした。私は過去論文でよく使われているということもあってYOLOv8をよく使うので、モデルのバージョンについては十分かなと思っています。

最後に

 Jetson XavierのOS自体が古い影響で、環境構築には度々苦戦しています。アーキテクチャの問題があるので、AIに聞くときはJetson Xavierであることを伝えるようにしています。

 GPUで実行できることは確認できたので、カメラ映像に対するリアルタイム検出などを試したいなと思っています。

▼ROSを利用してカメラ映像を送信できることは確認済みです。研究でも画像処理用とロボット制御用のPCに分けて処理を行っています。

Jetson Xavierを使ってみる その3(ROSの環境構築、USBカメラ映像のPublish)

はじめに  今回はJetson XavierでROSの環境を構築して、USBカメラの映像をPublishしてみました。  ROSの通信で画像を送信して、物体検出や遠隔操作などを試したいなと思…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です