Jetson Orin NanoでYOLOを動かす!リアルタイム物体検知入門
Jetson Orin NanoにYOLOv8をセットアップしてリアルタイム物体検知を試したいが、手順が複雑で迷っているという方は多いはずだ。この記事では実機を使って動作確認した手順をそのまま紹介する。
この記事でわかること
—
事前に用意するもの
まず手元に必要なものを確認しておこう。
JetPackのインストールがまだの場合は、先に初期設定を済ませておく必要がある。JetPack 6.1系ではPython 3.10がデフォルトで入っているので、本記事はそれを前提として進める。JetPack 6.0以降ではQSPI bootloaderのアップデート(sudo apt install nvidia-l4t-jetson-orin-nano-qspi-updater)が必要な場合がある。
また、Jetsonは高負荷時にかなり発熱する。冷却ファン Noctua NF-A4x10 5V PWMファン(Amazon) を取り付けてから作業することを強くおすすめする。
—
YOLOv8とは何か
YOLOv8はUltralyticsが開発したオブジェクト検出モデルだ。「You Only Look Once」の頭文字を取ったYOLOシリーズの最新世代にあたり、精度と速度のバランスに優れている。
小さいモデル(nano / small)から大きいモデル(large / extra-large)まで複数のサイズが用意されており、Jetson Orin Nano Superのようにリソースに制約のあるデバイスにはnanoまたはsmallモデルが適している。
—
環境構築:PyTorchとUltralyticsのインストール
PyTorchのインストール
JetsonでのPyTorchは通常のpipでインストールされるものとは異なり、NVIDIA公式のwheelファイルを使う必要がある。pip install torchをそのまま実行してもCUDAが有効にならないので注意してほしい。
NVIDIA公式のJetson用PyTorchページからJetPackのバージョンに合ったwheelを確認し、以下のようにインストールする。
# JetPack 6.1 / Python 3.10 向けの例
pip3 install --no-deps torch-2.3.0-cp310-cp310-linux_aarch64.whl
pip3 install --no-deps torchaudio-2.3.0+952ea74-cp310-cp310-linux_aarch64.whl
pip3 install --no-deps torchvision-0.18.0a0+6043bc2-cp310-cp310-linux_aarch64.whl
インストール後、CUDAが認識されているか確認する。
python3 -c "import torch; print(torch.cuda.is_available())"
Trueと表示されればOKだ。Falseが返る場合はwheelのバージョンとJetPackのバージョンが合っていない可能性が高い。
torchvisionのインストール
PyTorchに対応したtorchvisionは上記のwheelで同時にインストールされる。追加で必要に応じて以下を実行。
sudo apt install -y libjpeg-dev zlib1g-dev libopenblas-dev
Ultralyticsのインストール
PyTorchの準備ができたらUltralyticsをインストールする。
pip install ultralytics
依存関係がいくつか自動でインストールされる。完了したら動作確認をしてみよう。numpyを最新に更新すると安定する。
pip install numpy -U
python3 -c "from ultralytics import YOLO; print('OK')"
—
静止画で推論してみる
まず静止画での推論で動作を確認する。これが一番手軽に試せる方法だ。
from ultralytics import YOLO
# nanoモデルをダウンロードして読み込む(初回は自動でダウンロードされる)
model = YOLO("yolov8n.pt")
# 推論実行
results = model("https://ultralytics.com/images/bus.jpg")
# 結果を保存
results[0].save("result.jpg")
result.jpgに検出結果が書き込まれたファイルが保存される。バウンディングボックスと信頼スコアが描画されていれば成功だ。
—
カメラ映像でリアルタイム推論する
静止画の確認が取れたら、本命のリアルタイム推論に進もう。USBカメラを使う場合は以下のコードがそのまま使える。
from ultralytics import YOLO
import cv2
model = YOLO("yolov8n.pt")
# デバイス番号0はUSBカメラ(環境によって1や2になる場合がある)
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("カメラを開けませんでした")
exit()
while True:
ret, frame = cap.read()
if not ret:
break
# device="cuda"でGPU推論
results = model(frame, device="cuda", verbose=False)
# 結果をフレームに描画
annotated = results[0].plot()
cv2.imshow("YOLOv8 Real-time", annotated)
# qキーで終了
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
device="cuda"を指定することでGPUを使った推論になる。指定しないとCPU推論になりフレームレートが大幅に落ちるので注意してほしい。
筆者の環境ではyolov8nモデルでJetson Orin Nano Superで約40-50FPSが出た。用途によっては十分な速度だが、さらに速くしたい場合はTensorRT変換が有効だ。
—
TensorRTでさらに高速化する
YOLOv8はTensorRT形式へのエクスポートをワンコマンドでサポートしている。
yolo export model=yolov8n.pt format=engine device=0
エクスポートが完了するとyolov8n.engineというファイルが生成される。これをそのままYOLOクラスに渡せば高速推論が可能になる。
model = YOLO("yolov8n.engine")
筆者の実測では、TensorRT変換後はJetson Orin Nano Superで60FPS超まで速度が向上した。エクスポート処理自体は数分かかるが、一度やってしまえばあとはengineファイルを使いまわせる。
—
よくあるトラブルと対処法
カメラデバイス番号がわからない
ls /dev/video*
このコマンドで接続されているカメラデバイスの一覧が確認できる。番号を変えながら試してみてほしい。
メモリ不足でクラッシュする
Jetson Orin Nano Superは8GBのメモリを搭載しているが、GPUとCPUでメモリを共有している。複数のプロセスを同時に動かしているとメモリが枯渇することがある。不要なウィンドウやサービスを閉じてから実行しよう。
###推論が遅い
device="cuda"を忘れているか、電源モードが省電力に設定されている可能性がある。以下のコマンドでパフォーマンスモードに切り替えられる。JetPack 6.1では安定性向上のためjetson_clocksの使用を推奨。
sudo nvpmodel -m 0
sudo jetson_clocks
JetPack 6.xではtorch 2.3.0以降でFP16/INT8最適化が改善され、Orin Nano SuperでYOLOv8nがTensorRTで70TOPS活用可能。
—
まとめ
Jetson Orin NanoでYOLOv8を使ったリアルタイム物体検知の手順を一通り紹介した。ポイントを整理するとこうなる。
device="cuda"の指定を忘れずに一度動いてしまえば、あとはモデルのカスタマイズや独自データセットでのファインチューニングなど、応用の幅は非常に広い。ぜひ自分のプロジェクトに合わせて発展させてみてほしい。
—
次はこちら
YOLOをさらに使いこなしたい方や、Jetsonの性能を引き出す設定を知りたい方はこちらの記事も参考にどうぞ。

コメント