公式のYOLOXのONNXを使うと、Vitis AIのPyTorchのと比べて後処理(Post-process)が速いです。
出力の結合、softmax、sigmoidなどの後処理が推論側で対応していました。
実際に確認してみたプログラム含めて紹介します。
ONNXのYOLOXの後処理(Post-process)が速いことに関してのメモ
YOLOXをDPUで高速化をしても、後処理(Post-process)の速度がネックとなります。
公式のYOLOXのONNXを使うと、Vitis AIのPyTorchのと比べて後処理が速いです。
出力の結合、softmax、sigmoidなどの後処理が推論側で対応していました。
違いについて、少し調べた内容を紹介します。
メモレベルなのでご了承ください。
テスト動画は下記です。
実際に動かしたプログラム(.py)や設定ファイルなどは下記GitHubに保存しています。
以前にPetalinux環境でONNXを動かせるようにした環境で実行しています。
テスト環境
テスト環境は以下の通りです。
- Vivado, Vitis, PetaLinux…2023.1
- Vitis AI …3.5
使用評価ボードはKV260です。
YOLOXのONNXのモデル
今回は2つのONNXのYOLOXのモデルをKV260上でテストしています。
1つ目はVitis AI公式のPyTorchをONNXに変換したモデルです。
https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo/model-list/pt_yolox-nano_3.5
2つ目はYOLOX公式から展開されているONNXのモデル(YOLOX-Nano)です。
https://yolox.readthedocs.io/en/latest/demo/onnx_readme.html
YOLOXのプログラム
YOLOXのプログラムは各モデルに合うように2つ作成しました。
動画テストでは比較するために、DPUではなくCPUで推論(inference)しています
・Vitis AIのONNX用のプログラムが下記です。
・YOLOX公式のONNX用のプログラムが下記です
大きな違いは出力結合箇所,softmax、sigmoidを省略しているところです。
詳細はプログラムでご確認お願いします。
1 2 3 4 5 6 7 8 9 10 11 12 |
def postprocess( ~~~ predictions = outputs[0] boxes = predictions[:, :4] # scores = sigmoid(predictions[:, 4:5]) * softmax(predictions[:, 5:]) scores = predictions[:, 4:5] * predictions[:, 5:] def run(image_index, display=False): ~~~ # postprocess decode_start = time.time() # outputs = reshape_and_concat_outputs(output_data) |
ONNXのYOLOXの後処理のテスト
実際のテストした結果です。
(実際にはCPUで推論したので使いませんでしたが)、最初にDPUをロードしています。
1 2 3 |
sudo xmutil unloadapp sudo xmutil loadapp b4096_300m sudo xmutil listapps |
最初にVitis AI公式のPyTorchをONNXに変換したモデルをテストします。
1 2 |
cd onnx-test/ python onnx-cpu-yolox.py |
後処理(Post-process)の時間は0.0349 secondsでした。約30ms程度です。
今回はCPUで推論していますので、あまり気になりません。
ただ、DPUで高速化するとネックになります。
1 2 3 4 5 6 7 8 9 |
bboxes of detected objects: [[ 470.0975647 137.78985596 809.90246582 477.59475708] [ 0. 5.46184874 1280. 720. ]] scores of detected objects: [0.73085773 0.24486023] Details of detected objects: [49. 60.] Pre-processing time: 0.0107 seconds CPU execution time: 0.3382 seconds Post-process time: 0.0349 seconds Total run time: 0.3838 seconds Performance: 2.6053244400107585 FPS |
YOLOX公式のONNXのモデルを確認して、後処理の時間を確認します。
モデルを確認すると、最後の出力が1x3549x85の1つになっています。
またsigmodが含まれていることも確認できます。
1 |
python onnx-official-yolox.py |
後処理(Post-process)の時間は0.0129 secondsでした。約10ms程度です。
やはりVitis AIのPyTorchを元にしたONNXより早いことが確認できました。
1 2 3 4 5 6 7 8 9 |
bboxes of detected objects: [[ 462.03820801 138.55554199 802.19238281 490.05123901] [ 6.32357121 2.35593367 1276.58996582 720. ]] scores of detected objects: [0.88007289 0.29118863] Details of detected objects: [49. 60.] Pre-processing time: 0.0107 seconds DPU execution time: 0.2495 seconds Post-process time: 0.0129 seconds Total run time: 0.2730 seconds Performance: 3.6629332606738294 FPS |
コメント