ewrfcas / MVSFormer

Codes of MVSFormer: Multi-View Stereo by Learning Robust Image Features and Temperature-based Depth (TMLR2023)
Apache License 2.0
175 stars 10 forks source link

我想知道测试t&t数据集时出现的深度图异常状况原因,感谢作者 #30

Closed crazydiamondaz closed 8 months ago

crazydiamondaz commented 8 months ago

我在使用作者的代码测试t&t数据集中的temple例时,发现生成的视图有好有坏,我想知道这些较坏的例子是因为什么导致的,是因为我的失误,还是因为网络无法匹配出明显的特征,还是因为pair.txt中指出的参考图片有误。正确生成的深度图如下所示: image 错误生成的深度图包括如下例子: image image 我未对作者的代码进行修改,只降低了分辨率运行测试。 最后感谢作者的付出与劳动,感谢开源!

maybeLx commented 8 months ago

方便发一下,出现这个问题对应的image id 以及 你运行的脚本吗

crazydiamondaz commented 8 months ago

感谢您的回复! 我使用的脚本: CUDA_VISIBLE_DEVICES=0 python test.py --dataset tt --batch_size 1 \ --testpath "/dockerdata/yorkan/dataset/tnt/tankandtemples/advanced" \ --testlist "./lists/tanksandtemples/advanced.txt"\ --resume "/dockerdata/yorkan/dataset/tnt/MVSFormer-Blended/best.pth" \ --outdir "/dockerdata/yorkan/tnt/output" \ --interval_scale 1.0 --num_view 10 --numdepth 256 \ --max_h 1088 --max_w 1920 --filter_method dpcd \ --prob_threshold 0.5,0.5,0.5,0.5 \ --combine_conf --tmps 5.0,5.0,5.0,1.0 输入的图片(Temples数据集序号23图片): image 输出的深度图:(我将pfm转换为了图片格式,GitHub无法直接发送pfm文件)

image 将pfm转换为pfm的脚本如下: def read_pfm(file_path): with open(file_path, "rb") as file: color = None width = None height = None scale = None endian = None

    header = file.readline().decode("utf-8").rstrip()
    if header == "PF":
        color = True
    elif header == "Pf":
        color = False
    else:
        raise Exception("Not a PFM file.")

    dimensions = file.readline().decode("utf-8").rstrip()
    width, height = map(int, dimensions.split(" "))

    scale = float(file.readline().decode("utf-8").rstrip())
    if scale < 0:
        endian = "<"
        scale = -scale
    else:
        endian = ">"

    data = np.fromfile(file, endian + "f")
    shape = (height, width, 3) if color else (height, width)
    data = np.reshape(data, shape)
    data = np.flipud(data)
    return data, scale

def pfm_to_jpg(pfm_file, jpgfile): data, = read_pfm(pfm_file) print(np.min(data),np.max(data)) data = (data - np.min(data)) / (np.max(data) - np.min(data)) * 255 data = data.astype(np.uint8) image = Image.fromarray(data) image.save(jpg_file) 再次感谢您的回复与工作

maybeLx commented 8 months ago

其实这个和depth range有关系,我看了一下,22 和23 的image 他们的camera 的depth range 是0.3 左右,前面一些图片他们的最小depth range是0.6左右,你其实可以手动修改他的depth range,把最小的depth range 设置高一点depth 就会好一些,出现这个原因主要是因为 在depth sample的时候采用的inverse sampling, 最小的depth range 不能太小

maybeLx commented 8 months ago

你可以手动check一下,如果最小的depth range 设置的比较小,你可以打印每个stage的depth value的范围

crazydiamondaz commented 8 months ago

感谢您的回复,我实验了一下,那张图片确实会生成不错的深度,但是周围的原本正常的序号22图片生成出了错误的深度图。这是正常的吗?还是我应该去调整每个图片的depth range,才能得到不错的深度图和正确的模型呢?

crazydiamondaz commented 8 months ago

感谢您的回复,我实验了一下,那张图片确实会生成不错的深度,但是周围的原本正常的序号22图片生成出了错误的深度图。这是正常的吗?还是我应该去调整每个图片的depth range,才能得到不错的深度图和正确的模型呢? 补充信息:我在使用前面的脚本实验时,除了Temple以外的所有模型都能正确生成,除了产生了错误深度图的Temple无法生成正确的点云模型。

maybeLx commented 8 months ago

感谢您的回复,我实验了一下,那张图片确实会生成不错的深度,但是周围的原本正常的序号22图片生成出了错误的深度图。这是正常的吗?还是我应该去调整每个图片的depth range,才能得到不错的深度图和正确的模型呢?

一般而言colmap其实估计出来的depth range 比较好,出现depth 很远的情况,主要是我们后面depth range 在refine的时候,可能有越界的问题, 所以限制一下最近depth 就可以解决。(当然也可以代码里对depth range进行限制)