序文
以前、Du 先生が立ち上げたtensorRT 高パフォーマンス導入コースを最初から読みましたが、メモを取っていなかったので多くのことを忘れていました。今度もやってメモを取ります。
このコースでは、tensorRT の高度な自動運転ケース プロジェクトの自動運転深度推定について学びます
コースのシラバスについては、以下のマインドマップを参照してください
1. 深さの推定
このセクションでは、深度推定モデルの分析について学習します。私たちの目的は、深度推定のための onnx を見つけ、onnx の一般的な使用ロジックを分析し、最も簡潔なバージョンのpredict.pyを作成することです。次の 3 つのステップ:
1.深度推定のために onnx を開き、その入力と出力を表示します。
2.コードをチェックし、onnx の前処理を見つけて、前処理ロジックを分析します。
3.得られた情報を元に、predict.pyを記述し、書き出してみる
以下の図に示すように、その onnx モデルを見てみましょう。
エクスポートされた onnx モデルから、入力が 1x3x256x512 で、出力が 6 つあることがわかります。
プロジェクト内の image_processor/ Depth_engine.cpp コードを分析して、特定の前処理作業を取得しましょう: (詳細な分析についてはビデオを参照してください)。
1.入力は 1x3x256x512、input.1 です。
2.出力は 1x1x256x512、2499 ノードです
3.正規化.mean = 0.485f、norm = 0.229f
4. y = (x / 255.0 - 平均) / ノルム
5.サイズ変更部分はそれほど複雑ではなく、直接サイズ変更するだけです
6.色に関しては cvtColor が必要です→ \rightarrow→ RGBへ
それを検証するためのプリプロセッサを作成するだけです。コードは次のとおりです。
import onnxruntime
import cv2
import numpy as np
session = onnxruntime.InferenceSession("workspace/ldrn_kitti_resnext101_pretrained_data_grad_256x512.onnx", provider_options=["CPUExecutionProvider"])
image = cv2.imread("workspace/imgs/dashcam_00.jpg")
image = cv2.resize(image, (512, 256))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_tensor = (image / 255.0)
mean = [0.485, 0.456, 0.406]
norm = [0.229, 0.224, 0.225]
image_tensor = ((image_tensor - mean) / norm).astype(np.float32)
image_tensor = image_tensor.transpose(2, 0, 1)[None]
prob = session.run(["2499"], {
"input.1": image_tensor})[0]
print(prob.shape)
prob = prob[0, 0] * -5 + 255
y = int(prob.shape[0] * 0.18)
prob = prob[y:]
cv2.imwrite("depth.jpg", prob)
出力は次のとおりです。
出力が期待どおりであることがわかります。出力された深度推定マップは次のとおりです。
さらに、matplotlib を使用して視覚化することもできます。コードは次のとおりです。
import onnxruntime
import cv2
import numpy as np
import matplotlib.pyplot as plt
session = onnxruntime.InferenceSession("workspace/ldrn_kitti_resnext101_pretrained_data_grad_256x512.onnx", provider_options=["CPUExecutionProvider"])
image = cv2.imread("workspace/imgs/dashcam_00.jpg")
image = cv2.resize(image, (512, 256))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_tensor = (image / 255.0)
mean = [0.485, 0.456, 0.406]
norm = [0.229, 0.224, 0.225]
image_tensor = ((image_tensor - mean) / norm).astype(np.float32)
image_tensor = image_tensor.transpose(2, 0, 1)[None]
prob = session.run(["2499"], {
"input.1": image_tensor})[0]
print(prob.shape)
prob = prob[0, 0]
y = int(prob.shape[0] * 0.18)
prob = prob[y:]
plt.imsave("depth.jpg", prob, cmap='plasma_r')
出力される深度推定マップは次のとおりです。
要約する
このコースでは、オープンソースプロジェクトにおける深度推定事例を学び、主に深度推定モデルのonnxの簡易解析を行い、プロジェクトコードの解析を通じて前処理部分を明らかにし、その後onnxruntimeによる簡易検証を行い、最終的な深度を決定しました。推定結果が視覚的に表示されます