Spaces:
Runtime error
Runtime error
Yohan Runhaar
commited on
Commit
Β·
56ae707
1
Parent(s):
cccde55
add examples
Browse files- app.py +49 -6
- examples.json +16 -0
app.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
import gradio as gr
|
2 |
import torch
|
3 |
import os
|
|
|
|
|
4 |
import matplotlib.pyplot as plt
|
5 |
from ultralytics import YOLO
|
6 |
|
@@ -11,7 +13,9 @@ model_names = [
|
|
11 |
|
12 |
current_model_name = "yolov8_xlarge_latest.pt"
|
13 |
model_dir = "models"
|
|
|
14 |
os.makedirs(model_dir, exist_ok=True)
|
|
|
15 |
|
16 |
# Download models if not already present locally
|
17 |
HF_MODELS_REPO = "https://huggingface.co/reefsupport/coral-ai/resolve/main/models"
|
@@ -26,6 +30,37 @@ for model_name in model_names:
|
|
26 |
model = YOLO(os.path.join(model_dir, current_model_name))
|
27 |
|
28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
def compute_class_areas(predictions, image_shape):
|
30 |
"""
|
31 |
Compute the area percentage covered by each class for the prediction.
|
@@ -59,6 +94,7 @@ def generate_coverage_graph(class_areas):
|
|
59 |
plt.xlabel("Class")
|
60 |
plt.ylabel("Coverage Percentage")
|
61 |
plt.title("Class Coverage as % of Total Image")
|
|
|
62 |
graph_path = "class_coverage.png"
|
63 |
plt.savefig(graph_path)
|
64 |
plt.close()
|
@@ -87,6 +123,18 @@ def coral_ai_inference(image, model_name):
|
|
87 |
return rendered_image, graph_path
|
88 |
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
# Define Gradio interface
|
91 |
inputs = [
|
92 |
gr.Image(type="numpy", label="Input Image"),
|
@@ -100,12 +148,7 @@ outputs = [
|
|
100 |
|
101 |
title = "Coral AI Demo"
|
102 |
|
103 |
-
examples =
|
104 |
-
# Uncomment and add your example images here if needed
|
105 |
-
# ["examples/coral_image1.jpg", "yolov8_xlarge_latest.pt"],
|
106 |
-
# ["examples/coral_image2.jpg", "yolov8_xlarge_latest.pt"],
|
107 |
-
# ["examples/coral_image3.jpg", "yolov8_xlarge_latest.pt"],
|
108 |
-
]
|
109 |
|
110 |
demo_app = gr.Interface(
|
111 |
fn=coral_ai_inference,
|
|
|
1 |
import gradio as gr
|
2 |
import torch
|
3 |
import os
|
4 |
+
import json
|
5 |
+
import requests
|
6 |
import matplotlib.pyplot as plt
|
7 |
from ultralytics import YOLO
|
8 |
|
|
|
13 |
|
14 |
current_model_name = "yolov8_xlarge_latest.pt"
|
15 |
model_dir = "models"
|
16 |
+
examples_dir = "examples"
|
17 |
os.makedirs(model_dir, exist_ok=True)
|
18 |
+
os.makedirs(examples_dir, exist_ok=True)
|
19 |
|
20 |
# Download models if not already present locally
|
21 |
HF_MODELS_REPO = "https://huggingface.co/reefsupport/coral-ai/resolve/main/models"
|
|
|
30 |
model = YOLO(os.path.join(model_dir, current_model_name))
|
31 |
|
32 |
|
33 |
+
def download_examples(json_file="examples.json"):
|
34 |
+
"""
|
35 |
+
Download example images specified in the JSON file and save them in the examples directory.
|
36 |
+
"""
|
37 |
+
if not os.path.exists(json_file):
|
38 |
+
print(f"Examples JSON file '{json_file}' not found. Skipping example download.")
|
39 |
+
return
|
40 |
+
|
41 |
+
with open(json_file, "r") as f:
|
42 |
+
data = json.load(f)
|
43 |
+
|
44 |
+
for example in data["examples"]:
|
45 |
+
image_name = example["name"].replace(" ", "_").lower() + ".jpg"
|
46 |
+
image_path = os.path.join(examples_dir, image_name)
|
47 |
+
|
48 |
+
if not os.path.exists(image_path): # Skip if already downloaded
|
49 |
+
print(f"Downloading {example['name']}...")
|
50 |
+
response = requests.get(example["url"], stream=True)
|
51 |
+
if response.status_code == 200:
|
52 |
+
with open(image_path, "wb") as img_file:
|
53 |
+
for chunk in response.iter_content(1024):
|
54 |
+
img_file.write(chunk)
|
55 |
+
print(f"Saved {example['name']} to {image_path}")
|
56 |
+
else:
|
57 |
+
print(f"Failed to download {example['name']}: {response.status_code}")
|
58 |
+
|
59 |
+
|
60 |
+
# Download example images
|
61 |
+
download_examples()
|
62 |
+
|
63 |
+
|
64 |
def compute_class_areas(predictions, image_shape):
|
65 |
"""
|
66 |
Compute the area percentage covered by each class for the prediction.
|
|
|
94 |
plt.xlabel("Class")
|
95 |
plt.ylabel("Coverage Percentage")
|
96 |
plt.title("Class Coverage as % of Total Image")
|
97 |
+
plt.ylim(0, 100) # Always show the Y-axis up to 100%
|
98 |
graph_path = "class_coverage.png"
|
99 |
plt.savefig(graph_path)
|
100 |
plt.close()
|
|
|
123 |
return rendered_image, graph_path
|
124 |
|
125 |
|
126 |
+
# Dynamically generate Gradio examples
|
127 |
+
def generate_examples(json_file="examples.json"):
|
128 |
+
"""
|
129 |
+
Generate Gradio examples from the examples.json file.
|
130 |
+
"""
|
131 |
+
if not os.path.exists(json_file):
|
132 |
+
return []
|
133 |
+
with open(json_file, "r") as f:
|
134 |
+
data = json.load(f)
|
135 |
+
return [[os.path.join(examples_dir, example["name"].replace(" ", "_").lower() + ".jpg"), current_model_name] for example in data["examples"]]
|
136 |
+
|
137 |
+
|
138 |
# Define Gradio interface
|
139 |
inputs = [
|
140 |
gr.Image(type="numpy", label="Input Image"),
|
|
|
148 |
|
149 |
title = "Coral AI Demo"
|
150 |
|
151 |
+
examples = generate_examples()
|
|
|
|
|
|
|
|
|
|
|
152 |
|
153 |
demo_app = gr.Interface(
|
154 |
fn=coral_ai_inference,
|
examples.json
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"examples": [
|
3 |
+
{
|
4 |
+
"name": "Coral Image 1",
|
5 |
+
"url": "https://ff6425733e9f062e720f6be3fac30eb5ee58537bb4b0958e4776d9f-apidata.googleusercontent.com/download/storage/v1/b/rs_storage_open/o/benthic_datasets%2Fmask_labels%2Freef_support%2FSEAVIEW_PAC_AUS%2Fimages%2F10001003901.jpg?jk=AXvcXDu354Gu6Ir26-lj0fdx9wUNUA9n7j6eMT3SYVnvA1PbTTPHKFBKWgZl1sgV6mySj4B8lIlrF75kW1WuQZKq1_1JjbF4bQUglPDbRZZSFhPOvLy4kRS5QW4WP2q9_xz5qcdvRZUej-hDlWWq-ctVGM4S_8U19w1DpEf7_-zQIPBJ2dz9Ghn5Nx0X-zeIqYpD3vUgtfnOf_t_2zyY75lPPmu-JjaUirUUULPLHUNNbHc-9AKhpy7faRZVsmMaj_emFCNGkYFFMCHmQ5suEfSfdRuEvp2S4chOgUFdnJSSDxzkGC7FvfdZDwzcU_fr2exRLOSXkBFpbKsHhso-jmYXL8NsbBg3I_dYgjJUqRnYFqKoAWF7epXTR3foEgAoJGQD_mDmacIyPz-k43GMWK0qJ-kSKbmppqgiadYd03INcq6wz7jMZ27ydlLBBkIPwpg9Hb5DtU7ZksfkV7q9rVaxDDSVltdZrhs-6Q7FllTmIE5Rnbuu3MNm0zKjUtCDtuVr54-6tb_SF9E4OTYyrC_Jq_-nkjrqzg9EVt6asxGPJNy6AzV8i0XBNisdLHEL3rgzV7dhKsRCgxYRKeag1lCJLKif_Zmx4R-MjTrg901g0lQk0w27IRNcZGKhnMR4XciPdTRmm2t6C2-vFti_zsMF9nt2lwOJ31a9A2RmYPOTkOUZMrEw0RbMqFvSWfcjeMbfkq36A2tmH3W7OAqKvm7DHbkJkWRtG9ftyEGoGpEsIIchCks5zKPKQU6aLJveaj3adWw6xTri0dEbhQb6Ocbx4A4VEBHVT3ZuXdI2TwsyZsoreC6qv6A_R9q_QNtA-PSZJX_bIXhYpSovSjOb54EpkBsZSRVM-o-QCXnNrNCVuKd-aJf4oPf_SNo7k-R0r0IpLB5Cs90X8OhOzblbKcU4JJWNaLuI5bQqO0RG_2yOikQTWzMSI804jVS_o25CwZYejh8K5JuznsKDS8ZlPqd2pmhvbwupgffb6wkhRsutdWpQE0yNh3vP7GLp75Dge1k6azxJfmbpN4ke3n41tziBaXmwZl5OYYDv-GjqmTRYylJpahVgf-N0i7WxQmZ0BkCyGdiNgGT9yg1VCEycnL5iJY6XUewuWydgHqSHdFAc5qL4QV-quZeW-qaHhQKMHakYRaKsfx-EENhqhNiuc0o1P3ZqNAh5v7L0DVM1if5jR_IskZR4HTbV3zDzs5dEBNbkCyI1-RclTDiymjbus2AXOsgLgcgk&isca=1"
|
6 |
+
},
|
7 |
+
{
|
8 |
+
"name": "Coral Image 2",
|
9 |
+
"url": "https://ff15f33419c2f164c60ed7dc399f4c76b458b9d46ae7da5e93faef6-apidata.googleusercontent.com/download/storage/v1/b/rs_storage_open/o/benthic_datasets%2Fmask_labels%2Freef_support%2FTETES_PROVIDENCIA%2Fimages%2FG0088426.JPG?jk=AXvcXDsnIsC7e2uC41Ghooe2-unlhJF8V-aJbdI7-1U2ikEHpQdHIh7CIxQckimMvmISRyqViaHANvr5fp9b4g7g9U9H0MKVHL_Fm5d0WuJUo8WNUM8BNGrGf47O5Xk6lh3u032z5xDcYm9i0M1MW_glwvZCxAkYCnnHHNe27Pxxs1LSz6Kn30rLOD_YP43eHou-CCB2QnoGZNI1k9vKjyOO-L_dzIa_ZyHlsSXZ6-JR2RfGddhhycZZws8lkb3z16NcN94iMpUe7cnPePebz6fOs1Op0mDCJs-oYVlW4syI_dyJdMxGHDdZkgOGtOQWaWm4FoBkIuFW5dcJXZ0fOIB5EuhUNSib5SX4GJNlgghb0v016kyvGS-YuZL_An33_tbhjKcXzf4FEZpEvTEkR4CJCYzthI4Gq0dX2A8_WSsuKcc5Z5mvHi8Xogxq3wJQruquA3MQQCuF9gOQgmw2o-jHN3iCIRwtmGeRoGM62wyye2zm0SXf2dfE7QSBDw5yQ1Tp2a47eiF6SLws_FNqt0VapPPtG0i0WIo1Tbi4sVoJw110K41vuoyQlRTea0tpy0LZPsF-iPluaLCBw5RNHHogCXHYJpc5m88kf4589KM6jX0HlcmVxhmwBHX4gkOER_YYYNl4Vg0rwpFodW0US90qTLWM-HanlJV1cW0PrPv-HMsaYZSwTcWqJajdlJRNUffY7CRMTf0jqEYJKgO0f9aiPFG4NYn04gGTBy22HB4wltzUYEOmaYU_y6PSW9kxHfwwFc56mtYpR2Eh3WWI7kHMsWKizD1iHfoMXmIz-zj1_MQLIiovcMN24Osx-jKUYA4bREBvZjMuXHK85KdoJ3w7e4inm9SBJ_Uh2BWWgj4I1_-r3n1Dh8A919Z8Zn1o1Tne1frw7c2xgBrhkuIP-O9l-Yi1Ti7caRhqA_SHXFEbObKPABa5lDjG8rf5P_oIPUnR_XUjRqSIl0WUvCVvusFnIpn_RhnP5BJcajXwMEI1IYkyeknFKyU_PEaloca84tqWZmvlDwWfdf3f7RL-P7NqnddDn7p4qaOv2buVb8TG4EsTxH5QmwTdEhU2JWrSHJntDtoeSfygIXgi2UNJxsAtbSmRGBVdBjr5jdufpaKPOfa0_v3poMELcX-3qej85ZHsK7s5rAX_LLMnuMgMPzu-8Ek5PWNoGrNMgqShC_uB5hUmxNyOpvAVizDwGDMo_ZAXvrAiTmLF1WEIrzDLtTB0h9bFMMU&isca=1"
|
10 |
+
},
|
11 |
+
{
|
12 |
+
"name": "Coral Image 3",
|
13 |
+
"url": "https://ff96014f4614cc73cfb9ab8971ba96dad8f24cca53c41cdfa1203a8-apidata.googleusercontent.com/download/storage/v1/b/rs_storage_open/o/benthic_datasets%2Fmask_labels%2Freef_support%2FSEAFLOWER_BOLIVAR%2Fimages%2F20220912_AnB_CB10%20(122).JPG?jk=AXvcXDsxQMWfpdBFpQtmBnK8or0mpwg7a-fMssxizWt5SecBDKydOWT6R-Hy0wpEY3AJE3VSBne9KRBnq1j0g_rhq2fOw5i4adjH5UqsQy_r6ZIpRAAZ3krzBoinrVrjKs9bqb7Ap204Dpw9C4F8II9zsoJs-_cFMhft-34fBFE-F6RaBusOQb8C7covKRe6iVaABSNAoqSU7kWqYdE52qTlqfvTPA4e5v2i6QJ5mFP2PFNb5N3J0VgLlsuviFr4uQyPeEu-Q6CSjcUuWP3pfeNqJJSL_U7I0IurOKqjLZYbg6jm7TLZeyk6yh6GBpTJ_LM4PaxCastzoMvbZboeqxaigpLzLJ88JijHDs5UQHNBGdvU1FOpgxj1jUjeqLB0Xl4iTWwQw1npL4_iIp01UV2pSF3U6o1QXQTrMmfW3DXj5V4pBX4JbkQtUCoOxY53ASdeLm5w9lyzlSm_eQen3Yx_o36LJrrlP2NGlxhTrbkwyx9zvSaRogxnwQKkjB01XkQzwxcb9wFcY1aaWNMF5pMoSj_6FIrQUKr-rpgIJscsbnf9uJcjFYcD9ypaQZ9enOzSTRVAbuMC0bC9n-pX6pc5_qTqgtSMOzLq5gOAYP4vPy5lkAAkLicrmRIu-jr8OKwb-PLXjXsi4nBcXT__DkLsXe7YWD_wbf1zru2EPTh1TWn7JtZJaYXKOmkX4bueTI_bt-3Av_EoGM_GDWu9hrlMPFmfyzWzy01ey60UMv04x0MjnIomXdkxVl9iX4TBFO2yEHw7FqyZte_Wm5LbhaLcLeYEXe_vi7T7mEKCbAmUgfD0na5L5GevrQt46xW3KpPKp2kSf3ZwV0u-iNIg5uWWRrtZ-JkjZZUpnimYssxJOks37Ube-dhaQB17V-xhVmCMTLcE2ILw_FplPZO-UJti3b7NwIAn4OV5lvWsTjyvGhHxQswT89ytn1wraGA0C0-CijiD_1Nkh69Jx5m_9mBzhlUlg64Rvsyk49Y3db6n9iVt0mVsvQYrVhPgIqqy0hWyAXk3cX40CtpjC5RQfl_0Pp89gUJgx9YZE4oM0pP-JEINELXnuMwOawMRGGE5BQ8TiAy_GEVaHNvIONgkxuWCNzwVNR9rPrZ60XE1DSVxfDPTpGFRqkoVDdRCJltU7MxAPrhlHgRYLSxprxD72lfewnp2UlWp6YSyPnxGjERhjweAb2UbwsEsr8i_7DURxFAc1BxQMcdObn3Lg3wCNm1A86kw17EBHMPu2hXfVeww3l6acaIO1A&isca=1"
|
14 |
+
}
|
15 |
+
]
|
16 |
+
}
|