MenuVision-AI / app.py
Wall06's picture
Update app.py
882f4fa verified
import gradio as gr
import easyocr
import numpy as np
from PIL import Image
import os
import folium
from huggingface_hub import InferenceClient
# --- CONFIGURATION ---
# Replace with your actual token if you don't want to paste it in the UI every time
HF_TOKEN = "hf_..."
# Initialize Tools
reader = easyocr.Reader(['en'])
# --- LOGIC 1: AI HEALTH ANALYZER & IMAGE GENERATOR ---
def analyze_food(food_name, language, api_key):
"""
Generates a real-world image AND detailed health analysis in the selected language.
"""
if not food_name:
return None, "Please select a food item.", ""
token = api_key if api_key else HF_TOKEN
# Check if token is present
if not token or token.startswith("hf_..."):
return None, "Error: Please enter a valid Hugging Face Token in the box above."
client = InferenceClient(token=token)
# 1. Generate Image (Visual)
img_prompt = (
f"Professional food photography of {food_name}, "
"8k resolution, hyperrealistic, cinematic lighting, "
"macro details, steam rising, delicious, gourmet plating, "
"unreal engine 5 render style, depth of field."
)
generated_image = None
try:
print(f"Generating image for {food_name}...")
generated_image = client.text_to_image(
prompt=img_prompt,
model="stabilityai/stable-diffusion-xl-base-1.0",
negative_prompt="cartoon, drawing, anime, text, blurry, low quality",
width=1024, height=1024
)
except Exception as e:
print(f"Image Error: {e}")
# 2. Generate Health Info (Text) in Selected Language
text_prompt = (
f"Act as a nutritionist. Analyze the food item '{food_name}'. "
f"Provide the response in {language} language. "
"Format the response strictly with two sections:\n"
"1. Health Benefits\n"
"2. Potential Consequences or Cons (e.g., high calories, allergies).\n"
"Keep it concise and bulleted."
)
health_info = ""
try:
response = client.text_generation(
prompt=text_prompt,
model="tiiuae/falcon-7b-instruct", # Using a fast text model
max_new_tokens=400,
temperature=0.7
)
health_info = response
except Exception as e:
health_info = f"Could not retrieve health data: {e}"
return generated_image, health_info
# --- LOGIC 2: INTERACTIVE MAP (SCROLLABLE) ---
def get_map_html(location_name="Bahawalpur"):
"""
Creates an interactive HTML map centered on a location.
"""
# Default coordinates (Bahawalpur)
start_coords = [29.3544, 71.6911]
# Simple coordinate lookup for demo (You can add more cities)
loc_lower = location_name.lower()
if "islamabad" in loc_lower:
start_coords = [33.6844, 73.0479]
elif "lahore" in loc_lower:
start_coords = [31.5497, 74.3436]
elif "karachi" in loc_lower:
start_coords = [24.8607, 67.0011]
elif "multan" in loc_lower:
start_coords = [30.1575, 71.5249]
# Create Map
m = folium.Map(location=start_coords, zoom_start=13)
# Add Marker
folium.Marker(
start_coords,
popup=f"<i>{location_name}</i>",
tooltip="Click me!"
).add_to(m)
return m._repr_html_()
# --- LOGIC 3: MENU SCANNING ---
def scan_menu(image):
if image is None:
return "Please upload an image.", []
try:
results = reader.readtext(image)
# Filter for food-like text (longer than 3 chars, not numbers)
detected_items = [res[1] for res in results if len(res[1]) > 3 and not res[1].isdigit()]
status = f"βœ… Found {len(detected_items)} items!"
return status, gr.update(choices=detected_items, value=detected_items[0] if detected_items else None)
except Exception as e:
return f"Error scanning: {str(e)}", []
# --- UI LAYOUT ---
with gr.Blocks(theme=gr.themes.Soft(primary_hue="orange", secondary_hue="gray")) as demo:
gr.Markdown("# πŸ₯— MenuVision AI: Health & Visual Analyzer")
with gr.Row():
api_input = gr.Textbox(label="Hugging Face Token (Required)", type="password", placeholder="Paste your Access Token here")
language_drop = gr.Dropdown(label="🌐 Select Language", choices=["English", "Urdu", "French", "Spanish", "Arabic"], value="English")
with gr.Tabs():
# --- TAB 1: SCAN & HEALTH ANALYSIS ---
with gr.TabItem("πŸ“Έ Scan & Analyze"):
with gr.Row():
# LEFT COLUMN: INPUT
with gr.Column(scale=1):
menu_input = gr.Image(type="numpy", label="1. Upload Menu Photo")
scan_btn = gr.Button("πŸ” Scan Text", variant="secondary")
gr.Markdown("---")
status_output = gr.Textbox(label="Status", interactive=False)
food_dropdown = gr.Dropdown(label="2. Select Detected Food", choices=[])
analyze_btn = gr.Button("✨ Analyze Health & Generate Image", variant="primary")
# RIGHT COLUMN: OUTPUT
with gr.Column(scale=2):
# 1. Real World Image
result_image = gr.Image(label="Real-World Representation", type="pil", height=400)
# 2. Health Columns
gr.Markdown("### 🩺 Nutritional Analysis")
health_output = gr.Textbox(label="Benefits & Consequences", lines=10)
# --- TAB 2: INTERACTIVE MAPS ---
with gr.TabItem("πŸ—ΊοΈ Interactive Map"):
with gr.Row():
place_search = gr.Textbox(label="Search Location (e.g., Islamabad)", placeholder="Type a city...")
map_btn = gr.Button("Update Map")
# This HTML component holds the interactive scrollable map
map_html = gr.HTML(value=get_map_html(), label="Scrollable Map")
# --- TAB 3: ABOUT ME ---
with gr.TabItem("πŸ‘¨β€πŸ’» About Developer"):
with gr.Row():
with gr.Column(scale=1):
# FIXED LINE: Removed 'show_download_button' to fix your error
gr.Image(
value="https://cdn-icons-png.flaticon.com/512/4140/4140048.png",
width=200,
show_label=False,
interactive=False
)
with gr.Column(scale=3):
gr.Markdown("""
### πŸ‘‹ Hi, I'm Abdullah!
**Computer Engineering Student | AI Enthusiast | Web Developer**
I am currently an undergraduate student at **COMSATS University Islamabad**, specializing in Computer Engineering.
I have a passion for merging **Embedded Systems** with **Generative AI** to create real-world solutions.
* **Role:** Intern Web Developer at MyK Global Forwarding.
* **Focus:** TinyML, IoT, and GenAI Applications.
* **Location:** Bahawalpur / Islamabad.
**About MenuVision AI:**
This project was designed to help people make better dietary choices by visualizing food from plain text menus and understanding the health implications immediately.
""")
# --- EVENT HANDLERS ---
# 1. Scan Button
scan_btn.click(
fn=scan_menu,
inputs=menu_input,
outputs=[status_output, food_dropdown]
)
# 2. Analyze Button (Image + Health Info)
analyze_btn.click(
fn=analyze_food,
inputs=[food_dropdown, language_drop, api_input],
outputs=[result_image, health_output]
)
# 3. Map Update
map_btn.click(
fn=get_map_html,
inputs=place_search,
outputs=map_html
)
# Launch App
demo.launch()