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()