Files
Thesis/src/api.py
T
2026-06-02 22:39:11 +00:00

53 lines
2.3 KiB
Python

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