Spaces:
Sleeping
Sleeping
danielhshi8224
commited on
Commit
·
c458c3e
1
Parent(s):
f572b0e
Initialize repo
Browse files- .gradio/certificate.pem +31 -0
- app.py +23 -3
- convert_model.py +26 -0
- convnext-tiny-224-7clss +1 -0
- predictions__kd1zves.csv +7 -0
- predictions_bxv4glpg.csv +3 -0
- predictions_pwda2f57.csv +7 -0
- predictions_x0bfvcix.csv +6 -0
.gradio/certificate.pem
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-----BEGIN CERTIFICATE-----
|
| 2 |
+
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
|
| 31 |
+
-----END CERTIFICATE-----
|
app.py
CHANGED
|
@@ -116,6 +116,8 @@ import torch.nn.functional as F
|
|
| 116 |
from transformers import AutoImageProcessor, AutoModelForImageClassification
|
| 117 |
from PIL import Image
|
| 118 |
import os
|
|
|
|
|
|
|
| 119 |
|
| 120 |
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 121 |
MODEL_ID = "dshi01/convnext-tiny-224-7clss"
|
|
@@ -152,7 +154,7 @@ def classify_images_batch(files):
|
|
| 152 |
- table: list of rows for Dataframe
|
| 153 |
"""
|
| 154 |
if not files:
|
| 155 |
-
return [], []
|
| 156 |
|
| 157 |
# Keep at most 10
|
| 158 |
files = files[:MAX_BATCH]
|
|
@@ -170,7 +172,7 @@ def classify_images_batch(files):
|
|
| 170 |
continue
|
| 171 |
|
| 172 |
if not pil_images:
|
| 173 |
-
return [], []
|
| 174 |
|
| 175 |
# Batch preprocess + forward
|
| 176 |
inputs = processor(images=pil_images, return_tensors="pt")
|
|
@@ -200,7 +202,24 @@ def classify_images_batch(files):
|
|
| 200 |
", ".join(map(str, top3_scores)),
|
| 201 |
])
|
| 202 |
|
| 203 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
|
| 205 |
# ---------- UI ----------
|
| 206 |
single = gr.Interface(
|
|
@@ -221,6 +240,7 @@ batch = gr.Interface(
|
|
| 221 |
label="Predictions Table",
|
| 222 |
wrap=True
|
| 223 |
)
|
|
|
|
| 224 |
],
|
| 225 |
title="🌊 BenthicAI - Batch (up to 10)",
|
| 226 |
description="Upload multiple images (max 10). Outputs a gallery with captions and a table of top predictions.",
|
|
|
|
| 116 |
from transformers import AutoImageProcessor, AutoModelForImageClassification
|
| 117 |
from PIL import Image
|
| 118 |
import os
|
| 119 |
+
import csv
|
| 120 |
+
import tempfile
|
| 121 |
|
| 122 |
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 123 |
MODEL_ID = "dshi01/convnext-tiny-224-7clss"
|
|
|
|
| 154 |
- table: list of rows for Dataframe
|
| 155 |
"""
|
| 156 |
if not files:
|
| 157 |
+
return [], [], None
|
| 158 |
|
| 159 |
# Keep at most 10
|
| 160 |
files = files[:MAX_BATCH]
|
|
|
|
| 172 |
continue
|
| 173 |
|
| 174 |
if not pil_images:
|
| 175 |
+
return [], [], None
|
| 176 |
|
| 177 |
# Batch preprocess + forward
|
| 178 |
inputs = processor(images=pil_images, return_tensors="pt")
|
|
|
|
| 202 |
", ".join(map(str, top3_scores)),
|
| 203 |
])
|
| 204 |
|
| 205 |
+
# Create CSV for download
|
| 206 |
+
csv_path = None
|
| 207 |
+
try:
|
| 208 |
+
# Write CSV into a temp file inside project dir so Gradio can serve it
|
| 209 |
+
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv", prefix="predictions_", dir=BASE_DIR, mode="w", newline='', encoding='utf-8')
|
| 210 |
+
writer = csv.writer(tmp)
|
| 211 |
+
# headers
|
| 212 |
+
writer.writerow(["filename", "top1_label", "top1_conf", "top3_labels", "top3_confs"])
|
| 213 |
+
for row in table_rows:
|
| 214 |
+
writer.writerow(row)
|
| 215 |
+
tmp.flush()
|
| 216 |
+
tmp.close()
|
| 217 |
+
csv_path = tmp.name
|
| 218 |
+
except Exception:
|
| 219 |
+
# If CSV can't be created, return None for the file but keep other outputs
|
| 220 |
+
csv_path = None
|
| 221 |
+
|
| 222 |
+
return gallery, table_rows, csv_path
|
| 223 |
|
| 224 |
# ---------- UI ----------
|
| 225 |
single = gr.Interface(
|
|
|
|
| 240 |
label="Predictions Table",
|
| 241 |
wrap=True
|
| 242 |
)
|
| 243 |
+
, gr.File(label="Download CSV")
|
| 244 |
],
|
| 245 |
title="🌊 BenthicAI - Batch (up to 10)",
|
| 246 |
description="Upload multiple images (max 10). Outputs a gallery with captions and a table of top predictions.",
|
convert_model.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from transformers import ConvNextForImageClassification, AutoConfig, AutoImageProcessor
|
| 3 |
+
|
| 4 |
+
ckpt_path = "./ConvNextmodel.pth"
|
| 5 |
+
base_model = "facebook/convnext-tiny-224" # the model you started from
|
| 6 |
+
num_labels = 7
|
| 7 |
+
|
| 8 |
+
# 1️⃣ Load the raw state dict
|
| 9 |
+
state_dict = torch.load(ckpt_path, map_location="cpu")
|
| 10 |
+
if any(k.startswith("module.") for k in state_dict):
|
| 11 |
+
state_dict = {k.replace("module.", "", 1): v for k, v in state_dict.items()}
|
| 12 |
+
|
| 13 |
+
# 2️⃣ Rebuild config and model
|
| 14 |
+
config = AutoConfig.from_pretrained(base_model)
|
| 15 |
+
config.num_labels = num_labels
|
| 16 |
+
model = ConvNextForImageClassification(config)
|
| 17 |
+
missing, unexpected = model.load_state_dict(state_dict, strict=True)
|
| 18 |
+
print("Missing:", missing, "Unexpected:", unexpected)
|
| 19 |
+
|
| 20 |
+
# 3️⃣ Save in HF format
|
| 21 |
+
save_dir = "./convnext-tiny-224-7cls"
|
| 22 |
+
model.save_pretrained(save_dir)
|
| 23 |
+
|
| 24 |
+
# 4️⃣ Also save processor (for transforms)
|
| 25 |
+
processor = AutoImageProcessor.from_pretrained(base_model)
|
| 26 |
+
processor.save_pretrained(save_dir)
|
convnext-tiny-224-7clss
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Subproject commit 894a78d86e64973931c5a906bdddd472b5007e6f
|
predictions__kd1zves.csv
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
filename,top1_label,top1_conf,top3_labels,top3_confs
|
| 2 |
+
2022_9817.jpg,Crab,0.9908,"Crab, Whelk, Skate","0.9908, 0.0056, 0.0013"
|
| 3 |
+
2022_9829.jpg,Crab,0.9915,"Crab, Whelk, Roundfish","0.9915, 0.0028, 0.0018"
|
| 4 |
+
2022_9837.jpg,Roundfish,0.989,"Roundfish, Flatfish, Eel","0.989, 0.0089, 0.001"
|
| 5 |
+
2022_9839.jpg,Roundfish,0.9985,"Roundfish, Eel, Flatfish","0.9985, 0.0005, 0.0002"
|
| 6 |
+
2022_9842.jpg,Crab,0.9892,"Crab, Scallop, Skate","0.9892, 0.0053, 0.002"
|
| 7 |
+
2022_9844.jpg,Crab,0.992,"Crab, Skate, Flatfish","0.992, 0.0025, 0.0022"
|
predictions_bxv4glpg.csv
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
filename,top1_label,top1_conf,top3_labels,top3_confs
|
| 2 |
+
2022_9817.jpg,Crab,0.9908,"Crab, Whelk, Skate","0.9908, 0.0056, 0.0013"
|
| 3 |
+
2022_9829.jpg,Crab,0.9915,"Crab, Whelk, Roundfish","0.9915, 0.0028, 0.0018"
|
predictions_pwda2f57.csv
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
filename,top1_label,top1_conf,top3_labels,top3_confs
|
| 2 |
+
2022_9817.jpg,Crab,0.9908,"Crab, Whelk, Skate","0.9908, 0.0056, 0.0013"
|
| 3 |
+
2022_9829.jpg,Crab,0.9915,"Crab, Whelk, Roundfish","0.9915, 0.0028, 0.0018"
|
| 4 |
+
2022_9837.jpg,Roundfish,0.989,"Roundfish, Flatfish, Eel","0.989, 0.0089, 0.001"
|
| 5 |
+
2022_9839.jpg,Roundfish,0.9985,"Roundfish, Eel, Flatfish","0.9985, 0.0005, 0.0002"
|
| 6 |
+
2022_9842.jpg,Crab,0.9892,"Crab, Scallop, Skate","0.9892, 0.0053, 0.002"
|
| 7 |
+
2022_9844.jpg,Crab,0.992,"Crab, Skate, Flatfish","0.992, 0.0025, 0.0022"
|
predictions_x0bfvcix.csv
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
filename,top1_label,top1_conf,top3_labels,top3_confs
|
| 2 |
+
2022_9817.jpg,Crab,0.9908,"Crab, Whelk, Skate","0.9908, 0.0056, 0.0013"
|
| 3 |
+
2022_9829.jpg,Crab,0.9915,"Crab, Whelk, Roundfish","0.9915, 0.0028, 0.0018"
|
| 4 |
+
2022_9837.jpg,Roundfish,0.989,"Roundfish, Flatfish, Eel","0.989, 0.0089, 0.001"
|
| 5 |
+
2022_9839.jpg,Roundfish,0.9985,"Roundfish, Eel, Flatfish","0.9985, 0.0005, 0.0002"
|
| 6 |
+
2022_9842.jpg,Crab,0.9892,"Crab, Scallop, Skate","0.9892, 0.0053, 0.002"
|