Last updated on

YOLOv8からONNXやTensorRTにExportして使ってみた。


アプリの処理速度を早くできないか?

FF14名前黒塗りアプリ、動画作成部分はffmpegを導入したことで良い感じになってきました。

でもやっぱり一番人気が出そうなのは、配信でリアルタイムに黒塗りできれば、一番アプリが使われそうだよねー
現在私の環境で最速25FPSくらいで処理できてるけど、FHDで60FPSくらいで処理できるようになれば、リアルタイムにも対応できそうだけど・・・

今はpytorchのYOLOv8をそのまま実行してるけど、例えば推論専用モデルのONNXやTensorRTに変換したら、性能アップするのでは??
以前のMMdeployでONNXを試した時は性能はともかく精度がイマイチだったけど、YOLOv8はいろいろ凝ってるからそのあたりもカバーされてていい感じになっているかも?
もしうまく動けば、推論専用モデルだから処理性能も期待できるよね!

 

というわけでやってみた。

公式に書いてある通りの手順で、とりあえずやってみた。

公式のドキュメントによると、

Performance: Gain up to 5x GPU speedup with TensorRT and 3x CPU speedup with ONNX or OpenVINO.

らしいので、これは期待できるかも!
ドキュメントに書かれているサンプルコードを見てみるとこんな感じ。

from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO("yolov8n.pt")

# Export the model to TensorRT format
model.export(format="engine")  # creates 'yolov8n.engine'

# Load the exported TensorRT model
tensorrt_model = YOLO("yolov8n.engine")

# Run inference
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")

yolov8n.pt っていうのがpytorchのモデル、yolov8n.engine っていうのがTensorRTのモデル、
pytorchのモデルを読み込んで、それをTensorRTのモデルにエクスポート、そのTensorRTのモデルを使って、画像を処理しますよ、っていうサンプルになっている。
ちなみにONNXも同じ感じで、yolov8n.onnx になる。
なるほど。簡単。裏ではいろいろいい感じになるように動いているんだろうなぁ。さすがultralytics、すばらしい。

で、実際に変換して、黒塗り処理をTensorRT、ONNXでやってみた!
結果は!
pytorch:20FPS (現状)
TensorRT:15FPS
ONNX:10FPS

 

なんでだろう?

推論専用モデルに置き換えているのに遅くなるのはナゼなんだぜ??
なんだかあまり期待できそうにないので細かく調べてはないのですが、原因としてあり得そうなものは、

  • そもそも現在のpytorch+yolov8で、torch-tensorrtが動いていて、私は何もしてないが既にいい感じに高速化されている可能性
  • 事前のTensorRTモデルへの変換は、nvidiaではWindowsは公式にサポートしていないとかをどこかで見た記憶があり、十分にパフォーマンスがでない可能性
  • エクスポートでパラメータを設定していないので、パフォーマンスがでていない可能性

んー・・・なんとなく、一番最初の、既にtorch-tensorrtが動いているから、が本命な気がする。
推論モデルへの変換でポンと速くなったらー、と思ったんだけどなぁ

そういえば、以前、mmdeployでONNXを試した時には、処理の精度がイマイチ、入力解像度が固定と残念ポイントが多かったのですが、YOLOv8では、エクスポート時、dynamic=True というオプションをつけることで入力解像度が自由になるとのこと!さすがultralytics考えられてるー!
また精度についても、モデル変換したTensorRT、ONNXの両方とも、いい感じに出力してくれました!
あとは性能だけなんだけどなぁー

やっぱり解像度を落とさないと処理速度は稼げないのかもしれない、
けど解像度を落とすと小さい検出対象は潰れて見えにくくなっちゃうんだよなー
悩ましいー

 

後日談