|
import gradio as gr |
|
import os |
|
import sys |
|
|
|
|
|
current_dir = os.path.dirname(os.path.abspath(__file__)) |
|
sys.path.append(current_dir) |
|
|
|
|
|
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: |
|
|
|
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 |
|
|
|
|
|
gemini_api_key = None |
|
|
|
|
|
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) |
|
|
|
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_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() |
|
|
|
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): |
|
|
|
history = history or [] |
|
|
|
|
|
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") |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|