nollmyoloscript / app.py
ekizcemelih's picture
Update app.py
5f1ce92 verified
Raw
History Blame Contribute Delete
4.58 kB
import gradio as gr
from ultralytics import YOLO
from collections import Counter
import os
import uuid
# Model yükle
model = YOLO("best.pt")
# Sınıf eşlemesi
id2name = {
0: "Silah", 1: "Tank", 2: "Helikopter", 3: "Savaş Uçağı", 4: "Asker",
5: "Top", 6: "Füze", 7: "Savaş Gemisi", 8: "Askeri Araç", 9: "Bayrak",
10: "Sivil Araç", 11: "Ağaç"
}
PRED_DIR = "yolo_outputs"
def save_and_predict(image):
os.makedirs("inputs", exist_ok=True)
image_id = str(uuid.uuid4())[:8]
image_path = f"inputs/{image_id}.jpg"
image.save(image_path)
model.predict(source=image_path, save_txt=True, conf=0.25, project=PRED_DIR, name=image_id, exist_ok=True)
txt_path = f"{PRED_DIR}/{image_id}/labels/{image_id}.txt"
if not os.path.exists(txt_path):
return {}, "Hiçbir nesne tespit edilemedi."
with open(txt_path, "r") as f:
class_ids = [int(line.strip().split()[0]) for line in f]
counts = Counter(class_ids)
detected_names = {id2name[i] for i in counts if i in id2name}
data = {
"counts": counts,
"names": detected_names
}
return data, "Tahmin başarıyla yüklendi. Sağdaki kutulardan bir soruya tıklayın."
def cevapla(soru_id, data, chat_history):
if not data:
return chat_history + [("❓ " + soru_id, "Önce bir görsel yükleyin ve tahmin yapın.")]
counts = data["counts"]
names = data["names"]
if soru_id == "1️⃣ Kaç nesne ve kaçar adet?":
detaylar = [f"{counts[i]} adet {id2name[i]}" for i in counts]
cevap = f"{len(counts)} farklı sınıf tespit edildi:\n" + "\n".join(detaylar)
elif soru_id == "2️⃣ Savunma sistemleri var mı?":
savunma = {"Tank", "Füze", "Top", "Helikopter"}
bulunan = savunma & names
cevap = f"Bulunan savunma sistemleri: {', '.join(bulunan)}" if bulunan else "Savunma sistemi tespit edilmedi."
elif soru_id == "3️⃣ Askeri birlik tespiti?":
cevap = "Askeri birlik olabilir." if {"Asker", "Askeri Araç"} & names else "Askeri birlik tespit edilmedi."
elif soru_id == "4️⃣ Hava unsurları var mı?":
hava = {"Helikopter", "Savaş Uçağı"}
bulunan = hava & names
cevap = f"Hava unsurları tespit edildi: {', '.join(bulunan)}" if bulunan else "Hava unsuru tespit edilmedi."
elif soru_id == "5️⃣ Tehdit seviyesi nedir?":
yüksek = {"Tank", "Füze", "Savaş Uçağı", "Top", "Savaş Gemisi"}
if yüksek & names:
cevap = "Yüksek tehdit içeriyor."
elif "Asker" in names:
cevap = "Orta seviye tehdit."
else:
cevap = "Düşük tehdit seviyesi."
else:
cevap = "Geçersiz soru."
return chat_history + [(soru_id, cevap)]
# Gradio Blocks yapısı
with gr.Blocks() as demo:
gr.Markdown("## 🪖 YOLO Görselden Nesne Tespiti + Soru-Cevap Arayüzü")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="pil", label="Görsel Yükle")
tahmin_bilgisi = gr.Textbox(label="Tahmin Durumu")
hidden_data = gr.State()
upload_button = gr.Button("📤 Tahmin Yap")
with gr.Column():
chatbot = gr.Chatbot(label="📡 Soru-Cevap Paneli")
with gr.Row():
b1 = gr.Button("1️⃣ Kaç nesne ve kaçar adet?")
b2 = gr.Button("2️⃣ Savunma sistemleri var mı?")
with gr.Row():
b3 = gr.Button("3️⃣ Askeri birlik tespiti?")
b4 = gr.Button("4️⃣ Hava unsurları var mı?")
b5 = gr.Button("5️⃣ Tehdit seviyesi nedir?")
# Buton olayları
# Buton olayları – dikkat: soru_id doğrudan lambda ile veriliyor
upload_button.click(
save_and_predict, inputs=image_input, outputs=[hidden_data, tahmin_bilgisi]
)
b1.click(lambda data, chat: cevapla("1️⃣ Kaç nesne ve kaçar adet?", data, chat), inputs=[hidden_data, chatbot], outputs=chatbot)
b2.click(lambda data, chat: cevapla("2️⃣ Savunma sistemleri var mı?", data, chat), inputs=[hidden_data, chatbot], outputs=chatbot)
b3.click(lambda data, chat: cevapla("3️⃣ Askeri birlik tespiti?", data, chat), inputs=[hidden_data, chatbot], outputs=chatbot)
b4.click(lambda data, chat: cevapla("4️⃣ Hava unsurları var mı?", data, chat), inputs=[hidden_data, chatbot], outputs=chatbot)
b5.click(lambda data, chat: cevapla("5️⃣ Tehdit seviyesi nedir?", data, chat), inputs=[hidden_data, chatbot], outputs=chatbot)
demo.launch()