Jetson Orin NanoでYOLOv8をリアルタイム物体検出する方法
Jetson Orin NanoにYOLOv8を導入してリアルタイム物体検出を動かしたい人向けに、環境構築から動作確認まで実機で検証した手順をまとめました。
この記事でわかること
—
動作環境と用意するもの
この記事では以下の環境で動作確認しています。
ストレージはmicroSDカードでも動かせますが、モデルの読み込み速度や作業の快適さを考えると、NVMe SSD Western Digital SN770 500GB NVMe(Amazon) への換装を強くおすすめします。microSDカード Samsung microSDXC 128GB (Endurance)(Amazon) でもとりあえず動作確認はできます。
カメラはUSB接続のウェブカメラで十分ですが、より高品質な映像で試したい場合は対応カメラモジュール Raspberry Pi Camera Module V2(Amazon) を検討してみてください。
—
YOLOv8の環境構築
Pythonの仮想環境を作る
Jetson環境はシステムのPythonに余計なパッケージを入れると壊れやすいため、まず仮想環境を作ります。
sudo apt update
sudo apt install python3-pip python3-venv -y
python3 -m venv ~/yolov8_env
source ~/yolov8_env/bin/activate
依存パッケージのインストール
PyTorchはJetPack 6.1にプリインストールされていますが、最新版を使う場合はNVIDIA公式のJetson向けホイールを確認してください。
pip install --upgrade pip
pip install numpy
JetPack 6.1ではtorchvisionもソースからビルドします。少し時間がかかりますが、焦らず待ちましょう。
sudo apt install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev -y
git clone --branch v0.18.1 https://github.com/pytorch/vision torchvision
cd torchvision
python setup.py install
cd ..
Ultralyticsのインストール
pip install ultralytics
インストール後に動作確認します。
yolo version
エラーが出なければ準備完了です。
—
画像ファイルで物体検出を試す
まずはカメラなしで静止画に対して推論を実行して、正しく動くか確認します。
from ultralytics import YOLO
model = YOLO("yolov8n.pt") # 初回はモデルが自動ダウンロードされる
results = model("https://ultralytics.com/images/bus.jpg")
results[0].show()
このコード中の yolov8n.pt はもっとも軽量なモデルです。検出精度より速度を優先するJetson環境ではまず n(nano)モデルから試すのが定石です。
—
カメラを使ったリアルタイム物体検出
USBカメラで推論を実行する
USBウェブカメラが /dev/video0 に認識されていることを確認してから以下を実行します。
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.predict(source=0, show=True, stream=True)
for result in results:
pass # ウィンドウを閉じるまでループ
source=0 がカメラデバイスの番号です。複数のカメラを接続している場合は 1 や 2 に変更して試してください。
CSIカメラを使う場合
Jetson対応のCSIカメラ Raspberry Pi Camera Module V2(Amazon) を使う場合は、GStreamerパイプラインで映像を取得します。
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
gst_pipeline = (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), width=1280, height=720, framerate=30/1 ! "
"nvvidconv ! "
"video/x-raw, format=BGRx ! "
"videoconvert ! "
"video/x-raw, format=BGR ! appsink"
)
cap = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
annotated = results[0].plot()
cv2.imshow("YOLOv8", annotated)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
—
TensorRTで推論を高速化する
YOLOv8はTensorRT形式への変換をコマンド一つで行えます。変換には10〜20分ほどかかりますが、推論速度が大きく改善します。
yolo export model=yolov8n.pt format=engine device=0
変換が完了すると yolov8n.engine が生成されます。以降の推論ではこちらを使います。
from ultralytics import YOLO
model = YOLO("yolov8n.engine")
results = model.predict(source=0, show=True, stream=True)
for result in results:
pass
実測では変換前のPyTorchモデルで約20fps、TensorRT変換後は40fps以上(USBカメラ、imgsz=640)が出る場面もありました。Jetson Orin Nano Superの性能を引き出すにはTensorRT化は必須と考えてよいでしょう。
—
よくあるトラブルと対処法
CUDA関連のエラーが出る
JetPackのバージョンとPyTorchのバージョンが合っていない場合に起きやすいです。jtop コマンドでJetPackのバージョンを確認し、対応するホイールを選び直してください。
sudo apt install python3-jtop
jtop
カメラが認識されない
ls /dev/video* でデバイスが存在するか確認してください。USBカメラの場合はいったん抜き差しすると認識されることがあります。JetPack 6.1では初回GStreamer使用時に遅延が発生しやすいので、2回目以降を試してください。
長時間動かすと熱でパフォーマンスが落ちる
Jetson Orin Nanoは負荷が高いと熱によってクロックが下がります(サーマルスロットリング)。冷却ファン Noctua NF-A4x10 5V PWMファン(Amazon) を取り付けて、安定した冷却を確保することをおすすめします。ケースなしのむき出し状態で長時間の推論処理をするのは避けたほうがよいです。
—
まとめ
Jetson Orin NanoでYOLOv8をリアルタイム物体検出する手順を紹介しました。
yolov8n.pt の軽量モデルから試す最初のセットアップは少し手間がかかりますが、一度動き始めるとYOLOv8の手軽さとJetsonのGPU性能の組み合わせの良さを実感できます。ぜひ試してみてください。
—
次はこちら
YOLOv8の推論をさらに高速化したい方や、Jetson Orin Nanoの活用幅を広げたい方はこちらの記事もどうぞ。

コメント