deprem / detector.py
therayz1's picture
Upload 15 files
0c954a9 verified
import torch
from ultralytics import YOLO
from PIL import Image, ImageDraw
import numpy as np
import os
# Model yolları
YOLO_MODEL_PATH = os.path.join(os.path.dirname(__file__), "yolov8n.pt")
# Tehlikeli obje sınıfları (COCO veri setindeki indeksler)
DANGEROUS_CLASSES = {
"bookcase": 0.9, # Kitaplık
"cabinet": 0.8, # Dolap
"refrigerator": 0.7, # Buzdolabı
"oven": 0.6, # Fırın
"tv": 0.5, # Televizyon
"microwave": 0.5, # Mikrodalga
"chair": 0.3, # Sandalye
"couch": 0.4, # Kanepe
"bed": 0.4, # Yatak
"dining table": 0.6, # Yemek masası
"toilet": 0.3, # Tuvalet
"sink": 0.3, # Lavabo
"clock": 0.2, # Saat
"vase": 0.2, # Vazo
"scissors": 0.1, # Makas
"hair drier": 0.1, # Saç kurutma makinesi
"toothbrush": 0.1, # Diş fırçası
}
class DangerDetector:
def __init__(self):
# GPU bellek optimizasyonu
torch.cuda.empty_cache()
# Model yükleme
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {self.device}")
# YOLOv8 modelini yükle
if not os.path.exists(YOLO_MODEL_PATH):
print("Downloading YOLOv8 model...")
self.model = YOLO("yolov8n.pt") # Otomatik indirecek
self.model.save(YOLO_MODEL_PATH)
else:
self.model = YOLO(YOLO_MODEL_PATH)
# Modeli GPU'ya taşı ve optimize et
self.model.to(self.device)
print("Danger detector initialized")
def detect_dangers(self, image):
"""Görüntüdeki tehlikeli objeleri tespit et"""
# Görüntüyü modele ver
results = self.model(image, verbose=False)
# Sonuçları işle
detected_objects = []
for result in results:
boxes = result.boxes
for box in boxes:
class_id = int(box.cls.item())
class_name = result.names[class_id]
# Sadece tehlikeli sınıfları filtrele
if class_name in DANGEROUS_CLASSES:
confidence = box.conf.item()
danger_score = DANGEROUS_CLASSES[class_name] * confidence
x1, y1, x2, y2 = box.xyxy[0].tolist()
detected_objects.append({
"class": class_name,
"box": [x1, y1, x2, y2],
"confidence": confidence,
"danger_score": danger_score
})
return detected_objects
def mark_dangers(self, image):
"""Görüntüdeki tehlikeli objeleri işaretle ve en güvenli noktayı göster"""
# NumPy dizisine dönüştür
if isinstance(image, str):
image = Image.open(image)
elif isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Tehlikeli objeleri tespit et
dangers = self.detect_dangers(np.array(image))
# Görüntü üzerine çizim yapmak için kopya oluştur
result_image = image.copy()
draw = ImageDraw.Draw(result_image)
# Tehlikeli objeleri işaretle
for obj in dangers:
x1, y1, x2, y2 = obj["box"]
class_name = obj["class"]
danger_score = obj["danger_score"]
# Tehlike skoruna göre renk belirle (kırmızı -> sarı)
color = (255, int(255 * (1 - danger_score)), 0)
# Kutuyu çiz
draw.rectangle([x1, y1, x2, y2], outline=color, width=3)
# Etiketi çiz
draw.text((x1, y1-15), f"{class_name}: {danger_score:.2f}", fill=color)
# Basit güvenli nokta hesaplama
safe_point = self._find_safe_point(np.array(image), dangers)
# Güvenli noktayı işaretle
if safe_point:
x, y = safe_point
radius = 20
draw.ellipse((x-radius, y-radius, x+radius, y+radius), fill=(0, 255, 0, 128))
draw.text((x+radius+5, y), "EN GÜVENLİ NOKTA", fill=(0, 255, 0))
return np.array(result_image)
def _find_safe_point(self, image, dangers):
"""En güvenli noktayı bul (basit versiyon)"""
h, w = image.shape[:2]
# Tehlike haritası oluştur
danger_map = np.zeros((h, w), dtype=np.float32)
# Her tehlikeli obje için tehlike alanı oluştur
for obj in dangers:
x1, y1, x2, y2 = obj["box"]
danger_score = obj["danger_score"]
# Objenin merkezi
center_x = (x1 + x2) / 2
center_y = (y1 + y2) / 2
# Tüm pikseller için tehlike skorunu hesapla
for y in range(0, h, 10): # Performans için her 10 pikselde bir hesapla
for x in range(0, w, 10):
# Mesafe hesapla
distance = np.sqrt((x - center_x)**2 + (y - center_y)**2)
# Mesafeye bağlı tehlike skoru (uzaklık arttıkça azalır)
pixel_danger = danger_score * (1000 / (distance + 10))
# Tehlike haritasını güncelle
danger_map[y:min(y+10, h), x:min(x+10, w)] += pixel_danger
# En güvenli nokta (en düşük tehlike skoru)
min_danger = np.min(danger_map)
safe_indices = np.where(danger_map == min_danger)
if len(safe_indices[0]) > 0:
# Birden fazla güvenli nokta varsa, rastgele birini seç
idx = np.random.randint(0, len(safe_indices[0]))
safe_y = safe_indices[0][idx]
safe_x = safe_indices[1][idx]
return (safe_x, safe_y)
return None
# Singleton örneği
detector = None
def get_detector():
"""Detector singleton örneğini döndür"""
global detector
if detector is None:
detector = DangerDetector()
return detector
def mark_dangers(image):
"""Gradio arayüzü için wrapper fonksiyon"""
detector = get_detector()
return detector.mark_dangers(image)
# Test
if __name__ == "__main__":
import matplotlib.pyplot as plt
# Test görüntüsü
test_image = "test_room.jpg"
# Tehlikeleri işaretle
detector = DangerDetector()
result = detector.mark_dangers(test_image)
# Sonucu göster
plt.figure(figsize=(12, 8))
plt.imshow(result)
plt.axis('off')
plt.title("Tehlike Analizi")
plt.show()