depth-pro 苹果单目深度估计

单目深度估计


项目地址

ml-depth-pro

depth-pro onnx导出


  1. hugginface上已有的onnx模型
    depth_pro.onnx
  2. onnx导出脚本
    注意最好使用opset_version>=17进行导出,否则在转为tensorrt模型使用fp16推理的时候会有溢出
    Running layernorm after self-attention in FP16 may cause overflow. Forcing layernorm layers to run in FP32 precision can help with preserving accuracy.
  • fp16
    正常导出fp32模型会因为模型大于2g,无法保存到单个文件,这里使用fp16进行导出
import torch
from depth_pro import create_model_and_transforms, load_rgb

model, transform = create_model_and_transforms(
    device=torch.device('cuda:0'),
    precision=torch.float16
)
model.eval()

x = torch.randn(1, 3, 1536, 1536, device='cuda:0', dtype=torch.float16)

with torch.no_grad():
    torch.onnx.export(model,
                  x,
                  "model/depth_pro.onnx",
                  export_params=True,
                  opset_version=17,
                  do_constant_folding=True,
                  input_names=['input'],
                  output_names=['depth', 'fov'],
                  keep_initializers_as_inputs=None)
  • fp32
import torch
from depth_pro import create_model_and_transforms, load_rgb

model, transform = create_model_and_transforms(
    device=torch.device('cuda:0')
)
model.eval()

x = torch.randn(1, 3, 1536, 1536, device='cuda:0')

with torch.no_grad():
    torch.onnx.export(model,
                  x,
                  "model/depth_pro.onnx",
                  export_params=True,
                  opset_version=17,
                  do_constant_folding=True,
                  input_names=['input'],
                  output_names=['depth', 'fov'],
                  keep_initializers_as_inputs=None)

depth-pro onnxruntime推理


import cv2
import numpy as np
import onnxruntime
from matplotlib import pyplot as plt
import PIL.Image
from scipy.ndimage import zoom

def preprocess_image(image, precision='float16'):
    # 将图片转换为[0, 1]范围的float32类型
    image = cv2.resize(image, (1536, 1536))
    image = image.astype(np.float32) / 255.0

    # Normalize到[-1, 1]范围
    image = (image - 0.5) / 0.5

    # 如果需要转换精度,可以使用astype
    if precision == 'float16':
        image = image.astype(np.float16)
    elif precision == 'float32':
        image = image.astype(np.float32)
    elif precision == 'float64':
        image = image.astype(np.float64)

    image = np.transpose(image, (2, 0, 1))  # 假设输入图像为 HWC 格式,输出为 CHW 格式

    return image

def resize_inverse_depth(inverse_depth, H, W, interpolation_mode='bilinear'):
    # 获取输入数据的形状
    original_shape = inverse_depth.shape
    _, _, original_height, original_width = original_shape

    # 计算缩放因子
    scale_factor_y = H / original_height
    scale_factor_x = W / original_width

    # 确保只缩放 height 和 width 维度
    scale_factors = (1, 1, scale_factor_y, scale_factor_x)

    # 使用 scipy.ndimage.zoom 进行插值
    if interpolation_mode == 'bilinear':
        resized_depth = zoom(inverse_depth, scale_factors, order=1)
    elif interpolation_mode == 'nearest':
        resized_depth = zoom(inverse_depth, scale_factors, order=0)
    else:
        raise ValueError(f"Unsupported interpolation mode: {interpolation_mode}")

    return resized_depth

def compute_depth(W, H, fov_deg, canonical_inverse_depth, f_px=None, resize=False, interpolation_mode='bilinear'):
    if f_px is None:
        f_px = 0.5 * W / np.tan(0.5 * np.radians(fov_deg))
    inverse_depth = canonical_inverse_depth * (W / f_px)
    f_px = np.squeeze(f_px)

    if resize:
        inverse_depth = resize_inverse_depth(inverse_depth, H, W)
    depth = 1.0 / np.clip(inverse_depth, 1e-4, 1e4)
    return depth

def extract_foreground(image, depth_map, depth_threshold=3.0):
    foreground_mask = depth_map < depth_threshold
    foreground_mask = foreground_mask.squeeze()
    foreground_image = np.zeros_like(image)
    foreground_image[foreground_mask] = image[foreground_mask]
    return foreground_image

session = onnxruntime.InferenceSession("models/depth_pro_1.onnx", None)

input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

image = cv2.imread("images/bus.jpg")[..., ::-1] 
h, w, _ = image.shape

input_data = preprocess_image(image)

input_data = np.expand_dims(input_data, axis=0)  # 增加 batch 维度

raw_result = session.run([], {input_name: input_data})  # 获取反向深度和 FOV
canonical_inverse_depth = raw_result[0] 
fov_deg = raw_result[1]  # 输出视场角

depth = compute_depth(w, h, fov_deg, canonical_inverse_depth, resize=True)

inverse_depth = 1 / depth
max_invdepth_vizu = min(inverse_depth.max(), 1 / 0.1) 
min_invdepth_vizu = max(1 / 250, inverse_depth.min())

inverse_depth_normalized = (inverse_depth - min_invdepth_vizu) / (max_invdepth_vizu - min_invdepth_vizu)

inverse_depth_normalized = np.squeeze(inverse_depth_normalized)

cmap = plt.get_cmap("turbo")

color_depth = (cmap(inverse_depth_normalized)[..., :3] * 255).astype(np.uint8)

color_map_output_file = "result/result.jpg"
PIL.Image.fromarray(color_depth).save(color_map_output_file, format="JPEG", quality=90)

image.png

depth-pro tensorrt推理

项目地址 ml-depth-pro-trt10

  1. 使用opset_version>=17进行导出,否则在转为tensorrt模型使用fp16推理的时候会有溢出,导致fp16模型无法得到正常结果

  2. fp16已经成功运行了

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容