Spaces:
Sleeping
Sleeping
import torch | |
import torch.nn as nn | |
import torch.nn.functional as F | |
from torch.utils.data import Dataset, DataLoader | |
from torchvision import transforms | |
from transformers import ViTForImageClassification | |
from PIL import Image | |
import os | |
import pandas as pd | |
class CustomDataset(Dataset): | |
def __init__(self, dataframe, transform=None): | |
self.dataframe = dataframe | |
self.transform = transform | |
def __len__(self): | |
return len(self.dataframe) | |
def __getitem__(self, idx): | |
image_path = self.dataframe.iloc[idx, 0] # Image path is in the first column | |
image = Image.open(image_path).convert('RGB') # Convert to RGB format | |
if self.transform: | |
image = self.transform(image) | |
return image | |
if __name__ == "__main__": | |
# Check for GPU availability | |
device = torch.device('cuda') | |
# Load the pre-trained ViT model and move it to GPU | |
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224').to(device) | |
model.classifier = nn.Linear(model.config.hidden_size, 2).to(device) | |
# Define the image preprocessing pipeline | |
preprocess = transforms.Compose([ | |
transforms.Resize((224, 224)), | |
transforms.ToTensor() | |
]) | |
# Load the test dataset | |
### need to recive image from gratio/streamlit | |
test_set = 'datasets/' | |
image_paths = [] | |
for filename in os.listdir(test_set): | |
image_paths.append(os.path.join(test_set, filename)) | |
dataset = pd.DataFrame({'image_path': image_paths}) | |
test_dataset = CustomDataset(dataset, transform=preprocess) | |
test_loader = DataLoader(test_dataset, batch_size=32) | |
# Load the trained model | |
model.load_state_dict(torch.load('trained_model.pth')) | |
# Evaluate the model | |
model.eval() | |
confidences = [] | |
predicted_labels = [] | |
with torch.no_grad(): | |
for images in test_loader: | |
images = images.to(device) | |
outputs = model(images) | |
logits = outputs.logits # Extract logits from the output | |
probabilities = F.softmax(logits, dim=1) | |
confidences_per_image, predicted = torch.max(probabilities, 1) | |
predicted_labels.extend(predicted.cpu().numpy()) | |
confidences.extend(confidences_per_image.cpu().numpy()) | |
print(predicted_labels) | |
print(confidences) | |
confidence_percentages = [confidence * 100 for confidence in confidences] | |
for label, confidence in zip(predicted_labels, confidence_percentages): | |
print(f"Predicted label: {label}, Confidence: {confidence:.2f}%") | |