MODLI commited on
Commit
5cf61c7
·
verified ·
1 Parent(s): 7967f9c

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, File, UploadFile
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from PIL import Image
4
+ import torch
5
+ from transformers import AutoProcessor, AutoModel
6
+ import io
7
+ import colorthief
8
+
9
+ # --- Charge le modèle Marqo FashionSigLIP ---
10
+ print("⚠️ Démarrage du chargement du modèle Marqo-FashionSigLIP... (cela peut prendre 1-2 minutes)")
11
+ # 🎯 MODEL NAME CHANGE ICI - C'EST LE NOUVEAU MODELE
12
+ model_name = "Marqo/Marqo-FashionSigLIP-Classification"
13
+ processor = AutoProcessor.from_pretrained(model_name)
14
+ model = AutoModel.from_pretrained(model_name)
15
+ print("✅ Modèle Marqo-FashionSigLIP chargé avec succès !")
16
+ # ---------------------------------------------------------
17
+
18
+ app = FastAPI(title="Fashion Detection API")
19
+
20
+ # Middleware pour autoriser les appels depuis votre application Lovable
21
+ app.add_middleware(
22
+ CORSMiddleware,
23
+ allow_origins=["*"], # Pour le développement. Pour la production, remplacez par l'URL de Lovable.
24
+ allow_credentials=True,
25
+ allow_methods=["*"],
26
+ allow_headers=["*"],
27
+ )
28
+
29
+ # Liste de catégories possibles en Anglais. Le modèle comprend mieux l'Anglais.
30
+ # MODIFIEZ CETTE LISTE PERSONNALISEE SELON VOS BESOINS !
31
+ categories = [
32
+ "a t-shirt", "a dress", "jeans", "a shirt", "a skirt",
33
+ "sneakers", "a bag", "a jacket", "a pair of shorts", "a sweater",
34
+ "a coat", "high heels", "a scarf", "sunglasses", "a hat"
35
+ ]
36
+
37
+ @app.post("/analyze")
38
+ async def analyze_image(file: UploadFile = File(...)):
39
+ # 1. Lire l'image envoyée par l'utilisateur
40
+ contents = await file.read()
41
+ image = Image.open(io.BytesIO(contents)).convert("RGB")
42
+
43
+ # 2. ANALYSE AVEC LE MODÈLE MARQO FASHIONSIGLIP
44
+ try:
45
+ # Prépare l'image et transforme les catégories en texte
46
+ inputs = processor(images=image, text=categories, return_tensors="pt", padding=True, truncation=True)
47
+
48
+ # Passe through the model
49
+ with torch.no_grad():
50
+ outputs = model(**inputs)
51
+
52
+ # Récupère les scores de similarité entre l'image et chaque catégorie de texte
53
+ logits_per_image = outputs.logits_per_image # Shape: [1, n_categories]
54
+ probs = logits_per_image.softmax(dim=1) # Convertit les scores en probabilités
55
+
56
+ # Trouve la catégorie avec la probabilité la plus élevée
57
+ predicted_class_idx = probs.argmax(dim=1).item()
58
+ category_name = categories[predicted_class_idx]
59
+ confidence_score = probs[0][predicted_class_idx].item()
60
+
61
+ except Exception as e:
62
+ # En cas d'erreur avec le gros modèle, on retourne une erreur
63
+ return {"error": f"Erreur lors de l'analyse AI: {str(e)}"}
64
+
65
+ # 3. ANALYSE DE LA COULEUR (avec ColorThief)
66
+ try:
67
+ # On sauvegarde l'image en mémoire pour ColorThief
68
+ img_buffer = io.BytesIO()
69
+ image.save(img_buffer, format="PNG")
70
+ img_buffer.seek(0)
71
+ # Extrait la couleur dominante
72
+ color_thief = colorthief.ColorThief(img_buffer)
73
+ dominant_color = color_thief.get_color(quality=1)
74
+ # Convertit le RGB (ex: (255, 0, 0)) en code hexadécimal (ex: #ff0000)
75
+ hex_color = '#%02x%02x%02x' % dominant_color
76
+ except Exception as e:
77
+ hex_color = "#000000" # Couleur noire par défault en cas d'erreur
78
+
79
+ # 4. Renvoie le résultat à Lovable
80
+ return {
81
+ "category": category_name,
82
+ "color_hex": hex_color,
83
+ "confidence": round(confidence_score, 4) # Arrondit le score de confiance à 4 décimales
84
+ }
85
+
86
+ # Cette partie est importante pour Hugging Face Spaces
87
+ if __name__ == "__main__":
88
+ import uvicorn
89
+ uvicorn.run(app, host="0.0.0.0", port=7860)