import gradio as gr from transformers import pipeline from PIL import Image import requests from datetime import datetime, timedelta # ----------------------------- # 1. Модельдерді ГЛОБАЛЬДЫ ЖҮКТЕМЕЙМІЗ (Lazy Loading) # ----------------------------- clf = None # Image Classification (Trash-Net) det = None # Object Detection (DETR) seg = None # Image Segmentation (SegFormer) dep = None # Depth Estimation (DPT-Hybrid) - ЖАҢА МОДЕЛЬ! # ----------------------------- # 2. Қазақша аударма сөздіктері (КЕҢЕЙТІЛГЕН) # ----------------------------- # prithivMLmods/Trash-Net үшін trash_labels = { "plastic": "Пластик", "metal": "Металл", "paper": "Қағаз", "glass": "Шыны (Әйнек)", "cardboard": "Картон", "organic": "Органикалық қалдық", "other": "Басқа" } # facebook/detr-resnet-50 (COCO) үшін object_labels = { "person": "адам", "bottle": "бөтелке", "chair": "орындық", "table": "үстел", "cat": "мысық", "dog": "ит", "cup": "кесе", "couch": "диван", "book": "кітап", "tv": "теледидар", "laptop": "ноутбук", "clock": "сағат", "car": "көлік", "potted plant": "гүл құмы", "traffic light": "бағдаршам", "umbrella": "қолшатыр", } segment_labels = { "wall": "қабырға", "building": "ғимарат", "sky": "аспан", "floor": "еден", "tree": "ағаш", "ceiling": "төбе", "road": "жол", "bed": "төсек", "windowpane": "терезе", "grass": "шөп", "cabinet": "шкаф", "sidewalk": "жаяужол", "person": "адам", "door": "есік", "table": "үстел", "mountain": "тау", "plant": "өсімдік", "chair": "орындық", "car": "көлік", "water": "су", "sofa": "диван", "shelf": "сөре", "house": "үй", "sea": "теңіз", } WMO_WEATHER_CODES = { 0: "Ашық", 1: "Аздап бұлтты", 2: "Бұлыңғыр", 3: "Бұлтты", 45: "Тұман", 51: "Жеңіл сіркіреу", 61: "Жеңіл жаңбыр", 63: "Орташа жаңбыр", 65: "Қатты жаңбыр", 71: "Жеңіл қар", 73: "Орташа қар", 75: "Қатты қар", 80: "Жеңіл нөсер", 95: "Найзағай", 99: "Қатты қарлы найзағай", } # ----------------------------- # 3. Ауа райын алу (Open-Meteo) # ----------------------------- def get_weather(): try: latitude = 48.9711 longitude = 90.0500 url = ( f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}" "&daily=weathercode,temperature_2m_max,temperature_2m_min&forecast_days=7&timezone=Asia/Ulaanbaatar" ) response = requests.get(url, timeout=10).json() output = "### 🌤 Баян-Өлгий ауа райы\n\n" output += "**7 күндік болжам:**\n" warnings = [] for i in range(7): date = response["daily"]["time"][i] max_temp = response["daily"]["temperature_2m_max"][i] min_temp = response["daily"]["temperature_2m_min"][i] code = response["daily"]["weathercode"][i] desc = WMO_WEATHER_CODES.get(code, "Белгісіз") output += f"* **{date}**: 🌡 {min_temp}°C / {max_temp}°C, {desc}\n" if min_temp <= -25: warnings.append(f"{date}: Қатты аяз күтілуде ({min_temp}°C)!") if warnings: output += "\n**⚠️ Ерекше ескертулер:**\n" for w in warnings: output += f"* {w}\n" return output except Exception: return "Ауа райын алу кезінде қате болды." # ----------------------------- # 4. Анализ функциясы (4 Модельді жүктеу осы жерде) # ----------------------------- def analyze_image(image): global clf, det, seg, dep # Lazy loading: Модельдерді тек бірінші рет қана жүктейміз try: if clf is None: clf = pipeline("image-classification", model="prithivMLmods/Trash-Net") if det is None: det = pipeline("object-detection", model="facebook/detr-resnet-50") if seg is None: seg = pipeline("image-segmentation", model="nvidia/segformer-b0-finetuned-ade-512-512") # ЖАҢА МОДЕЛЬДІ ЖҮКТЕУ: Depth Estimation if dep is None: dep = pipeline("depth-estimation", model="Intel/dpt-hybrid-midas") except Exception as e: return f"Модельдерді жүктеу кезінде қате шықты. Қате: {e}" # --- 1. Қоқыс классификациясы --- clf_result = clf(image) clf_outputs = [f"{trash_labels.get(res['label'], res['label'])} ({round(res['score'] * 100, 2)}%)" for res in clf_result] # --- 2. Объект табу --- det_result = det(image) objects = [object_labels.get(obj['label'], obj['label']) for obj in det_result] unique_objects = list(set(objects)) # --- 3. Сегментация --- seg_result = seg(image) seg_labels_kz = list({segment_labels.get(s['label'], s['label']) for s in seg_result}) # --- 4. Тереңдікті бағалау (Нәтижесін сурет етіп қайтарамыз) --- dep_result = dep(image) # dep_result[0] - бұл тереңдік картасының суреті (PIL Image) # --- Ауа райы --- weather_info = get_weather() # Нәтиже output_text = ( f"### 🗑️ Қоқыс түрі (Trash-Net)\n**{', '.join(clf_outputs)}**\n\n---\n\n" f"### 🔍 Табылған нысандар (DETR)\n{', '.join(unique_objects) if unique_objects else 'Нысандар табылған жоқ.'}\n\n---\n\n" f"### 🧩 Суреттегі аймақтар (SegFormer)\n{', '.join(seg_labels_kz) if seg_labels_kz else 'Аймақтар табылған жоқ.'}\n\n" ) # Бір функциядан бірнеше нәтиже қайтару үшін return output_text, dep_result[0] # ----------------------------- # 5. Интерфейс (Gradio) # ----------------------------- css = """ body { background-image: url('https://uploads8.wikiart.org/images/vincent-van-gogh/starry-night.jpg'); background-size: cover; background-repeat: no-repeat; background-attachment: fixed; } .gradio-container, .gr-panel, .gr-box { background-color: rgba(255, 255, 255, 0.9) !important; border-radius: 15px !important; } h1.title { color: white !important; text-shadow: 2px 2px 4px #000000; text-align: center; } """ with gr.Blocks(title="SmartWaste-YOLOv8n", css=css) as demo: gr.Markdown("

♻️ SmartWaste — Ақылды Қоқыс + Ауа райы Анализ жүйесі

") gr.Markdown("

**Ескерту:** Бұл қосымша жедел жадты үнемдеу үшін модельдерді **'АНАЛИЗ ЖАСАУ'** батырмасын бірінші басқанда жүктейді. Алғашқы анализ **өте** ұзаққа созылуы мүмкін.

") with gr.Row(): image_input = gr.Image(label="Суретті таңдаңыз немесе камера қосыңыз", type="pil", sources=["upload", "webcam", "clipboard"]) depth_output = gr.Image(label="4. Тереңдік Картасы (Depth Estimation)", type="pil", interactive=False) with gr.Row(): analyze_btn = gr.Button("🔎 АНАЛИЗ ЖАСАУ", variant="primary") output_text = gr.Markdown(label="Нәтижелер (Классификация, Объект, Сегментация)") # analyze_image функциясы екі нәтиже қайтарады: мәтін және сурет analyze_btn.click(fn=analyze_image, inputs=image_input, outputs=[output_text, depth_output]) # Ауа райын жеке көрсету (қосымша іске қосылғанда бірден жүктеледі) gr.Markdown(get_weather()) demo.launch()