File size: 3,574 Bytes
ea32bf7
 
 
 
d3313c5
 
 
ea32bf7
 
 
 
 
 
 
 
 
 
 
 
922847d
ea32bf7
922847d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd4b2c9
922847d
 
 
 
 
 
 
 
 
 
 
 
 
ea32bf7
 
922847d
 
ea32bf7
922847d
 
ea32bf7
922847d
 
 
ea32bf7
 
922847d
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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)