deprem / app.py
therayz1's picture
Upload 15 files
0c954a9 verified
import gradio as gr
import os
import sys
# Modül yollarını ekle - Hugging Face için düzeltme
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
# Modülleri import et
try:
from vision.detector import mark_dangers
from risk.model import predict_risk_with_details
from stream.kandilli_feed import get_latest_quakes
from rag.chatbot import answer, get_chatbot
except ModuleNotFoundError:
# Hugging Face için alternatif import yöntemi
sys.path.append(os.path.join(current_dir, "vision"))
sys.path.append(os.path.join(current_dir, "risk"))
sys.path.append(os.path.join(current_dir, "stream"))
sys.path.append(os.path.join(current_dir, "rag"))
from detector import mark_dangers
from model import predict_risk_with_details
from kandilli_feed import get_latest_quakes
from chatbot import answer, get_chatbot
# API anahtarı için global değişken
gemini_api_key = None
# Ana Gradio uygulaması
with gr.Blocks(title="QuakeAware AI") as demo:
gr.Markdown("# QuakeAware AI - Deprem Risk Analizi ve Güvenlik Asistanı")
with gr.Tab("Görsel Analiz"):
gr.Markdown("## Oda Güvenlik Analizi")
gr.Markdown("Odanızın fotoğrafını yükleyin, tehlikeli eşyaları işaretleyelim ve en güvenli konumu gösterelim.")
with gr.Row():
in_img = gr.Image(label="Oda Fotoğrafı")
out_img = gr.Image(label="Analiz Sonucu")
analyze_btn = gr.Button("Analiz Et")
analyze_btn.click(fn=mark_dangers, inputs=in_img, outputs=out_img)
with gr.Tab("Adres Risk Skoru"):
gr.Markdown("## Adres Tabanlı Risk Analizi")
gr.Markdown("Adresinizi veya il/ilçe bilgisini girin, deprem risk skorunu hesaplayalım.")
addr = gr.Textbox(label="Adres veya İl/İlçe")
with gr.Row():
with gr.Column():
score = gr.Number(label="Risk Skoru (0-1)", precision=2)
category = gr.Textbox(label="Risk Kategorisi")
soil_type = gr.Textbox(label="Zemin Türü")
building_age = gr.Textbox(label="Tahmini Bina Yaşı")
with gr.Column():
explanation = gr.Textbox(label="Risk Açıklaması", lines=5)
risk_btn = gr.Button("Risk Hesapla")
def process_risk(address):
result = predict_risk_with_details(address)
if result["success"]:
return (
result["risk_score"],
result["risk_category"],
result["soil_type"],
result["building_age"],
result["explanation"]
)
else:
return (
0,
"Hesaplanamadı",
"Bilinmiyor",
"Bilinmiyor",
result["message"]
)
risk_btn.click(
fn=process_risk,
inputs=addr,
outputs=[score, category, soil_type, building_age, explanation]
)
with gr.Tab("Canlı Depremler"):
gr.Markdown("## Gerçek Zamanlı Deprem Takibi")
gr.Markdown("Son depremleri Kandilli Rasathanesi verilerine göre haritada görüntüleyin.")
with gr.Row():
hours_slider = gr.Slider(
minimum=1,
maximum=72,
value=12,
step=1,
label="Gösterilecek Saat Aralığı"
)
min_mag_slider = gr.Slider(
minimum=1.0,
maximum=7.0,
value=1.0,
step=0.1,
label="Minimum Büyüklük"
)
refresh = gr.Button("Güncelle")
quake_map = gr.HTML(label="Deprem Haritası")
def update_map(hours, min_mag):
return get_latest_quakes(hours=int(hours), min_mag=float(min_mag))
refresh.click(fn=update_map, inputs=[hours_slider, min_mag_slider], outputs=quake_map)
# Sayfa yüklendiğinde haritayı otomatik olarak göster
demo.load(fn=update_map, inputs=[hours_slider, min_mag_slider], outputs=quake_map)
with gr.Tab("Hazırlık Sohbeti"):
gr.Markdown("## Deprem Hazırlık Rehberi")
gr.Markdown("Deprem hazırlığı konusunda sorularınızı sorun, kişiselleştirilmiş öneriler alın.")
# API anahtarı giriş alanı
api_key_input = gr.Textbox(
label="Gemini API Anahtarı",
placeholder="Google Gemini API anahtarınızı buraya girin",
type="password"
)
api_status = gr.Textbox(label="API Durumu", value="API anahtarı girilmedi")
def update_api_key(key):
global gemini_api_key
if not key or key.strip() == "":
gemini_api_key = None
return "API anahtarı girilmedi"
gemini_api_key = key.strip()
# API anahtarını test et
chatbot = get_chatbot(gemini_api_key)
if chatbot.llm:
return "✅ API anahtarı geçerli, Gemini modeli hazır"
else:
return "❌ API anahtarı geçersiz veya hata oluştu"
api_key_input.change(fn=update_api_key, inputs=api_key_input, outputs=api_status)
with gr.Row():
chatbot_ui = gr.Chatbot(label="Sohbet", height=400)
chat_in = gr.Textbox(label="Sorunuz", placeholder="Örneğin: Deprem çantasında neler bulundurmalıyım?")
chat_btn = gr.Button("Sor")
def chat(message, history):
# Geçmiş sohbeti güncelle
history = history or []
# API anahtarı kontrolü
if not gemini_api_key:
response = "Lütfen önce Gemini API anahtarınızı girin. Hazırlık Sohbeti sekmesinin üst kısmındaki API Anahtarı alanına geçerli bir Gemini API anahtarı girmeniz gerekmektedir."
else:
response = answer(message, gemini_api_key)
history.append((message, response))
return history, ""
chat_btn.click(
fn=chat,
inputs=[chat_in, chatbot_ui],
outputs=[chatbot_ui, chat_in],
queue=True
)
chat_in.submit(
fn=chat,
inputs=[chat_in, chatbot_ui],
outputs=[chatbot_ui, chat_in],
queue=True
)
gr.Markdown("---")
gr.Markdown("© 2025 QuakeAware AI | Deprem güvenliği için yapay zeka çözümleri")
# Uygulamayı başlat
if __name__ == "__main__":
demo.launch()