import torch import numpy as np from torch.utils.data import Dataset, DataLoader import torchvision from PIL import Image import gradio as gr from huggingface_hub import hf_hub_download import torch.nn as nn import timm REPO_ID = "Raaniel/model-smoke" MODEL_FILE_NAME = "model_smoke.pt" USE_CUDA = torch.cuda.is_available() num_classes = 3 # Download the model checkpoint_path = hf_hub_download(repo_id=REPO_ID, filename=MODEL_FILE_NAME) # Load the checkpoint state = torch.load(checkpoint_path, map_location=torch.device('cuda' if USE_CUDA else 'cpu')) # Create the model and modify it model = timm.create_model('mobilenetv3_small_050', pretrained=True) num_features = model.classifier.in_features # Additional linear and dropout layers model.classifier = nn.Sequential( nn.Linear(num_features, 256), # Additional linear layer nn.ReLU(inplace=True), nn.Dropout(0.5), nn.Linear(256, num_classes) # Final classification layer ) # Load the model weights model.load_state_dict(state['weights']) # Move model to the appropriate device device = torch.device('cuda' if USE_CUDA else 'cpu') model = model.to(device) classes = ["chmury", 'inne', "dym"] def predict(image, model=model, classes=classes, device=device, transform=transform): model.eval() print(type(image)) # Check if the image is a PyTorch Tensor, if so, use it directly if isinstance(image, torch.Tensor): img_batch = image.unsqueeze(0).to(device) elif isinstance(image, np.ndarray): # Check if the image is a numpy ndarray # Convert numpy ndarray to PIL Image img = Image.fromarray(image) # Transform the image img_transformed = transform(img) # Convert to a batch of 1 and send to device img_batch = img_transformed.unsqueeze(0).to(device) else: # Load the image and apply transformations img = Image.open(image) img_transformed = transform(img) img_batch = img_transformed.unsqueeze(0).to(device) # Make predictions with torch.no_grad(): _, predicted_idx = model(img_batch).max(1) # Map the index to the class name predicted_class = classes[predicted_idx.item()] return predicted_class examples = ["https://img.freepik.com/free-photo/fantasy-style-clouds_23-2151057636.jpg?size=338&ext=jpg&ga=GA1.1.87170709.1707609600&semt=sph", "https://energyeducation.ca/wiki/images/5/51/Smoke_column_-_High_Park_Wildfire_%281%29.jpg", "https://img-aws.ehowcdn.com/360x267p/s3-us-west-1.amazonaws.com/contentlab.studiod/getty/31a4debc7443411195df509e38a5f9a3.jpg", "https://thumb.bibliocad.com/images/content/00000000/9000/9813.jpg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRC7j2LoW8D13BOgbT_9J2SI_krX0sadT4oaSuyFjNb3jElJdU-J7DpPgCYvEfFzqoD6c0&usqp=CAU"] css = """ h1 { text-align: center; display:block; } """ with gr.Blocks(theme=gr.themes.Base(primary_hue="zinc", secondary_hue="neutral", neutral_hue="slate", font = gr.themes.GoogleFont("Montserrat")), css = css, title="Smoke Detection") as demo: demo.load(None, None, js=""" () => { const params = new URLSearchParams(window.location.search); if (!params.has('__theme')) { params.set('__theme', 'light'); window.location.search = params.toString(); } }""", ) markdown_content = """ """ gr.Markdown(markdown_content) gr.Markdown("# 🔥 Wczesne rozpoznawanie pożarów 🔥") gr.Markdown(""" ## Zauważ Ogień, Ocal Naturę! W mgnieniu oka rozróżnij dym od chmur dzięki naszemu inteligentnemu narzędziu do wykrywania pożarów. ### Napędzane przez obszerną bazę ponad 14 000 obrazów i zaawansowane modele uczenia maszynowego, nasze narzędzie umożliwia wczesne rozpoznawanie ognia. Szybko, sprytnie i czujnie – chronimy nasze środowisko przed pierwszymi oznakami zagrożenia.""") with gr.Accordion("Więcej informacji", open = False): gr.Markdown("""Nasilenie się pożarów, potęgowane przez zmiany klimatyczne, stanowi poważne wyzwanie w szybkiej detekcji i reagowaniu. Tradycyjne metody wykrywania pożarów, takie jak obserwacja ludzka i raporty, często okazują się zbyt wolne, zwłaszcza na obszarach oddalonych. Automatyczne systemy wykrywania dymu oferują rozwiązanie, wykorzystując głębokie uczenie do szybkiego i dokładnego identyfikowania dymu na obrazach. Umiejętność odróżnienia dymu od zjawisk o podobnym wyglądzie, jak chmury, jest kluczowa. Ta różnica pozwala na szybsze lokalizowanie ognisk pożarów, co umożliwia szybsze czas reakcji i potencjalnie ratuje ogromne obszary regionów naturalnych i mieszkalnych przed zniszczeniem. Poprzez poprawę szybkości i dokładności wykrywania pożarów, możemy znacząco złagodzić ich wpływ na społeczności, gospodarki i ekosystemy.""") with gr.Column(): image = gr.Image(label = "Obraz") gallery = gr.Gallery(value = examples, label="Przykładowe zdjęcia",columns=[4], rows=[1], height=200, object_fit = "scale-down") def get_select_index(evt: gr.SelectData): return examples[evt.index] gallery.select(get_select_index, None, image) action = gr.Button("Rozpoznaj") prediction = gr.Textbox(label = "Predykcja") action.click(fn=predict, inputs=image, outputs=prediction) demo.launch(width = "75%", debug = True, allowed_paths=["/"])