Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import numpy as np
|
3 |
+
from torch.utils.data import Dataset, DataLoader
|
4 |
+
import torchvision
|
5 |
+
from PIL import Image
|
6 |
+
import gradio as gr
|
7 |
+
|
8 |
+
# Configure device
|
9 |
+
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
10 |
+
|
11 |
+
transform = torchvision.transforms.Compose([
|
12 |
+
torchvision.transforms.Resize((224, 224)),
|
13 |
+
torchvision.transforms.ToTensor(),
|
14 |
+
torchvision.transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.225, 0.225, 0.225])
|
15 |
+
])
|
16 |
+
|
17 |
+
model = torch.jit.load('model_smoke.pt')
|
18 |
+
model = model.to(device)
|
19 |
+
|
20 |
+
classes = ["chmury", 'inne', "dym"]
|
21 |
+
|
22 |
+
def predict(image, model=model, classes=classes, device=device, transform=transform):
|
23 |
+
model.eval()
|
24 |
+
|
25 |
+
print(type(image))
|
26 |
+
# Check if the image is a PyTorch Tensor, if so, use it directly
|
27 |
+
if isinstance(image, torch.Tensor):
|
28 |
+
img_batch = image.unsqueeze(0).to(device)
|
29 |
+
elif isinstance(image, np.ndarray): # Check if the image is a numpy ndarray
|
30 |
+
# Convert numpy ndarray to PIL Image
|
31 |
+
img = Image.fromarray(image)
|
32 |
+
# Transform the image
|
33 |
+
img_transformed = transform(img)
|
34 |
+
# Convert to a batch of 1 and send to device
|
35 |
+
img_batch = img_transformed.unsqueeze(0).to(device)
|
36 |
+
else:
|
37 |
+
# Load the image and apply transformations
|
38 |
+
img = Image.open(image)
|
39 |
+
img_transformed = transform(img)
|
40 |
+
img_batch = img_transformed.unsqueeze(0).to(device)
|
41 |
+
|
42 |
+
# Make predictions
|
43 |
+
with torch.no_grad():
|
44 |
+
_, predicted_idx = model(img_batch).max(1)
|
45 |
+
|
46 |
+
# Map the index to the class name
|
47 |
+
predicted_class = classes[predicted_idx.item()]
|
48 |
+
|
49 |
+
return predicted_class
|
50 |
+
|
51 |
+
examples = ["https://img.freepik.com/free-photo/fantasy-style-clouds_23-2151057636.jpg?size=338&ext=jpg&ga=GA1.1.87170709.1707609600&semt=sph",
|
52 |
+
"https://energyeducation.ca/wiki/images/5/51/Smoke_column_-_High_Park_Wildfire_%281%29.jpg",
|
53 |
+
"https://img-aws.ehowcdn.com/360x267p/s3-us-west-1.amazonaws.com/contentlab.studiod/getty/31a4debc7443411195df509e38a5f9a3.jpg",
|
54 |
+
"https://thumb.bibliocad.com/images/content/00000000/9000/9813.jpg",
|
55 |
+
"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRC7j2LoW8D13BOgbT_9J2SI_krX0sadT4oaSuyFjNb3jElJdU-J7DpPgCYvEfFzqoD6c0&usqp=CAU"]
|
56 |
+
|
57 |
+
|
58 |
+
css = """
|
59 |
+
h1 {
|
60 |
+
text-align: center;
|
61 |
+
display:block;
|
62 |
+
}
|
63 |
+
"""
|
64 |
+
|
65 |
+
with gr.Blocks(theme=gr.themes.Base(primary_hue="zinc",
|
66 |
+
secondary_hue="neutral",
|
67 |
+
neutral_hue="slate",
|
68 |
+
font = gr.themes.GoogleFont("Montserrat")),
|
69 |
+
css = css,
|
70 |
+
title="Smoke Detection") as demo:
|
71 |
+
|
72 |
+
demo.load(None, None, js="""
|
73 |
+
() => {
|
74 |
+
const params = new URLSearchParams(window.location.search);
|
75 |
+
if (!params.has('__theme')) {
|
76 |
+
params.set('__theme', 'light');
|
77 |
+
window.location.search = params.toString();
|
78 |
+
}
|
79 |
+
}""",
|
80 |
+
)
|
81 |
+
|
82 |
+
markdown_content = """
|
83 |
+
<img src='file/dd_logo.png' width='200'>
|
84 |
+
"""
|
85 |
+
gr.Markdown(markdown_content)
|
86 |
+
gr.Markdown("# 🔥 Wczesne rozpoznawanie pożarów 🔥")
|
87 |
+
|
88 |
+
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.
|
89 |
+
### 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.""")
|
90 |
+
|
91 |
+
with gr.Accordion("Więcej informacji", open = False):
|
92 |
+
gr.Markdown("""Nasilenie się pożarów, potęgowane przez zmiany klimatyczne, stanowi poważne wyzwanie w szybkiej detekcji i reagowaniu.
|
93 |
+
Tradycyjne metody wykrywania pożarów, takie jak obserwacja ludzka i raporty, często okazują się zbyt wolne, zwłaszcza na obszarach oddalonych.
|
94 |
+
Automatyczne systemy wykrywania dymu oferują rozwiązanie, wykorzystując głębokie uczenie do szybkiego i dokładnego identyfikowania dymu na obrazach.
|
95 |
+
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,
|
96 |
+
co umożliwia szybsze czas reakcji i potencjalnie ratuje ogromne obszary regionów naturalnych i mieszkalnych przed zniszczeniem.
|
97 |
+
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.""")
|
98 |
+
|
99 |
+
with gr.Column():
|
100 |
+
image = gr.Image(label = "Obraz")
|
101 |
+
|
102 |
+
gallery = gr.Gallery(value = examples, label="Przykładowe zdjęcia",columns=[4], rows=[1], height=200, object_fit = "scale-down")
|
103 |
+
|
104 |
+
def get_select_index(evt: gr.SelectData):
|
105 |
+
return examples[evt.index]
|
106 |
+
|
107 |
+
gallery.select(get_select_index, None, image)
|
108 |
+
action = gr.Button("Rozpoznaj")
|
109 |
+
prediction = gr.Textbox(label = "Predykcja")
|
110 |
+
|
111 |
+
action.click(fn=predict, inputs=image, outputs=prediction)
|
112 |
+
|
113 |
+
demo.launch(width = "75%", debug = True, allowed_paths=["/"])
|