Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| from PIL import Image | |
| import tempfile | |
| # Production API key | |
| os.environ["GEMINI_API_KEY"] = "AIzaSyCgatP7izHkaBn6im8AfXq0Ufmb0Fr-7dc" | |
| # Import VietMEAgent | |
| try: | |
| from core.viet_meagent import VietMEAgent | |
| agent = VietMEAgent() | |
| DEMO_MODE = False | |
| print("✅ VietMEAgent initialized successfully!") | |
| except Exception as e: | |
| print(f"❌ VietMEAgent initialization failed: {e}") | |
| DEMO_MODE = True | |
| def process_image(image, question): | |
| """Process image and question through VietMEAgent""" | |
| if DEMO_MODE: | |
| return { | |
| "answer": "System initialization failed. Please check API key configuration.", | |
| "explanation": "VietMEAgent could not be initialized. Please ensure GEMINI_API_KEY is set correctly.", | |
| "cultural_objects": ["error"], | |
| "confidence": 0.0 | |
| } | |
| try: | |
| # Save uploaded image temporarily | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp: | |
| image.save(tmp.name) | |
| # Process with VietMEAgent | |
| result = agent.generate_vietnamese_vqa(tmp.name, question) | |
| # Clean up | |
| os.unlink(tmp.name) | |
| if result.get("questions"): | |
| first_q = result["questions"][0] | |
| return { | |
| "answer": first_q.get("answer", "Không có câu trả lời"), | |
| "explanation": first_q.get("explanation", "Không có giải thích"), | |
| "cultural_objects": result.get("cultural_objects", []), | |
| "confidence": first_q.get("confidence", 0.0) | |
| } | |
| else: | |
| return { | |
| "answer": "Không thể xử lý hình ảnh", | |
| "explanation": "Có lỗi xảy ra trong quá trình xử lý", | |
| "cultural_objects": [], | |
| "confidence": 0.0 | |
| } | |
| except Exception as e: | |
| return { | |
| "answer": f"Lỗi: {str(e)}", | |
| "explanation": "Vui lòng thử lại hoặc kiểm tra kết nối mạng", | |
| "cultural_objects": [], | |
| "confidence": 0.0 | |
| } | |
| def main_interface(image, question): | |
| """Main Gradio interface""" | |
| if not question.strip(): | |
| question = "Đây là gì?" | |
| result = process_image(image, question) | |
| return ( | |
| result["answer"], | |
| result["explanation"], | |
| f"Đối tượng văn hóa: {', '.join(result['cultural_objects']) if result['cultural_objects'] else 'Không phát hiện'}", | |
| f"Độ tin cậy: {result['confidence']:.2f}" | |
| ) | |
| # Create Gradio interface | |
| with gr.Blocks( | |
| title="🏛️ VietMEAgent - Vietnamese Cultural VQA", | |
| theme=gr.themes.Soft(), | |
| css=""" | |
| .gradio-container { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| } | |
| .gr-button-primary { | |
| background: linear-gradient(45deg, #ff6b6b, #ffa500); | |
| border: none; | |
| } | |
| """ | |
| ) as demo: | |
| gr.Markdown(""" | |
| # 🏛️ VietMEAgent: Vietnamese Multimodal Explanation Agent | |
| **🇻🇳 Hệ thống AI trả lời câu hỏi về hình ảnh văn hóa Việt Nam** | |
| Được phát triển dựa trên nghiên cứu **FS-MEVQA (ACM MM 2024)** với khả năng: | |
| - 🔍 Phân tích hình ảnh văn hóa Việt Nam | |
| - 💬 Trả lời câu hỏi bằng tiếng Việt | |
| - 🎯 Giải thích có bối cảnh văn hóa | |
| - 🏛️ Nhận diện 50+ đối tượng văn hóa truyền thống | |
| --- | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 📤 Input") | |
| image_input = gr.Image( | |
| type="pil", | |
| label="🖼️ Hình ảnh văn hóa Việt Nam", | |
| height=300 | |
| ) | |
| question_input = gr.Textbox( | |
| label="❓ Câu hỏi (Tiếng Việt)", | |
| placeholder="Đây là gì? / Món ăn này có ý nghĩa gì trong văn hóa Việt Nam?", | |
| value="Đây là gì?", | |
| lines=2 | |
| ) | |
| submit_btn = gr.Button("🔍 Phân tích Cultural VQA", variant="primary", size="lg") | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 📊 Results") | |
| answer_output = gr.Textbox( | |
| label="🎯 Câu trả lời", | |
| lines=3, | |
| interactive=False | |
| ) | |
| explanation_output = gr.Textbox( | |
| label="📝 Giải thích văn hóa", | |
| lines=5, | |
| interactive=False | |
| ) | |
| cultural_objects_output = gr.Textbox( | |
| label="🏛️ Đối tượng văn hóa phát hiện", | |
| lines=2, | |
| interactive=False | |
| ) | |
| confidence_output = gr.Textbox( | |
| label="📊 Độ tin cậy", | |
| lines=1, | |
| interactive=False | |
| ) | |
| submit_btn.click( | |
| fn=main_interface, | |
| inputs=[image_input, question_input], | |
| outputs=[answer_output, explanation_output, cultural_objects_output, confidence_output] | |
| ) | |
| with gr.Row(): | |
| gr.Examples( | |
| examples=[ | |
| ["data_sample/images/am_thuc/000040.jpg", "Món ăn này có nguồn gốc từ đâu?"], | |
| ["data_sample/images/kien_truc/000042.jpg", "Kiến trúc này thể hiện phong cách gì?"], | |
| ["data_sample/images/phong_canh/000040.jpg", "Đây là danh lam thắng cảnh nào của Việt Nam?"] | |
| ], | |
| inputs=[image_input, question_input] | |
| ) | |
| gr.Markdown(""" | |
| ## 📚 Categories được hỗ trợ: | |
| | 🍜 **Ẩm thực** | 🏛️ **Kiến trúc** | 👘 **Trang phục** | 🎭 **Lễ hội** | | |
| |---|---|---|---| | |
| | Phở, bánh mì, chè | Chùa, đình, nhà sàn | Áo dài, nón lá | Tết, Trung thu | | |
| | **🎨 Thủ công** | **🎵 Nhạc cụ** | **🏞️ Phong cảnh** | **🎪 Dân gian** | | |
| | Gốm sứ, thêu | Đàn bầu, trống | Vịnh Hạ Long | Múa lân, rối nước | | |
| ## 🔧 Technical Details: | |
| - **Models**: CLIP, BLIP-VQA, Gemini, EasyOCR | |
| - **Languages**: Vietnamese + English | |
| - **Architecture**: Few-shot multimodal reasoning | |
| - **Cultural KB**: 459+ Vietnamese cultural objects | |
| --- | |
| 📖 **Research**: Based on FS-MEVQA paper (ACM MM 2024) | |
| 👨💻 **Developer**: [@Dangindev](https://huggingface.co/Dangindev) | |
| 🔗 **GitHub**: Coming soon... | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=True | |
| ) |