detectionotfit / app.py
MODLI's picture
Update app.py
42ebc82 verified
import gradio as gr
from transformers import pipeline
from PIL import Image
import numpy as np
# Catégories de vêtements bien définies
FASHION_CATEGORIES = [
"t-shirt", "button-down shirt", "polo shirt",
"sweatshirt", "hoodie", "sweater",
"jacket", "coat", "blazer",
"dress", "long dress", "short dress",
"skirt", "long skirt", "short skirt",
"jeans", "pants", "shorts", "leggings",
"sneakers", "boots", "heels", "sandals"
]
print("🔧 Loading classification model...")
# Modèle principal pour l'analyse globale
class_pipe = pipeline(
"zero-shot-image-classification",
model="openai/clip-vit-base-patch32"
)
# Modèle de secours pour confirmation
backup_pipe = pipeline(
"image-classification",
model="google/vit-base-patch16-224"
)
print("✅ Models loaded successfully!")
def analyze_complete_image(image):
"""Analyse l'image ENTIÈRE sans segmentation"""
try:
if image is None:
return "❌ Please upload an image first", None
# Conversion en PIL Image si nécessaire
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Réduction de taille pour de meilleures performances
image = image.resize((512, 512))
# 🔥 ANALYSE PRINCIPALE - Image entière
predictions = class_pipe(
image,
candidate_labels=FASHION_CATEGORIES,
hypothesis_template="a complete photo of {}",
multi_label=False
)
# 🔥 ANALYSE DE CONFIRMATION avec modèle secondaire
backup_preds = backup_pipe(image)
# Filtrage des résultats peu confidentiels
confident_predictions = [
p for p in predictions
if p['score'] > 0.15 # Seuil de confiance augmenté
]
if not confident_predictions:
return "❌ No confident prediction. Try a clearer image.", image
# Formatage des résultats
result_text = "🎯 **Fashion Analysis Results:**\n\n"
result_text += "**Main predictions:**\n"
for i, pred in enumerate(confident_predictions[:3]):
result_text += f"{i+1}. **{pred['label']}**: {pred['score']*100:.1f}%\n"
# Ajouter la prédiction du modèle de secours
if backup_preds:
result_text += f"\n**Secondary model suggests**: {backup_preds[0]['label']}\n"
result_text += f"**Confidence**: {backup_preds[0]['score']*100:.1f}%"
# Conseils basés sur la prédiction
top_pred = confident_predictions[0]['label']
result_text += f"\n\n💡 **Tip**: For better accuracy, make sure the {top_pred} is clearly visible and centered."
return result_text, image
except Exception as e:
return f"❌ Error: {str(e)}", None
# Interface optimisée
with gr.Blocks(
title="Fashion AI - Complete Image Analysis",
theme=gr.themes.Soft(),
css="""
.gradio-container { max-width: 900px; margin: auto; }
.header { text-align: center; margin-bottom: 20px; }
"""
) as demo:
gr.Markdown("""
<div class='header'>
<h1>👗 Fashion AI - Complete Image Analysis</h1>
<p>Analyzes the ENTIRE image without cropping or segmentation</p>
</div>
""")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 📤 Upload Image")
image_input = gr.Image(
type="pil",
label="Upload Complete Image",
height=300
)
analyze_btn = gr.Button(
"🔍 Analyze Complete Image",
variant="primary",
size="lg"
)
with gr.Column(scale=1):
gr.Markdown("### 📊 Analysis Results")
output_text = gr.Markdown(
label="Results",
show_label=False
)
output_image = gr.Image(
label="Original Image (for reference)",
interactive=False,
height=300
)
# Section d'instructions
with gr.Row():
with gr.Column():
gr.Markdown("""
### 💡 Best Practices:
- ✅ **Full garment visible** - don't crop
- ✅ **Good lighting** - no shadows
- ✅ **Neutral background** - less distraction
- ✅ **Single item** - one piece per photo
- ✅ **Clear view** - front angle preferred
""")
# Section d'exemples
with gr.Row():
gr.Markdown("""
### 🎯 Examples of good images:
- Full t-shirt visible on plain background
- Complete dress without cropping
- Entire pair of jeans clearly visible
""")
# Événements
analyze_btn.click(
fn=analyze_complete_image,
inputs=image_input,
outputs=[output_text, output_image]
)
image_input.upload(
fn=analyze_complete_image,
inputs=image_input,
outputs=[output_text, output_image]
)
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)