Jetson Orin NanoでYOLOを動かす!リアルタイム物体検知入門

Jetson Orin NanoでYOLOを動かす!リアルタイム物体検知入門

Jetson Orin NanoにYOLOv8をセットアップしてリアルタイム物体検知を試したいが、手順が複雑で迷っているという方は多いはずだ。この記事では実機を使って動作確認した手順をそのまま紹介する。

この記事でわかること

  • Jetson Orin NanoでYOLOv8を動かすための環境構築手順
  • カメラ映像をリアルタイムで推論する方法
  • TensorRTを使った高速化の基本的な流れ
  • 初心者がつまずきやすいポイントと対処法
  • 事前に用意するもの

    まず手元に必要なものを確認しておこう。

  • Jetson Orin Nano Super Developer Kit(67 TOPS) NVIDIA Jetson Orin Nano 開発者キット(Amazon)
  • JetPack 6.1 がインストール済みのmicroSDカードまたはNVMe SSD Western Digital SN770 500GB NVMe(Amazon)
  • USBカメラまたはCSIカメラ Raspberry Pi Camera Module V2(Amazon)
  • 安定した電源アダプター Anker PowerPort III 65W(Amazon)
  • 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を使ったリアルタイム物体検知の手順を一通り紹介した。ポイントを整理するとこうなる。

  • PyTorchはNVIDIA公式のwheelを使う
  • device="cuda"の指定を忘れずに
  • さらなる高速化にはTensorRT変換が効果的
  • 発熱対策は事前にしっかりやっておく
  • 一度動いてしまえば、あとはモデルのカスタマイズや独自データセットでのファインチューニングなど、応用の幅は非常に広い。ぜひ自分のプロジェクトに合わせて発展させてみてほしい。

    次はこちら

    YOLOをさらに使いこなしたい方や、Jetsonの性能を引き出す設定を知りたい方はこちらの記事も参考にどうぞ。

  • Jetson Orin Nano TensorRT高速化チュートリアル
  • Jetson Orin Nano 熱対策・冷却方法まとめ
  • Jetson Orin Nano 対応カメラモジュール おすすめ5選
  • コメント

    タイトルとURLをコピーしました