Код: Выделить всё
import os
import pandas as pd
from torchvision.io import read_image
class CustomImageDataset(Dataset):
def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
self.img_labels = pd.read_csv(annotations_file)
self.img_dir = img_dir
self.transform = transform
self.target_transform = target_transform
def __len__(self):
return len(self.img_labels)
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
image = read_image(img_path)
label = self.img_labels.iloc[idx, 1]
if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
[*]в __getitem__ мы читаем изображение с диска в память . Это значит, что если мы обучаем нашу модель несколько эпох, мы несколько раз перечитываем одно и то же изображение в память. Насколько мне известно, это дорогостоящее действие.
[*]преобразование применяется каждый раз, когда изображение считывается с диска, и это кажется мне почти избыточным действием.
< /ol>
Я понимаю, что в очень больших наборах данных мы не можем полностью поместить данные в память, и поэтому у нас нет другого выбора, кроме как читать их таким образом (поскольку мы должны перебирать все данные за эпоху) и мне было интересно, в случае, если все мои данные можно поместить в память, не является ли чтение всего этого с диска с помощью функции __init__ лучшим подходом?
Благодаря моему небольшому опыту работы с компьютерным зрением я заметил, что обрезка изображений в изображения фиксированного размера очень часто встречается при преобразовании. Тогда почему бы нам не обрезать изображения один раз и не сохранить их на диске где-нибудь в другом месте, а во время обучения только читать обрезанные изображения? Мне кажется, это более эффективный подход.
Я понимаю, что некоторые преобразования, например те, которые используются для увеличения, а не для нормализации, лучше применять в __getitem__, чтобы иметь случайный результат. сгенерированные данные, а не фиксированные.
Можете ли вы разъяснить мне эту тему?
Если мне не хватает общеизвестной информации, пожалуйста, направьте меня к базам кода с правильный подход.
Подробнее здесь: https://stackoverflow.com/questions/793 ... fficiently
Мобильная версия