53 lines
2.3 KiB
Python
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)}") |