File size: 1,571 Bytes
11b11b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import APIRouter, UploadFile, File, HTTPException, status
from http import HTTPStatus
import utility.file_handler as fh
import utility.Mongo_database as similar_image
import utility.CLIP_utils as embd
import utility.Gemini_utils as gemini

router = APIRouter()

ALLOWED_IMAGE_TYPES = ["image/jpeg", "image/png", "image/webp", "image/jpg"]

@router.post("/api/match")
async def match_image(image: UploadFile = File(...)):
    # Validate the uploaded file is an image
    if image.content_type not in ALLOWED_IMAGE_TYPES:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=f"Invalid file type: {image.content_type}. Only image files are allowed."
        )

    PIL_image = await fh.get_file(file=image)

    try:
        metadata = await gemini.extract_metadata_with_gemini(PIL_image)
        embedding = await embd.get_clip_embedding(PIL_image)
        cosine_similarity_report = await similar_image.get_similar_products(embedding)

        return {
            "status_code": HTTPStatus.OK,
            "Image metadata": {"metadata":metadata, "embedding": embedding},
            "Result": {"Content": cosine_similarity_report["similar_products"], "Filter_brand":cosine_similarity_report["filter_brand"]},
            "message": "Image processed and metadata extracted successfully"
        }

    except Exception as e:
        raise HTTPException(
            status_code=500,
            detail=f"An error occurred while processing the image: {str(e)}"
        )