File size: 6,875 Bytes
0c954a9 |
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
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()
|