import gradio as gr from io import BytesIO from PIL import Image # Attempt to import DeepFace and transformers. If unavailable, show helpful error to user. try: from deepface import DeepFace deepface_available = True except Exception as e: deepface_available = False deepface_error = str(e) try: from transformers import pipeline llm_available = True except Exception as e: llm_available = False llm_error = str(e) # Choose a small, CPU-friendly text model as default so the Space can run without GPU LLM_MODEL = "google/flan-t5-small" def analyze_face(image, consent): if not consent: return "Zəhmət olmasa şəkili analiz etmədən əvvəl razılıq verin. (I agree)" if image is None: return "Şəkil yükləmədiniz." # Convert to PIL Image reliably if isinstance(image, bytes): img = Image.open(BytesIO(image)).convert('RGB') elif isinstance(image, Image.Image): img = image.convert('RGB') else: # Gradio may pass numpy array img = Image.fromarray(image).convert('RGB') analysis_summary = "" if deepface_available: try: # DeepFace.analyze can accept numpy array or path. It returns a dict with emotion, age, gender, etc. df_res = DeepFace.analyze(img_path = img, actions=['age','gender','emotion']) analysis_summary += f"---Üz Analizi Nəticələri---\nAge: {df_res.get('age', 'N/A')}\nGender: {df_res.get('gender', 'N/A')}\nEmotions: {df_res.get('emotion', {})}\n\n" except Exception as e: analysis_summary += f"DeepFace analizində xəta: {e}\n\n" else: analysis_summary += "DeepFace kitabxanası mövcud deyil. Space-də DeepFace quraşdırılmasa server sadə təhlil edəcək.\n\n" # Prepare prompt for LLM prompt = f\"\"\"Aşağıdakı üz analizi məlumatlarına əsasən bu şəxsin xasiyyətini, emosional vəziyyətini və onunla necə davranmalı olduğunu qısa və aydın şəkildə yaz. Məlumatlar: {analysis_summary} Yekun təkliflər qısa və praktik olsun (3-5 bənd).\"\"\" if llm_available: try: gen = pipeline('text2text-generation', model=LLM_MODEL) llm_out = gen(prompt, max_length=256, do_sample=False)[0]['generated_text'] result = f"{analysis_summary}\n---AI Xasiyyət & Davranış Tövsiyəsi---\n{llm_out}" return result except Exception as e: return f"{analysis_summary}\nLLM işləmədə xəta: {e}\n\nPrompt:\n{prompt}" else: # Fallback simple rule-based output (if transformers not available) fallback = "Fallback analiz: Emosiyalara və yaşa əsasən bu şəxs sakit və nəzakətli görsənir. Onunla danışıqda nəzakətli və açıq suallar verin. Zarafatla başlamayın. Empatiya göstərmək faydalıdır." return f"{analysis_summary}\n---Fallback Xasiyyət & Davranış Tövsiyəsi---\n{fallback}" title = "Pulsuz AI Üz Xasiyyət Analizörü" description = """ Şəkili yükləyin və bu tətbiq DeepFace ilə üz analizi aparacaq, sonra sadə LLM (FLAN-T5-small) ilə xasiyyət və necə davranmalı olduğuna dair tövsiyələr verəcək. **Əhəmiyyətli:** Şəxsin icazəsi olmadan şəkilləri analiz etməyin. """ with gr.Blocks() as demo: gr.Markdown(f"# {title}\n{description}") with gr.Row(): with gr.Column(scale=1): img = gr.Image(type="pil", label="Şəkil yüklə") consent = gr.Checkbox(label="Mən bu şəxsin şəkilini analiz etmək üçün icazəm var (I agree)", value=False) submit = gr.Button("Analiz et") with gr.Column(scale=2): out = gr.Textbox(label="Nəticə", lines=18) submit.click(fn=analyze_face, inputs=[img, consent], outputs=[out]) if __name__ == '__main__': demo.launch()