Nn / app.py
Nonabzbssbbsbs's picture
Create app.py
8364840 verified
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("<h1 class='title'>♻️ SmartWaste — Ақылды Қоқыс + Ауа райы Анализ жүйесі</h1>")
gr.Markdown("<p style='text-align:center;'>**Ескерту:** Бұл қосымша жедел жадты үнемдеу үшін модельдерді **'АНАЛИЗ ЖАСАУ'** батырмасын бірінші басқанда жүктейді. Алғашқы анализ **өте** ұзаққа созылуы мүмкін.</p>")
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()