Nakasha for the Future【物体検出】vol.19 : Jetson Xavier NXの検出性能(PythonからYOLOv3,v4)

【物体検出】vol.19 : Jetson Xavier NXの検出性能(PythonからYOLOv3,v4)

NVIDIAから、機械学習用シングルボードコンピュータが、性能や価格帯ごとに販売されています。

これから使い始める場合は登場時期が比較的最近のXavier・Nano・Xavuer NXのどれを採用するか?で悩む方が多いのでは?と思います。

それぞれ特徴をさらっとご紹介します、

  • Xavier: 性能重視
  • Nano: 低価格
  • Xavier NX: 性能とコスパのバランス型

といった住み分けになるかと思います。

まずXavier NXを試してみて、性能が不足しているようであればXavierを、そこまでの性能が必要ない場合はNanoを検討する。

こんな感じで選ばれると良いと思います。

とはいえ「じゃあそれぞれ具体的にどれくらいのパフォーマンスで動作するの?」となると思うので、今回は当社が活用に力を入れているdarknet YOLOが、Xavier NX上でどれほどの検出性能を発揮するのかを検証をしてみました。

 

検証条件

 

次の条件で検証しました。

  • JetPackは現時点最新版である4.5.1
  • 最大パワーのMODE15W6CORE
  • darknetビルド設定はGPU=1, CUDNN=1, CUDNN_HALF=1, OPENCV=1
  • darknet.pyを活用しPythonから検出プログラムを記述
  • カメラモジュールからの情報を検出対象とする
  • 60秒間で検出し続けて処理できたフレーム数を測る
  • データセットはcoco.dataを使用
  • thresholdは検出しまくりの0.01
  • 検出したバウンディングボックスの領域を描画
  • 画像ファイルの保存はしない

検出対象をカメラモジュール(ロジクール C270nで性能は720p=1280×720だと30fps)にし、検出後に画像ファイルを保存しないことで、microSDに対してのI/Oの遅さの影響を除外しました。

 

フレーム取得・検出・BBox描画の繰り返し部分のみを計測

 

60秒間で検出できたフレーム数からFPSを割り出す形で計測したわけですが、この60秒間の中に起動や検出器のロード時間などは含まれないようにしています。

実際にシステムに組み込んだ時に重要とされるのは、起動の速さではなく継続的な検出処理速度だからです。

検証のために作成したプログラムは、かなり長くなってしまったので、計測部分だけをピンポイントに載せます。

def measure(network, class_names, class_colors, darknet_image, cap):
    """
    Parameters
    ----------
    network: darknet.network_ptr
    class_names: list of str
    class_colors: list of str
    darknet_image: darknet.IMAGE
    cap: cv2.VideoCapture

    Returns
    -------
    float
        fps
    """
    detect_count = 0
    MEASURE_TIME = 60
    before = time.perf_counter()

    while time.perf_counter() - before < MEASURE_TIME:
        retval, im = cap.read()
        darknet.copy_image_from_bytes(darknet_image, im.tobytes())
        detections = darknet.detect_image(network, class_names, darknet_image, thresh=0.01)
        darknet.draw_boxes(detections, im, class_colors)

        detect_count += 1
    
    return detect_count / MEASURE_TIME

このように、純粋なフレーム取得・検出・BBox描画の部分のみの処理時間の計測となっています。

また、GPU使用率は、別プロセスで1秒ごとにtegrastatsコマンドの結果から取得するプログラムを書きました。

 

検証結果

 

検証した結果、まずまず?そこそこ?の結果となりました。

 

fps.png

YOLOv3が7.5fpsでYOLOv4の4.6fpsよりも高速で処理できるという一方で、 YOLOv3とYOLOv3-tinyの差はほとんどありませんでした。

YOLOv3のほうがYOLOv4より高速で動作することはある程度は予想がついていたのですが、YOLOv3とYOLOv3-tinyがほぼ同じ動作速度というのは違和感があります。

そこでGPUの使用率を見てみました。

gpupower.png

GPUの使用率は、YOLOv4が予想通りほぼ100%使い切っていたのに対して、YOLOv3は少し余力があるように見え、 YOLOv3-tinyとなるとかなり余力があるように見えます。

こうしてみると、YOLOv3を利用すると、ボトルネックがGPUではなく他の部分である可能性が高そうです。

ちなみに、グラフがギザギザの形になっているのは、カメラからの画像読み込みとGPUを使用した検出処理を交互に行っているためです。

キューにフレームをプッシュするスレッドとキューからフレームを取り出して物体検出をするスレッドで分けて処理することで、グラフの谷がなくなる形でGPUを活用できるかもしれません。

ただ今回は、動作速度の検証が目的なので、何か製品を作るときはそういう構造にしようと思います。

 

まとめ

 

というわけで、まとめです。

  • NXでリアルタイムな検出をしようとしたとき、YOLOv4だと活用できるシーンが限られる
  • YOLOv3-tinyになるとGPUの性能を半分も引き出せない
  • Xavier NXにはYOLOv3を採用すれば、その性能をジャストに活かし、そこそこのFPSを期待できる

 

 

▼この記事を書いたひと

R&Dセンター 長尾 賢志

Pythonistaですが、Java、C#、Rubyなども経験があり、オブジェクト指向を得意とします。Djangoを使用したWeb開発をしたことがあるほか、データ解析・可視化なども行なっています。R&Dセンターではエッジコンピューティング、IoT関連を担当しています。保有資格:ソフトウェア開発技術者

 

おすすめの関連記事


機械学習・AIの最新記事


お問い合わせ

ご意見・ご質問などお気軽にお問い合わせ下さい。
ナカシャクリエイテブ株式会社

●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337
〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711  地図
R&Dセンター

Email:メールでのお問い合わせ