DLにて単一画像から深度推定を行うモデルを作成しており、学習などにKITTIのデータセットを用いる場合には深度画像というものがないために疑似的に深度画像を自作しなくてはいけない。
monodepth2のKITTI evaluationで説明されている方法にてvelodyne深度データをnumpyに変換して保存することができるので、今回はそのデータを用いる。(バイナリデータを単純にnumpyに変換しているだけです。)
以下コード
import cv2
import numpy as np
import tqdm
import matplotlib.pyplot as plt
def lidarVisualize(k_size =10,itrs=3):
print("load dataset…")
data_path="./datasets/kitti_depth/gt_depths.npz"
depth_data=np.load(data_path,allow_pickle=True)['data']
print("start visualization")
for image_ind in tqdm.tqdm(range(len(depth_data))):
kernel = np.ones((k_size,k_size),np.float32)/(k_size**2)
depth_map=depth_data[image_ind]
depth_data_upper=depth_map[:200,:]
depth_data_upper[np.where(depth_data_upper==0)]=1#欠落部補間
depth_map[:200,:]=depth_data_upper
depth_map = cv2.GaussianBlur(depth_map,(k_size,k_size),0)#ガウシアンぼかし
depth_map = cv2.dilate(depth_map,neiborhood,iterations=itrs)#膨張
depth_map = cv2.erode(depth_map,neiborhood,iterations=itrs)#収縮
depth_map = np.clip(depth_map * 255, 0, 255).astype(np.uint8)
plt.imsave("./tmp/{}.png".format(image_ind),depth_map,cmap=None)
#cv2.imwrite("./tmp/{}.png".format(image_ind),depth_map)
#plt.imshow(depth_map,cmap="gray")
if __name__=='main':
lidarVisualize(11,3) #ガウシアンフィルタ11x11,膨張収縮処理3回
簡易的な視覚化ですが、処理の流れを説明します。
numpy配列(.npzファイル)読み込み
↓
データの上の部分(主に空に当たる部分)がセンサーの仕様上欠落しているので補間
↓
ガウシアンフィルタで点になっている部分をにじませる。
↓
膨張・収縮処理
↓
画像出力

data_pathなど、適宜自分の環境に合わせて使用してください。
深度データの上の部分は学習では使わなかったりしますが、今回は簡易的に可視化するので雑に処理しています。
コメント