import json
import requests
from pathlib import Path
from PIL import Image
from torch.utils.data import Dataset, DataLoader
import torchvision.transforms as T
class AvalaDataset(Dataset):
"""PyTorch dataset backed by an Avala JSON export."""
def __init__(self, export_path: str, images_dir: str, transform=None):
with open(export_path) as f:
self.annotations = json.load(f)
self.images_dir = Path(images_dir)
self.transform = transform or T.Compose([
T.Resize((224, 224)),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
def __len__(self):
return len(self.annotations)
def __getitem__(self, idx):
ann = self.annotations[idx]
image = Image.open(self.images_dir / ann["file_name"]).convert("RGB")
image = self.transform(image)
# Extract bounding boxes and labels
boxes = []
labels = []
for obj in ann.get("annotations", []):
if obj["type"] == "bounding_box":
c = obj["coordinates"]
boxes.append([c["x"], c["y"], c["x"] + c["width"], c["y"] + c["height"]])
labels.append(obj["label"])
return image, {"boxes": boxes, "labels": labels}
# Usage
dataset = AvalaDataset("export.json", "./images")
loader = DataLoader(dataset, batch_size=8, shuffle=True)
for images, targets in loader:
# Your training loop here
pass