Projectt123's picture
Update app.py
cd4b2c9 verified
Raw
History Blame Contribute Delete
3.57 kB
import gradio as gr
from transformers import BlipProcessor, BlipForConditionalGeneration, MarianMTModel, MarianTokenizer
from PIL import Image
import torch
import random
import datetime
# Load translation model
translator_model_ar = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-ar")
translator_tokenizer_ar = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-ar")
# Load BLIP model (fine-tuned)
model_path = "Projectt123/MuniVis"
processor_en = BlipProcessor.from_pretrained(model_path)
model_en = BlipForConditionalGeneration.from_pretrained(model_path)
model_en.eval()
# Function to describe image
@torch.no_grad()
def describe_image(image, language):
pil = image if isinstance(image, Image.Image) else Image.fromarray(image)
# وصف بالإنجليزية
inputs = processor_en(pil, return_tensors="pt")
out_ids = model_en.generate(**inputs)
en_desc = processor_en.decode(out_ids[0], skip_special_tokens=True)
# الترجمة إذا اللغة عربية
if str(language).lower().startswith(("ar", "arabic")) or language == "العربية":
inputs_ar = translator_tokenizer_ar(en_desc, return_tensors="pt")
ar_tokens = translator_model_ar.generate(**inputs_ar)
ar_desc = translator_tokenizer_ar.decode(ar_tokens[0], skip_special_tokens=True)
return ar_desc
else:
return en_desc
ASIR_BBOX = {
"lat_min": 17.0, "lat_max": 20.0,
"lon_min": 41.5, "lon_max": 44.0,
}
def random_point_in_bbox(bbox):
lat = random.uniform(bbox["lat_min"], bbox["lat_max"])
lon = random.uniform(bbox["lon_min"], bbox["lon_max"])
return round(lat, 6), round(lon, 6)
def render_html(caption_text, lat, lon, language="English"):
now = datetime.datetime.now()
dt_str = now.strftime("%d %B %Y - %I:%M %p")
is_ar = str(language).lower().startswith(("ar", "arabic")) or language == "العربية"
dt_line = f"🕒 {'التاريخ والوقت' if is_ar else 'Date & Time'}: {dt_str}"
loc_label = "📍 الموقع" if is_ar else "📍 Location"
zoom = 16
osm_iframe = (
f'<iframe width="100%" height="300" frameborder="0" '
f'src="https://www.openstreetmap.org/export/embed.html?layer=mapnik&marker={lat}%2C{lon}&zoom={zoom}"></iframe>'
f'<div style="font-size:12px;color:#aaa;margin-top:4px">{loc_label}: {lat}, {lon} '
f'• <a target="_blank" href="https://www.openstreetmap.org/?mlat={lat}&mlon={lon}#map={zoom}/{lat}/{lon}">Open map</a>'
f'</div>'
)
return f"""
<div style="font-family:system-ui,Segoe UI,Arial;color:#eee;line-height:1.5">
<div style="background:transparent;padding:14px 16px;border-radius:10px;margin-bottom:10px;">
<div style="font-size:16px;white-space:pre-wrap;">{caption_text}</div>
</div>
{osm_iframe}
<div style="margin-top:8px;font-size:14px;">{dt_line}</div>
</div>
"""
def ui_print_like(image, language):
caption = describe_image(image, language)
lat, lon = random_point_in_bbox(ASIR_BBOX)
return render_html(caption, lat, lon, language)
# Gradio UI
demo = gr.Interface(
fn=ui_print_like,
inputs=[
gr.Image(type="pil", label="Upload road image"),
gr.Dropdown(choices=["Arabic", "English", "العربية"], value="English", label="Select Language")
],
outputs=gr.HTML(label="output"),
title="MuniVis – Road Issue Detector (Asir)",
description="Upload an image and get a description with a map (Asir random location) and date/time."
)
demo.launch(debug=True)