So the way I have my data structured is that I have all my images in a folder with file paths set up as follows (the CSV files contain a small subset of image names and their corresponding class labels, since I wanted to initially start off testing and debugging with a small subset of the data before using the whole thing, which is 100s of thousands of images and slows everything to a crawl when trying to process):
data_folder = Path('C:/Users/ckwij/Downloads/camera_catalogue/all_combined/')
training_data = data_folder / 'training_subset.csv'
validation_data = data_folder / 'validation_subset.csv'
test_data = data_folder / 'test_subset.csv'

The training_data csv is what gets read in by Pandas as labels_frame, and a sample of the data looks as follows:

Lastly, my __getitem__ function looks as follows:
    def __getitem__(self, idx):
        image_name = data_folder / self.labels_frame.iloc[idx, 0]
        image = Image.open(image_name)
        image_label = self.labels_frame.iloc[idx, 1]

        if self.transform:
            image = self.transform(image)

        return image, image_label