File size: 2,391 Bytes
b3652fb
81def50
b461974
02cc722
81def50
 
 
 
02cc722
bef39ed
81def50
02cc722
 
b461974
2d5e944
 
 
b461974
 
 
 
81def50
2d5e944
 
81def50
9b9ed4a
81def50
 
3f318c7
b3652fb
 
81def50
b3652fb
81def50
2d5e944
81def50
2d5e944
 
 
 
 
81def50
 
2d5e944
 
81def50
 
 
 
2d5e944
f6e7520
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
import io
import os
import sys
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 FastDepth từ GitHub nếu chưa có
if not os.path.exists("fastdepth"):
    os.system("git clone https://github.com/dwofk/fast-depth.git fastdepth")

# 🟢 Thêm `fastdepth` vào `sys.path`
sys.path.append(os.path.abspath("fastdepth"))

# 🟢 Import FastDepth
from fastdepth.models import MobileNetSkipAdd  # Model chính của FastDepth

# 🟢 Load mô hình FastDepth
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MobileNetSkipAdd(output_size=(224, 224))  # 🔹 Thêm output_size
model.load_state_dict(torch.load("fastdepth/models/fastdepth_nyu.pt", map_location=device))
model.eval().to(device)

@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")

    # 🟢 Chuyển đổi ảnh thành tensor (chuẩn hóa cho FastDepth)
    transform = torchvision.transforms.Compose([
        torchvision.transforms.Resize((224, 224)),
        torchvision.transforms.ToTensor(),
    ])
    img_tensor = transform(image).unsqueeze(0).to(device)

    # 🟢 Dự đoán Depth Map với FastDepth
    with torch.no_grad():
        depth_map = model(img_tensor).squeeze().cpu().numpy()

    # 🟢 Lật ngược ảnh (nếu cần)
    flipped_depth_map = cv2.flip(depth_map, -1)

    # 🟢 Phân tích đường đi
    command = detect_path(flipped_depth_map)

    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)