|
20 | 20 | DirectoryModel, DirectoryDetailResponse, RemoveDirectoryResponse, RemoveDirectoryRequest, CreateQueryRequest, \ |
21 | 21 | CreateQueryResponse, GeneratorInfo, SearchLogsResponse, QueryLogEntry, \ |
22 | 22 | ServiceStatusResponse, ServiceLogResponse, SearchResponse, SearchRequest, UpdateDirectoryResponse, \ |
23 | | - UpdateDirectoryRequest, GeneratePoolRequest, GeneratePoolResponse, GuideImageData, EmbeddingData |
| 23 | + UpdateDirectoryRequest, GeneratePoolRequest, GeneratePoolResponse, GuideImageData, EmbeddingData, \ |
| 24 | + ComputeEmbeddingsRequest, ComputeEmbeddingsResponse, ImageEmbeddingsResponse |
24 | 25 | from indexing import image_indexing_service |
25 | 26 | from utils import aggregate_rankings, pil_image_to_base64, Timer |
26 | 27 | from version import VERSION as BACKEND_VERSION |
@@ -365,6 +366,58 @@ async def generate_pool(request: GeneratePoolRequest): |
365 | 366 | ) |
366 | 367 |
|
367 | 368 |
|
| 369 | +@app.post("/variance-analysis/compute-embeddings", response_model=ComputeEmbeddingsResponse) |
| 370 | +async def compute_embeddings(request: ComputeEmbeddingsRequest): |
| 371 | + """ |
| 372 | + Compute embeddings for a list of images from file paths. |
| 373 | + Returns embeddings for all available embedders. |
| 374 | + """ |
| 375 | + from PIL import Image as PImage |
| 376 | + |
| 377 | + embedders = embedder_manager.get_image_embedders() |
| 378 | + embedder_names = list(embedders.keys()) |
| 379 | + |
| 380 | + results = [] |
| 381 | + |
| 382 | + for image_path in request.image_paths: |
| 383 | + if not os.path.exists(image_path): |
| 384 | + from monitoring import logger |
| 385 | + logger.warning(f"Image path does not exist: {image_path}") |
| 386 | + continue |
| 387 | + |
| 388 | + try: |
| 389 | + # Load image |
| 390 | + img = PImage.open(image_path).convert("RGB") |
| 391 | + |
| 392 | + # Compute embeddings for all embedders |
| 393 | + embeddings_data = [] |
| 394 | + for embedder_name, embedder in embedders.items(): |
| 395 | + try: |
| 396 | + embedding = embedder.embed(img) |
| 397 | + embeddings_data.append(EmbeddingData( |
| 398 | + embedder_name=embedder_name, |
| 399 | + embedding=embedding.tolist() if hasattr(embedding, 'tolist') else embedding |
| 400 | + )) |
| 401 | + except Exception as e: |
| 402 | + from monitoring import logger |
| 403 | + logger.error(f"Error computing embedding with {embedder_name} for {image_path}: {e}", exc_info=True) |
| 404 | + |
| 405 | + if embeddings_data: |
| 406 | + results.append(ImageEmbeddingsResponse( |
| 407 | + image_path=image_path, |
| 408 | + embeddings=embeddings_data |
| 409 | + )) |
| 410 | + except Exception as e: |
| 411 | + from monitoring import logger |
| 412 | + logger.error(f"Error processing image {image_path}: {e}", exc_info=True) |
| 413 | + continue |
| 414 | + |
| 415 | + return ComputeEmbeddingsResponse( |
| 416 | + results=results, |
| 417 | + embedder_names=embedder_names |
| 418 | + ) |
| 419 | + |
| 420 | + |
368 | 421 | from routes.gallery import router as gallery_router |
369 | 422 |
|
370 | 423 | app.include_router(gallery_router) |
0 commit comments