File size: 2,282 Bytes
ca014b5
 
 
ed7e522
 
ca014b5
861493c
35e8a5e
ca014b5
 
 
 
 
 
 
 
9922e21
ca014b5
baf0224
ca014b5
db7d029
 
 
ca014b5
9922e21
 
ed7e522
ca014b5
db7d029
861493c
 
 
 
 
35e8a5e
861493c
db7d029
 
 
 
 
 
 
ca014b5
 
 
 
 
3aaa09c
 
9922e21
 
 
 
3aaa09c
ed7e522
9922e21
ca014b5
 
db7d029
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import gradio as gr
import spaces
import torch
import numpy as np
from PIL import Image
from depth_anything_3.api import DepthAnything3
import tempfile
import imageio.v2 as imageio

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = DepthAnything3.from_pretrained("depth-anything/da3nested-giant-large")
model = model.to(device=device)

@spaces.GPU
def analyze_depth(image):
    if image is None:
        return None, None, None, None, None

    prediction = model.inference([image], process_res_method='lower_bound_resize', process_res=1008)

    depth_np = prediction.depth[0].cpu().numpy() if torch.is_tensor(prediction.depth[0]) else prediction.depth[0]
    extrinsics_np = prediction.extrinsics[0].cpu().numpy() if torch.is_tensor(prediction.extrinsics[0]) else prediction.extrinsics[0]
    intrinsics_np = prediction.intrinsics[0].cpu().numpy() if torch.is_tensor(prediction.intrinsics[0]) else prediction.intrinsics[0]

    depth_min = float(depth_np.min())
    depth_max = float(depth_np.max())
    depth_normalized = (depth_max - depth_np) / (depth_max - depth_min)

    depth_8bit_img = Image.fromarray((depth_normalized * 255).astype(np.uint8), mode='L')
    depth_16bit = (depth_normalized * 65535).astype(np.uint16)

    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.png')
    temp_path = temp_file.name
    temp_file.close()
    imageio.imwrite(temp_path, depth_16bit)

    return (
        depth_8bit_img,
        temp_path,
        {"depth_min": depth_min, "depth_max": depth_max, "size": list(depth_np.shape[::-1])},
        {"matrix": extrinsics_np.tolist()},
        {"matrix": intrinsics_np.tolist()}
    )

# 建立 Gradio 介面
demo = gr.Interface(
    fn=analyze_depth,
    inputs=gr.Image(type="pil", label="上傳圖片"),
    outputs=[
        gr.Image(type="pil", label="8bit 預覽圖"),
        gr.File(label="16bit 深度圖 (PNG)"),
        gr.JSON(label="深度範圍 (Depth Min/Max)"),
        gr.JSON(label="相機外參 (Extrinsics)"),
        gr.JSON(label="相機內參 (Intrinsics)")
    ],
    title="Depth Anything V3 - 深度分析",
    description="上傳圖片,輸出深度圖(白色=近,黑色=遠)及相機參數。16bit PNG 保留更精準的深度值 (0-65535)。"
)

demo.launch()