【物体検出】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コマンドの結果から取得するプログラムを書きました。
検証結果
検証した結果、まずまず?そこそこ?の結果となりました。

YOLOv3が7.5fpsでYOLOv4の4.6fpsよりも高速で処理できるという一方で、 YOLOv3とYOLOv3-tinyの差はほとんどありませんでした。
YOLOv3のほうがYOLOv4より高速で動作することはある程度は予想がついていたのですが、YOLOv3とYOLOv3-tinyがほぼ同じ動作速度というのは違和感があります。
そこでGPUの使用率を見てみました。

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関連を担当しています。保有資格:ソフトウェア開発技術者
おすすめの関連記事
- 【物体検出】vol.12 :YOLOv4をNVIDIA Jetson AGX Xavierで動かす
- 【物体検出】vol.10 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす~その2(OpenCV4対応)
- 【物体検出】vol.9 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす
- 【物体検出】vol.2 :YOLOv3をNVIDIA Jetson Nanoで動かす
機械学習・AIの最新記事
- 【エッジAI】Raspi5+SONY IMX500で30FPS枕木検出チャレンジ!~鉄道技術展2025デモ編 vol.25
- 【エッジAI】Raspi+SONY IMX500で30FPS物体検出チャレンジ!~オリジナルモデル、静止画・ログ保存編 vol.24
- 【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~環境整備編 vol.23
- 【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~検出実行編 vol.22