Spaces:
Sleeping
Sleeping
import os | |
from huggingface_hub import Repository | |
import numpy as np | |
import pandas as pd | |
# Retrieve the token from the environment variables | |
token = os.environ.get("token") | |
repo = Repository( | |
local_dir="SVD", | |
repo_type="model", | |
clone_from="robocan/GeoG_City", | |
token=token | |
) | |
repo.git_pull() | |
import torch | |
from torch.utils.data import Dataset, DataLoader | |
import pandas as pd | |
import numpy as np | |
import io | |
import joblib | |
import requests | |
from tqdm import tqdm | |
from PIL import Image | |
from torchvision import transforms | |
from sklearn.preprocessing import LabelEncoder | |
from sklearn.model_selection import train_test_split | |
from torchvision import models | |
import gradio as gr | |
device = 'cpu' | |
le = LabelEncoder() | |
le = joblib.load("SVD/le.gz") | |
len_classes = len(le.classes_) + 1 | |
class ModelPre(torch.nn.Module): | |
def __init__(self): | |
super().__init__() | |
self.embedding = torch.nn.Sequential( | |
*list(models.convnext_small(weights=models.ConvNeXt_Small_Weights.IMAGENET1K_V1).children())[:-1], | |
torch.nn.Flatten(), | |
torch.nn.Linear(in_features=768,out_features=512), | |
torch.nn.ReLU(), | |
torch.nn.Linear(in_features=512,out_features=len_classes), | |
) | |
# Freeze all layers | |
def forward(self, data): | |
return self.embedding(data) | |
model = torch.load("SVD/GeoG.pth", map_location=torch.device(device)) | |
modelm = ModelPre() | |
modelm.load_state_dict(model['model']) | |
import warnings | |
warnings.filterwarnings("ignore", category=RuntimeWarning, module="multiprocessing.popen_fork") | |
cmp = transforms.Compose([ | |
transforms.ToTensor(), | |
transforms.Resize(size=(224, 224), antialias=True), | |
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), | |
]) | |
def predict(input_img): | |
with torch.inference_mode(): | |
img = cmp(input_img).unsqueeze(0) | |
res = modelm(img.to(device)) | |
probabilities = torch.softmax(res, dim=1).cpu().numpy().flatten() | |
top_10_indices = np.argsort(probabilities)[-10:][::-1] | |
top_10_probabilities = probabilities[top_10_indices] | |
top_10_predictions = le.inverse_transform(top_10_indices) | |
results = {top_10_predictions[i]: float(top_10_probabilities[i]) for i in range(10)} | |
return results | |
def create_bar_plot(predictions): | |
data = pd.DataFrame(list(predictions.items()), columns=["Location", "Probability"]) | |
return gr.BarPlot( | |
data, | |
x="Location", | |
y="Probability", | |
title="Top 10 Predictions with Probabilities", | |
tooltip=["Location", "Probability"], | |
y_lim=[0, 1] | |
) | |
def predict_and_plot(input_img): | |
predictions = predict(input_img) | |
return create_bar_plot(predictions) | |
gradio_app = gr.Interface( | |
fn=predict_and_plot, | |
inputs=gr.Image(label="Upload an Image", type="pil"), | |
outputs=gr.BarPlot(), | |
title="Predict the Location of this Image" | |
) | |
if __name__ == "__main__": | |
gradio_app.launch() |