Make3d数据集使用方法

单目深度估计常用数据集之一make3d。

下载链接:

Make3D --- Range Image Dataset

由于一般该数据集只用来测试在KITTI数据集上训练好的权重的性能,也就是只作为测试集,因此只下载134张图片与对应的深度mat。

下载之后得到两个文件夹,将文件夹解压到一个目录下,并使用一个提取名字的脚本来获得包含所有测试集名字的txt文件。

# 获得make3d图片的名称

import glob
imglist = glob.glob('E:/dataset/make3d/Test134/*.jpg')

with open('make3d_test_files.txt', 'a+') as f:
    for i in imglist:
        _, name = i.split('\\')
        f.write('{}\n'.format(name[:-4]))

最终数据集包含如下:

现在就可以使用验证脚本来验证模型在make3d数据集上的精度了。

# make3d 数据集评估, 以Monodepth2为例
from layers import disp_to_depth
import networks
import cv2
import os 
import torch
import scipy.misc
from scipy import io
import numpy as np
load_weights_folder = './models/mono_resnet50_640x192'
main_path = 'E:/dataset/make3d'
encoder_path = os.path.join(load_weights_folder, "encoder.pth")
decoder_path = os.path.join(load_weights_folder, "depth.pth")
encoder_dict = torch.load(encoder_path)
encoder = networks.ResnetEncoder(50, False)
depth_decoder = networks.DepthDecoder(encoder.num_ch_enc)

model_dict = encoder.state_dict()
encoder.load_state_dict({k: v for k, v in encoder_dict.items() if k in model_dict})
depth_decoder.load_state_dict(torch.load(decoder_path))

#encoder.cuda()
encoder.eval()
#depth_decoder.cuda()
depth_decoder.eval()
def compute_errors(gt, pred):
    rmse = (gt - pred) ** 2
    rmse = np.sqrt(rmse.mean())

    rmse_log = (np.log10(gt) - np.log10(pred)) ** 2
    rmse_log = np.sqrt(rmse_log.mean())

    abs_rel = np.mean(np.abs(gt - pred) / gt)

    sq_rel = np.mean(((gt - pred)**2) / gt)

    return abs_rel, sq_rel, rmse, rmse_log


with open(os.path.join(main_path, "make3d_test_files.txt")) as f:
    test_filenames = f.read().splitlines()
test_filenames = map(lambda x: x[4:], test_filenames)


depths_gt = []
images = []
ratio = 2
h_ratio = 1 / (1.33333 * ratio)
color_new_height = int(1704 / 2)
depth_new_height = 21
for filename in test_filenames:
    mat = io.loadmat(os.path.join(main_path, "Gridlaserdata", "depth_sph_corr-{}.mat".format(filename)))
    depths_gt.append(mat["Position3DGrid"][:,:,3])
    
    image = cv2.imread(os.path.join(main_path, "Test134", "img-{}.jpg".format(filename)))
    image = image[ int((2272 - color_new_height)/2):int((2272 + color_new_height)/2),:,:]
    images.append(image[:,:,::-1])
depths_gt_resized = map(lambda x: cv2.resize(x, (305, 407), interpolation=cv2.INTER_NEAREST), depths_gt)
depths_gt_cropped = map(lambda x: x[int((55 - 21)/2):int((55 + 21)/2),:], depths_gt)

depths_gt_cropped = list(depths_gt_cropped)
errors = []
with torch.no_grad():
    for i in range(len( images)):
        input_color = images[i]
        input_color =  cv2.resize(input_color/255.0, (640, 192), interpolation=cv2.INTER_NEAREST)#<----1
        input_color = torch.tensor(input_color, dtype = torch.float).permute(2,0,1)[None,:,:,:]
        output = depth_decoder(encoder(input_color))
        pred_disp,_ = disp_to_depth(output[("disp", 0)], 0.1, 100) #<---2
        pred_disp = pred_disp.squeeze().cpu().numpy()
        depth_gt = depths_gt_cropped[i]
        depth_pred = 1 / pred_disp
        depth_pred = cv2.resize(depth_pred, depth_gt.shape[::-1], interpolation=cv2.INTER_NEAREST)
        mask = np.logical_and(depth_gt > 0, depth_gt < 70)
        depth_gt = depth_gt[mask]
        depth_pred = depth_pred[mask]
        depth_pred *= np.median(depth_gt) / np.median(depth_pred)
        depth_pred[depth_pred > 70] = 70
        errors.append(compute_errors(depth_gt, depth_pred))
    mean_errors = np.mean(errors, 0)
    

print(("{:>8} | " * 4).format( "abs_rel", "sq_rel", "rmse", "rmse_log"))
print(("{: 8.3f} , " * 4).format(*mean_errors.tolist()))

得到结果如下:

与论文中的结果还是比较接近的。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,下面是使用KMeans聚类、DBSCAN算法对4个特征、4个簇的模拟数据进行聚类的示例代码: ```python # 导入必要的库 from sklearn.datasets import make_classification from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 生成模拟数据 X, y = make_classification(n_samples=1000, n_features=4, n_informative=4, n_redundant=0, n_clusters_per_class=1, class_sep=0.5, random_state=42) # 使用KMeans聚类 kmeans = KMeans(n_clusters=4, random_state=42) kmeans_labels = kmeans.fit_predict(X) # 使用DBSCAN算法聚类 dbscan = DBSCAN(eps=0.3, min_samples=5) dbscan_labels = dbscan.fit_predict(X) # 绘制聚类结果图像 fig = plt.figure(figsize=(18, 6)) # 绘制KMeans聚类结果 ax1 = fig.add_subplot(1, 2, 1, projection='3d') ax1.scatter(X[:, 0], X[:, 1], X[:, 2], c=kmeans_labels, cmap='rainbow') ax1.set_title('KMeans Clustering') ax1.set_xlabel('Feature 1') ax1.set_ylabel('Feature 2') ax1.set_zlabel('Feature 3') ax1.view_init(elev=20, azim=30) # 绘制DBSCAN聚类结果 ax2 = fig.add_subplot(1, 2, 2, projection='3d') ax2.scatter(X[:, 0], X[:, 1], X[:, 2], c=dbscan_labels, cmap='rainbow') ax2.set_title('DBSCAN Clustering') ax2.set_xlabel('Feature 1') ax2.set_ylabel('Feature 2') ax2.set_zlabel('Feature 3') ax2.view_init(elev=20, azim=30) plt.show() ``` 在上述代码中,我们使用`make_classification`函数生成了一个包含四个特征、四个簇的模拟数据集。接着,我们分别使用KMeans聚类、DBSCAN算法对数据集进行聚类,并将聚类结果绘制成3D图像。 在图像中,我们可以看到KMeans聚类和DBSCAN算法聚类的结果。其中,KMeans聚类将数据集分成了四个簇,而DBSCAN算法则将数据集中的一些异常点(如图中的蓝色点)作为噪声进行了处理。不同的簇用不同的颜色表示,可以清晰地看出聚类的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值