|
|
|
import os |
|
import torch |
|
from torchvision import models, transforms |
|
from torch.utils.data import Dataset, DataLoader |
|
from PIL import Image |
|
import pandas as pd |
|
|
|
class InferenceDataset(Dataset): |
|
def __init__(self, folder, transform): |
|
self.paths = [os.path.join(folder, f) for f in os.listdir(folder) |
|
if f.lower().endswith(("png", "jpg", "jpeg"))] |
|
self.transform = transform |
|
|
|
def __len__(self): |
|
return len(self.paths) |
|
|
|
def __getitem__(self, idx): |
|
img = Image.open(self.paths[idx]).convert("RGB") |
|
return self.transform(img), self.paths[idx] |
|
|
|
def run_inference(image_folder, output_csv="predictions.csv"): |
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
|
model = models.resnet18(pretrained=True) |
|
for p in model.parameters(): |
|
p.requires_grad = False |
|
model.fc = torch.nn.Linear(model.fc.in_features, 1) |
|
model = model.to(device) |
|
model.eval() |
|
|
|
transform = transforms.Compose([ |
|
transforms.Resize((224, 224)), |
|
transforms.ToTensor(), |
|
transforms.Normalize([0.485, 0.456, 0.406], |
|
[0.229, 0.224, 0.225]) |
|
]) |
|
|
|
dataset = InferenceDataset(image_folder, transform) |
|
loader = DataLoader(dataset, batch_size=1, shuffle=False) |
|
|
|
results = [] |
|
with torch.no_grad(): |
|
for img, path in loader: |
|
img = img.to(device) |
|
pred = torch.sigmoid(model(img)).item() |
|
label = "Dog" if pred >= 0.5 else "Cat" |
|
results.append({"image_path": path[0], "prediction": label, "score": pred}) |
|
|
|
pd.DataFrame(results).to_csv(output_csv, index=False) |
|
|