File size: 3,085 Bytes
b3652fb
81def50
375761e
cd88622
02cc722
81def50
 
 
 
02cc722
bef39ed
81def50
02cc722
 
04109fd
375761e
 
fd67b3d
 
375761e
 
 
0fc8fd8
 
 
fd67b3d
0fc8fd8
81def50
9307fab
 
 
8ff8f64
cd88622
b3652fb
 
81def50
b3652fb
81def50
903cef3
 
6549536
cd88622
2d5e944
a1a4c08
 
 
 
 
 
81def50
cd88622
 
 
a1a4c08
2d5e944
a1a4c08
8ff8f64
6549536
8ff8f64
81def50
cd88622
a1a4c08
cd88622
 
 
903cef3
cd88622
 
b3652fb
 
 
 
81def50
 
 
 
b3652fb
81def50
 
 
 
 
b3652fb
81def50
b3652fb
81def50
f6e7520
81def50
 
 
 
 
 
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import io
import os
import sys
import time
import numpy as np
import cv2
import torch
import torchvision
from fastapi import FastAPI, File, UploadFile
from PIL import Image
import uvicorn

app = FastAPI()

# 🟢 Clone ZoeDepth nếu chưa có
zoe_path = "ZoeDepth"
if not os.path.exists(zoe_path):
    os.system("git clone https://github.com/isl-org/ZoeDepth.git")

# 🟢 Thêm ZoeDepth vào sys.path để import được
sys.path.append(os.path.abspath(zoe_path))

# 🟢 Import ZoeDepth sau khi đã tải về
from zoedepth.models.builder import build_model
from zoedepth.utils.config import get_config

# 🟢 Sử dụng đúng model `zoedepth_nk`
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Load ZoeDepth Tiny model correctly
config = get_config("zoedepth", version="tiny", pretrained_resource=None)
model = ZoeDepth.build_from_config(config)
model.eval()

@app.post("/analyze_path/")
async def analyze_path(file: UploadFile = File(...)):
    # 🟢 Đọc file ảnh từ ESP32
    image_bytes = await file.read()
    image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
    
    # 🟢 Lật ảnh trước khi tính toán Depth Map
    image_np = np.array(image)
    flipped_image = cv2.flip(image_np, -1)

    # 🟢 Chuyển đổi ảnh thành tensor phù hợp với ZoeDepth
    transform = torchvision.transforms.Compose([
        torchvision.transforms.Resize((256, 256)),  # ZoeDepth cần resize ảnh nhỏ hơn
        torchvision.transforms.ToTensor(),
    ])
    img_tensor = transform(flipped_image).unsqueeze(0).to(device)

    # 🟢 Bắt đầu đo thời gian dự đoán Depth Map
    start_time = time.time()
    
    # 🟢 Dự đoán Depth Map với ZoeDepth
    with torch.no_grad():
        depth_map = model.infer(img_tensor)
        depth_map = torch.nn.functional.interpolate(
            depth_map.unsqueeze(1), size=(image_np.shape[0], image_np.shape[1]), mode="bicubic", align_corners=False
        ).squeeze().cpu().numpy()

    end_time = time.time()
    print(f"⏳ ZoeDepth xử lý trong {end_time - start_time:.4f} giây")

    # 🟢 Đo thời gian xử lý đường đi
    start_detect_time = time.time()
    command = detect_path(depth_map)
    end_detect_time = time.time()
    print(f"⏳ detect_path() xử lý trong {end_detect_time - start_detect_time:.4f} giây")

    return {"command": command}

def detect_path(depth_map):
    """Phân tích đường đi từ ảnh Depth Map"""
    h, w = depth_map.shape
    center_x = w // 2
    scan_y = h - 20  # Quét dòng gần đáy ảnh

    left_region = np.mean(depth_map[scan_y, :center_x])
    right_region = np.mean(depth_map[scan_y, center_x:])
    center_region = np.mean(depth_map[scan_y, center_x - 20:center_x + 20])

    if center_region > 200:
        return "forward"
    elif left_region > right_region:
        return "left"
    elif right_region > left_region:
        return "right"
    else:
        return "backward"

# 🟢 Chạy server FastAPI
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=7860)