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