import io import os from fastapi import FastAPI, UploadFile, File, HTTPException from fastapi.responses import JSONResponse from PIL import Image # Импортируем твои существующие загрузчики (они теперь работают только на бэкенде) from data_loader import load_music_engine, load_image_processor app = FastAPI(title="EmoM Inference API", version="1.0.0") # Глобальный кэш для удержания моделей в памяти ml_context = { "image_processor": None, "music_matcher": None } @app.on_event("startup") async def startup_event(): print("Инициализация нейросетевого ядра EmoM...") ml_context["image_processor"] = load_image_processor() ml_context["music_matcher"] = load_music_engine() if not ml_context["image_processor"] or not ml_context["music_matcher"]: raise RuntimeError("Отказ системы: Артефакты моделей не найдены.") print("Вычислительный конвейер готов к работе.") @app.post("/analyze") async def analyze_image_endpoint(file: UploadFile = File(...)): """ Принимает изображение, прогоняет через ResNet и возвращает треки из DEAM. """ try: # 1. Чтение бинарных данных из запроса image_bytes = await file.read() image = Image.open(io.BytesIO(image_bytes)).convert("RGB") # 2. Инференс (ВНИМАНИЕ: здесь используй реальные названия методов из своих классов!) # Предположим, твой процессор выдает координаты V/A v_a_coords = ml_context["image_processor"].extract_va(image) # 3. Поиск треков в базе matched_tracks = ml_context["music_matcher"].find_tracks(v_a_coords) # 4. Формирование ответа return JSONResponse(content={ "status": "success", "valence_arousal": v_a_coords, "tracks": matched_tracks }) except Exception as e: raise HTTPException(status_code=500, detail=f"Ошибка инференса: {str(e)}")