""" Frame 0 Laboratory for MIA - Main Gradio Interface FLUX Prompt Optimizer with clean, professional interface """ import gradio as gr import logging import warnings import os from typing import Tuple from config import APP_CONFIG, ENVIRONMENT from processor import process_image_simple, flux_optimizer from utils import setup_logging, clean_memory # Configure environment warnings.filterwarnings("ignore", category=FutureWarning) warnings.filterwarnings("ignore", category=UserWarning) os.environ["TOKENIZERS_PARALLELISM"] = "false" # Setup logging setup_logging(ENVIRONMENT["log_level"]) logger = logging.getLogger(__name__) def process_image_interface(image) -> Tuple[str, str, str]: """ Main interface function for image processing Args: image: Input image from Gradio interface Returns: Tuple of (prompt, analysis_report, score_html) """ try: if image is None: return ( "Please upload an image to analyze", "No image provided for analysis.", '
--
Quality Score
' ) logger.info("Processing image through interface") prompt, report, score_html = process_image_simple(image) return prompt, report, score_html except Exception as e: logger.error(f"Interface processing error: {e}", exc_info=True) error_msg = f"Processing failed: {str(e)}" return ( "❌ Processing failed", f"**Error:** {error_msg}\n\nPlease try again with a different image.", '
0
Error
' ) def clear_interface() -> Tuple[str, str, str]: """Clear all interface outputs and free memory""" clean_memory() logger.info("Interface cleared") return ( "", "", '
--
Quality Score
' ) def get_stats_info() -> str: """Get current processing statistics""" try: stats = flux_optimizer.get_stats() stats_text = f"""**Processing Statistics:** • **Total Images:** {stats['total_processed']} • **Successful:** {stats['successful_analyses']} • **Failed:** {stats['failed_analyses']} • **Success Rate:** {stats['success_rate']:.1%} • **Average Time:** {stats['average_processing_time']:.1f}s • **Device:** {stats['device_info']['device'].upper()} """ return stats_text except Exception as e: logger.error(f"Stats retrieval error: {e}") return "Statistics unavailable" def create_interface(): """Create the main Gradio interface""" # Simplified CSS based on original css = """ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap'); .gradio-container { max-width: 1600px !important; margin: 0 auto !important; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important; background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%) !important; } /* Text visibility fixes */ .markdown-text, .markdown-text *, .prose, .prose *, .gr-markdown, .gr-markdown *, div[class*="markdown"], div[class*="markdown"] * { color: #1f2937 !important; } .markdown-text h1, .markdown-text h2, .markdown-text h3, .prose h1, .prose h2, .prose h3, .gr-markdown h1, .gr-markdown h2, .gr-markdown h3 { color: #111827 !important; font-weight: 700 !important; } .markdown-text p, .markdown-text li, .markdown-text ul, .markdown-text ol, .prose p, .prose li, .prose ul, .prose ol, .gr-markdown p, .gr-markdown li, .gr-markdown ul, .gr-markdown ol { color: #374151 !important; } .markdown-text strong, .prose strong, .gr-markdown strong { color: #111827 !important; font-weight: 700 !important; } /* Header styling */ .main-header { text-align: center; padding: 3rem 0 4rem 0; background: linear-gradient(135deg, #0c0a09 0%, #1c1917 30%, #292524 60%, #44403c 100%); color: white; margin: -2rem -2rem 3rem -2rem; border-radius: 0 0 32px 32px; box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.25); position: relative; overflow: hidden; } .main-header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 51, 234, 0.1) 50%, rgba(236, 72, 153, 0.1) 100%); z-index: 1; } .main-title { font-size: 4rem !important; font-weight: 900 !important; margin: 0 0 1rem 0 !important; letter-spacing: -0.05em !important; background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 25%, #8b5cf6 50%, #a855f7 75%, #ec4899 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; position: relative; z-index: 2; } .subtitle { font-size: 1.5rem !important; font-weight: 500 !important; opacity: 0.95 !important; margin: 0 !important; position: relative; z-index: 2; color: #ffffff !important; } .prompt-output { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace !important; font-size: 15px !important; line-height: 1.8 !important; background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%) !important; border: 2px solid #e2e8f0 !important; border-radius: 20px !important; padding: 2.5rem !important; box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.1) !important; transition: all 0.3s ease !important; color: #1f2937 !important; } .prompt-output:hover { box-shadow: 0 25px 60px -5px rgba(0, 0, 0, 0.15) !important; transform: translateY(-2px) !important; } """ with gr.Blocks( theme=gr.themes.Soft(), title="Frame 0 Laboratory for MIA", css=css ) as interface: gr.HTML("""
Frame 0 Laboratory for MIA
Advanced Image Analysis & FLUX Prompt Optimization
""") with gr.Row(): with gr.Column(scale=1): gr.Markdown("## Image Analysis") image_input = gr.Image( label="Upload image for analysis", type="pil", height=500 ) analyze_btn = gr.Button( "🔍 Analyze Image", variant="primary", size="lg" ) gr.Markdown(""" ### How it works: **1. Image Analysis:** Advanced AI models analyze your image to understand content, composition, and style. **2. FLUX Optimization:** Applies proven rules for FLUX image generation including camera settings, lighting, and technical parameters. **3. Quality Scoring:** Evaluates the optimized prompt across multiple dimensions for best results. **Supported formats:** JPG, PNG, WebP up to 1024px """) # Statistics with gr.Accordion("📊 Processing Stats", open=False): stats_output = gr.Markdown(value="No processing completed yet.") refresh_stats_btn = gr.Button("Refresh Stats", size="sm") with gr.Column(scale=1): gr.Markdown("## Results") score_output = gr.HTML( value='
--
Quality Score
' ) prompt_output = gr.Textbox( label="🎯 Optimized FLUX Prompt", placeholder="Upload an image to generate an optimized prompt...", lines=12, max_lines=20, show_copy_button=True ) info_output = gr.Markdown(value="") clear_btn = gr.Button("🗑️ Clear Analysis", size="sm") # Event handlers analyze_btn.click( fn=process_image_interface, inputs=[image_input], outputs=[prompt_output, info_output, score_output] ) clear_btn.click( fn=clear_interface, outputs=[prompt_output, info_output, score_output] ) refresh_stats_btn.click( fn=get_stats_info, outputs=stats_output ) gr.Markdown(""" --- ### Frame 0 Laboratory for MIA This system uses state-of-the-art vision-language models to analyze images and generate optimized prompts for FLUX image generation. The system applies proven optimization rules including camera configurations, lighting setups, and technical parameters for best results. **Frame 0 Laboratory for MIA** • Advanced AI Research & Development """) return interface def main(): """Main application entry point""" logger.info("Starting Frame 0 Laboratory for MIA") # Create and launch interface demo = create_interface() # Launch with proper configuration demo.launch( server_name="0.0.0.0", server_port=7860, share=True, show_error=True ) if __name__ == "__main__": main()