import gradio as gr from PIL import Image from datetime import datetime from detector import RoadsideDetector from utils import ( extract_gps_from_image, save_detection_to_history, load_detection_history, create_detection_map, generate_statistics, format_statistics_text, add_debug, dump_exif_tags, ) import tempfile detector = RoadsideDetector() def process_image(image_input, use_gps=True): if not image_input: return None, None, "ℹ️ Lütfen bir fotoğraf yükleyin!", None, "📊 Henüz istatistik yok" # --- Görüntüyü dosya yoluna çevir --- if isinstance(image_input, str): image_path = image_input elif isinstance(image_input, Image.Image): temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") image_input.save(temp_file.name, format="JPEG") image_path = temp_file.name else: temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") temp_file.write(image_input.read()) temp_file.flush() image_path = temp_file.name # --- YOLO tespiti --- image = Image.open(image_path) detections = detector.detect_items(image) annotated = detector.draw_boxes(image, detections) severity = detector.calculate_severity(detections) # --- GPS verisi --- gps_data = {"coords": None, "address": None} gps_message = "" if use_gps: try: gps_data = extract_gps_from_image(image_path) if gps_data.get("coords") and gps_data["coords"] != (0.0, 0.0): gps_message = f"📍 Konum: {gps_data['coords']}" else: gps_message = ( "ℹ️ Fotoğrafta konum bilgisi bulunamadı." ) except Exception: gps_message = ( "ℹ️ Konum bilgisi okunamadı. Lütfen tekrar deneyin." ) # EXIF dump debug log exif_dump = dump_exif_tags(image_path) add_debug("📸 RAW EXIF:\n" + exif_dump) # --- Tespiti kaydet --- detection_entry = { "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "count": len(detections), "severity": severity, "gps": gps_data, } save_detection_to_history(detection_entry) # --- Harita + istatistik --- history = load_detection_history() map_html = create_detection_map(history) stats = generate_statistics() stats_text = format_statistics_text(stats) return ( annotated, None, # download file path eklenecek f"📊 Öncelik seviyesi: {severity}\n📦 Tespit edilen nesne sayısı: {len(detections)}\n{gps_message}", map_html, stats_text, ) def create_interface(): # Custom CSS to change the drop zone text to Turkish custom_css = """ /* Hide the original English text */ .image-container .wrap .wrap-inner.svelte-1sbaa03 span[data-testid="block-info"] { visibility: hidden; } /* Add Turkish text */ .image-container .wrap .wrap-inner.svelte-1sbaa03::after { content: 'Buraya sürükleyin veya tıklayın'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #999; font-size: 1.2em; pointer-events: none; } /* Alternative styling for the upload area */ .image-container { position: relative; } """ with gr.Blocks(title="Çöp kutusu, taşan çöp ve açıkta bırakılan çöp tespiti", css=custom_css) as demo: gr.Markdown( "## 🚮 Çöp kutusu, taşan çöp ve açıkta bırakılan çöp tespiti\n" "Bu uygulama yol kenarındaki **çöp kutularını**, **taşan çöpleri** ve **açıkta bırakılan çöpleri** tespit eder.\n\n" "🗺️ **Özellikler:**\n" "- Çöp kutusu ve taşan çöp tespiti yapar.\n" "- Tespit edilen konumları ve çöp yoğunluğunu harita üzerinde gösterir.\n" "- Toplanan verileri istatistiksel olarak raporlar.\n\n" ) with gr.Tabs(): with gr.TabItem("📸 Çek / Yükle ve Tespit Et"): with gr.Row(): with gr.Column(): input_img = gr.Image( type="filepath", label="📷 Kamera ile Çek veya 📁 Dosyadan Yükle", sources=["upload", "webcam"], mirror_webcam=False # Fix for flipped camera image ) gps_toggle = gr.Checkbox("📍 GPS Verisini Kullan", value=True) detect_btn = gr.Button("🔍 Tespit Et", variant="primary") with gr.Column(): out_img = gr.Image(label="📊 Tespit Sonucu", type="pil") download_file = gr.File(label="⬇️ Sonucu Dosya Olarak İndir") summary = gr.Textbox(label="📝 Özet", lines=6) with gr.TabItem("🗺️ Harita"): map_display = gr.HTML("

🗺️ Henüz tespit yok

") with gr.TabItem("📊 İstatistikler"): stats_display = gr.Markdown("📊 Henüz istatistik yok") # process and prepare file for download def process_and_prepare(image_input, use_gps): annotated, _, text, map_html, stats_text = process_image(image_input, use_gps) if annotated is None: return None, None, None, None, None temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") annotated.save(temp_file.name, format="JPEG") return annotated, temp_file.name, text, map_html, stats_text detect_btn.click( process_and_prepare, inputs=[input_img, gps_toggle], outputs=[out_img, download_file, summary, map_display, stats_display], ) gr.Markdown( "- Fotoğraf çekerken konum servisinizin açık olduğundan emin olun.\n" "- Bazı tarayıcılar kamera ve dosyadan yüklenen fotoğrafın konum bilgisini silebilir.\n\n" "📂 **Kaynak kodlara 'Files' dosyası üzerinden ulaşabilirsiniz.**\n\n" ) return demo if __name__ == "__main__": app = create_interface() # Enable HTTPS for camera access app.launch( server_name="0.0.0.0", server_port=7860, ssl_verify=False, # Allows self-signed certificates share=True # Creates a public HTTPS link via Gradio )