import gradio as gr import base64 import io from PIL import Image as PILImage from models.data_manager import DataManager from models.image_processor import ( image_search_performers, ) class WebInterface: def __init__(self, data_manager: DataManager, default_threshold: float = 0.5): """ Initialize the web interface. Parameters: data_manager: DataManager instance default_threshold: Default confidence threshold """ self.data_manager = data_manager self.default_threshold = default_threshold def multiple_image_search(self, img): """Wrapper for the multiple image search function""" try: # Use default values: threshold=0.5, results=4 return image_search_performers(img, self.data_manager, 0.5, 4) except ValueError as e: if "No faces found" in str(e): return {"error": "No faces detected in the uploaded image. Please try uploading an image with visible faces."} else: raise e def format_results_for_visual_display(self, json_results): """ Convert JSON results to visual components for better UX Parameters: json_results: List of face detection results from image_search_performers Returns: tuple: (gallery_images, html_content) """ if not json_results: return [], "
No faces detected or no matches found.
" # Handle error case if isinstance(json_results, dict) and "error" in json_results: error_html = f"""{json_results['error']}
Detection Confidence: {face_confidence:.1%}
Matches Found: {len(performers)}
No performer matches found for this face.
') html_parts.append('{str(e)}
Upload an image and click search to see results.
" ) def visual_search_wrapper(img): """Wrapper that returns only visual components""" json_results, gallery_images, html_content = self.multiple_image_search_with_visual(img) return html_content search_btn.click( fn=visual_search_wrapper, inputs=[img_input], outputs=[performer_info], api_name="multiple_image_search_with_visual" ) return interface def launch(self, server_name="0.0.0.0", server_port=7860, share=True): """Launch the web interface""" with gr.Blocks( css=""" .gradio-container { background-color: #1e1e1e !important; color: #d4d4d4 !important; } .dark { --background-fill-primary: #2d2d2d; --background-fill-secondary: #3c3c3c; --border-color-primary: #404040; --block-title-text-color: #ffffff; --body-text-color: #d4d4d4; } """ ) as demo: with gr.Tabs(): with gr.TabItem("Visual Search"): self._create_visual_search_interface() demo.queue().launch(server_name=server_name, server_port=server_port, share=share, ssr_mode=False)